Docker 安装 www.baidu.com 一大坨安装教程,看到你吐血!!!
按照规定的标准输入与输出格式开发算法,将算法封装到Docker镜像内,并将镜像推送到官方仓库中。提交镜像文件具体要求如下:
CUDA版本要求11.0;
构建镜像时指定CMD作为默认执行的命令;
容器内禁止使用网络操作,否则会造成容器卡死,影响算法执行;
数据输入目录为/input_path(容器内目录),目录权限只读,此目录对应数据组织结构中的test目录;
数据输出目录为/output_path(容器内目录),目录权限可写;
算法入口程序为main.py,所在文件夹为/work(容器内目录),main.py需要读取/input_path中的数据,并将结果输出到/output_path;
下面是使用Dockerfile配置环境的示例和main.py示例:
Dockerfile示例:
# 基础镜像, cuda为11.0,ubuntu18.04
FROM cuda:11.0-cudnn8-runtime-ubuntu18.04 ##自行修改
# 配置程序依赖环境
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
cmake \
curl \
ca-certificates \
libjpeg-dev \
libpng-dev \
python3 \
python3-dev \
python3-pip && \
rm -rf /var/lib/apt/lists/*
# 安装torch
RUN pip3 install torch==1.7.1+cu110 torchvision==0.8.2+cu110 torchaudio==0.7.2 -f https://download.pytorch.org/whl/torch_stable.html
RUN pip3 install matplotlib>=3.2.2
RUN pip3 install numpy>=1.18.5
RUN pip3 install scikit-build
RUN pip3 install setuptools>=33.1.1
RUN pip3 install Pillow
RUN pip3 install PyYAML>=5.3.1
RUN pip3 install scipy>=1.4.1
RUN pip3 install torch>=1.7.0
RUN pip3 install tqdm>=4.41.0
RUN pip3 install grpcio
RUN pip3 install tensorboard
RUN pip3 install seaborn>=0.11.0
RUN pip3 install pandas
RUN pip3 install opencv-python>=4.1.2
RUN python3 -m pip install detectron2 -f https://dl.fbaipublicfiles.com/detectron2/wheels/cu110/torch1.7/index.html
# 将程序复制到容器内的/work路径下
COPY . /work
#COPY ./weights/best.pt /work/weights/
# 容器启动命令
CMD ["python3", "-u", "/work/main.py"]
1.main.py示例:
def fun(input_dir, output_dir):
pass
if __name__ == '__main__':
parser = argparse.ArgumentParser()
# 数据集路径
parser.add_argument("--input_dir", default='/input_path', help="input path", type=str)
# 输出路径
parser.add_argument("--output_dir", default='/output_path', help="output path", type=str)
args = parser.parse_args()
start_time = time.time()
torch.backends.cudnn.benchmark = True
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
fun(args.input_dir, args.output_dir)
print('total time:', time.time() - start_time)
2.构建镜像
编写好Dockerfile后,与需要打包的程序放到同一个文件夹下,然后进行以下步骤:
docker build -t docker.image/<image_name>:1.0.0 .
注意最后的.前面有空格.
3.测试:
运行完成后可在/data/output_path/中查看输出结果
docker run -it --rm -v /data/input_path/:/input_path -v /data/output_path/:/output_path docker.image/<image_name>:1.0.0
如果需要进行深度学习算法更换,只需要替换main.py中的fun函数就可以.
4.Docker 中会用到的指令:
- 镜像构建失败,需要删除tag为的镜像:
删除none的镜像,要先删除镜像中的容器。要删除镜像中的容器,必须先停止容器。
$ docker images
$ docker rmi $(docker images | grep "none" | awk '{print $3}')
直接删除带none的镜像,直接报错了。提示先停止容器。
$ docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }') //停止容器
$ docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }') //删除容器
$ docker rmi $(docker images | grep "none" | awk '{print $3}') //删除镜像
- 删除所有镜像:
docker rmi -f $(docker images -qa)
- 容器操作:
查看运行容器
docker ps
查看所有容器
docker ps -a
进入容器
其中字符串为容器ID:
1. docker exec -it d27bd3008ad9 /bin/bash
2. docker attach d27bd3008ad9
1.停用全部运行中的容器:
docker stop $(docker ps -q)
2.删除全部容器:
docker rm $(docker ps -aq)
3.一条命令实现停用并删除容器:
docker stop $(docker ps -q) & docker rm $(docker ps -aq)
- docker系统修剪
docker system prune了以下内容:
所有停止的容器
至少一个容器未使用的所有网络
所有悬空的图像
所有悬空的构建缓存
此清除命令将节省大量硬盘空间。
$ sudo docker system prune
WARNING! This will remove:
1. all stopped containers
2. all networks not used by at least one container
3. all dangling images
4. all dangling build cache
Are you sure you want to continue? [y/N] y
Deleted Containers:
10b3f08a93df89818976a29c26f5ccefbda1e2dc2e0205a02e9a3306590a1455
89d9cb3e102dbadc9d314bea0db5feb3110931727e2da0b88d6d88d7d78f4400
49e429f26db40615557a85fdf758cd66afa208dba03f74aea860bb04bb4772b2
3e36a2c0c241f8b815ddc73f398cae97962a6799c244fd5169cd845023c5b657
...
Deleted Images:
deleted: sha256:fe111236265a30b8ec54390defb5da60cc7b76a0d3ff0e883691b8b3c663f2e9
deleted: sha256:2e591f44cd334c7896ed01660d45099f4f58169d0584163b6009dea56c3abcbe
deleted: sha256:8b1c255bf0e627c789fc35b3b3b0a1e5033f6be612e01dca08eb1aa4fd161364
...
Total reclaimed space: 251.3MB
- docker 从镜像中复制代码到本地
docker cp <containerId>:/file/path/within/container /host/path/target
注意是containerId 不是 image Id .
如果刚拉取的镜像, 先操作:
1. sudo docker run -it your_docker_image:version /bin/bash
2. docker ps -a
如果Version 是**<none>**
,则用tag指令配置tag:
docker tag ec083d1555e4 docker.image/image_name:1.0.15
sudo docker cp -a 427870a03728:/work /home/yourPC/Desktop/1.0.8f/
查看对应镜像的容器ID.继续执行copy操作即可.
- 本地复制到docker image:
建议使用Dockerfile的操作:
有两个类似Dockerfile指令,COPY或着ADD,这两者都用于为包括在文件中的图像
COPY指令和ADD指令的唯一区别在于是否支持从远程URL获取资源。COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中。
满足同等功能的情况下,推荐使用COPY指令。ADD指令更擅长读取本地tar文件并解压缩。
- COPY指令
COPY指令能够将构建命令所在的主机本地的文件或目录,复制到镜像文件系统。
exec格式用法(推荐):
COPY ["<src>",... "<dest>"],推荐,特别适合路径中带有空格的情况
shell格式用法:
COPY <src>... <dest>
- ADD指令
ADD指令不仅能够将构建命令所在的主机本地的文件或目录,而且能够将远程URL所对应的文件或目录,作为资源复制到镜像文件系统。
所以,可以认为ADD是增强版的COPY,支持将远程URL的资源加入到镜像的文件系统。ADD命令能对本地归档文件进行解包而COPY不行。
exec格式用法(推荐):
ADD ["<src>",... "<dest>"],特别适合路径中带有空格的情况
shell格式用法:
ADD <src>... <dest>
将当前路径下所有程序复制到容器内的/work路径下
COPY . /work
-
COPY指令和ADD指令的用法非常相似,具体注意事项如下:
源路径可以有多个
源路径是相对于执行build的相对路径
源路径如果是本地路径,必须是build上下文中的路径
源路径如果是一个目录,则该目录下的所有内容都将被加入到容器,但是该目录本身不会
目标路径必须是绝对路径,或相对于WORKDIR的相对路径
目标路径如果不存在,则会创建相应的完整路径
目标路径如果不是一个文件,则必须使用/结束
路径中可以使用通配符 -
读取URL远程资源
RUN mkdir -p /usr/src/things \
&& curl -SL http://example.com/big.tar.xz \
| tar -xJC /usr/src/things \
&& make -C /usr/src/things all
- 切换GPU docker中 nvidia-smi可查看GPU属性
sudo docker run --gpus all nvidia/cuda:9.0-base nvidia-smi
至此,基本操作基本完成,有用都帮忙点个赞呗,写文档确实很耗时间,谢谢!