任务驱动:由于参加挑战赛,官方要求使用Docker封装项目,所以不得不学怎么用。
Docker 通关实录:
by Gunhild & ccchennnn
0.一些基础知识与我的理解
镜像是处于静止状态的docker文件,
容器是处于启动状态的docker文件。
我们制作好镜像后,通过docker启动它变为容器,如果我们需要,我们完全可以从一个镜像启动多个容器。
我觉得docker和虚拟机的原理很像,它们都可以避免影响或被影响本机的情况下自行运行。不会受到本机软件环境的影响,只会受到本机硬件的约束。
以上是我浅显的理解,如果大家有什么更正确的看法欢迎在评论区评论。
1.首先是安装Docker
这是Docker官网:link
各个平台的用户都已经可以在这里下载对应平台的Docker应用。安装过程就不细说了,官网上很详细。
我是Linux平台的,接下来的演示会从Ubuntu18.04版本上进行
2.安装好Docker后,检验是否安装成功
安装好软件后,要测试一下基本的功能是否正常。接下来是一些测试
2.1 首先让docker输出它的版本号:docker version
诶,这时候可能部分用户会发现出问题了
怎么我报了一个permission denied的错误。
Tips1:在命令台操作docker时,基本都需要输入sudo,否则会有permission denied的报错
好的,我们继续。这是输入sudo后的正常信息。
这说明客户端和服务端都正常运行着。
2.2 输出当前计算机下的docker镜像目录:docker images
记得加sudo
这里默认会有一个hello-world。也算是每个程序员的初次彩蛋。第一个是我自己做好的项目镜像
2.3 重要的最后一步,检查ip。输入命令:ifconfig
docker拥有自己的虚拟ip地址,注意不要和本机ip冲突了
如果冲突,可以参照这篇文章去修改docker的ip,这是这个作者的解释。
docker启动时默认会创建一个docker0网桥,它在内核层连通了其他的物理或虚拟网卡,相当于将所有容器和其主机都放到同一个网络。但是部署在内网中的IP段存在有此网段的IP时,会导致冲突,
1:使用宿主机的ip也会有是无效的。
2:只要docker启动,便会造成局域网内其它主机访问本机失效,
3:关闭docker后,本机便可访问.
————————————————
版权声明:本文为CSDN博主「mahui_1980」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mahui_1980/article/details/115032655
3.做完前置检查工作,我们可以创建我们项目的镜像了
3.0 首先,明确我们的目标
- 创建一个图像分割项目的docker镜像文件。基于Python及Pytorch框架
- 要让这个docker镜像可以通过共享本地输入输出文件夹,得到图像的分割结果。
3.1 准备docker配置文件:Dockerfile 注意Dockerfile没有后缀名
Dockerfile是制作docker镜像的必备配置文件,创建docker的过程中,会根据这个配置导入环境
Dockerfile放在项目目录下:
这是Dockerfile里面的内容:
接下来我们逐行解读
FROM 就是在docker里建立一个基本的编程语言内核
MAINTAINER 就是创建者的个人信息,这个不会影响docker创建过程
COPY . /workspace 注意!这个COPY后有个 . 代表目录下所有文件。
执行到这里时会复制Dockerfile所在目录下所有文件到Docker的workspace路径下。如图所示
WORKDIR 这就是设置工作路径的意思。可以调用这个目录下的文件
RUN 这一行是运行安装命令,在docker里通过已经在本机上导出的requirements.txt,安装项目所需的py库
怎么在本机导出requirements? 看这篇文章:link
3.2 制作Docker镜像
配置好Dockerfile后,我们开始建立镜像,先cd到项目目录下:
建立名为docker name的镜像:
docker build --tag [docker name] .
例:docker build --tag fzu_312ch .
注意了~这里命令的结尾有一个独立的英文句号,漏掉就会报错
这是建立镜像的过程
安装完成后,我们通过docker images
查看建立好的镜像。这里我的镜像名是fzu312,注意我这里的TAG是latest
如果想要删除镜像,可以通过以下命令:
删除ID为Image ID的镜像:
docker rmi -f [Image ID]
例:docker rmi -f b23d73c135d8
加上-f是强制删除
4.使用镜像->容器
4.1 运行镜像为容器
命令如下:别忘了加上sudo
docker container run --name fzu312 /bin/bash -c "sh /workspace/predict.sh"
后面的/bin/bash -c "sh /workspace/predict.sh"
是运行镜像目录下的指定shell文件,shell文件可以写好一定的工作流程,直接执行项目。
4.2 硬件调用
由于我们跑深度学习的预测部分,需要使用gpu,这里我们要调用gpu.
调用本地GPU:
--gpus "device=0"
调用所有GPU:--gpus=all
4.3 目录共享
docker是一个独立运行的封装环境,我们要想把本机中的文件放入docker,再把输出的文件从docker返回到本机中,则需要用到目录共享机制。docker的目录共享机制如下:
将本地目录挂载到镜像目录上,运行镜像:
--rm -v [本地绝对路径]:[docker绝对路径]
例:--rm -v /home/Documents/docker/input/:/workspace/input/ 挂载共享目录input
4.4 获取镜像内文件
将镜像内的文件复制到本地:
docker cp fzu:/path/filename /path/filename
例:docker cp fzu_312ch:/experiments/Unet_M1/result/ [您的本地目录]
4.5 设置镜像副本
docker tag newtag oldtag
例:docker tag take undertake
4.6 登录dockerhub及云存储
dockerhub是docker官方提供的云存储的docker镜像仓库,这样其他人就可以通过dockerhub下载你的docker镜像文件
登陆docker:需要在dockerhub上拥有账户,这是dockerhub的连接 link
docker login
然后会提示登录输入信息
上传docker镜像
将指定文件上传到docker hub:
docker push HUB_ID/[image name]:latest
例:docker push FFF123/fff:latest 上传指定文件
注意:上传到hub云端,要给镜像名加个hub用户名的前缀,比如张三/小狗
上传中容易遇到408网络超时错误,这时可以通过多试几次或者建立到腾讯的镜像源:百度
4.7 安装包导出
当你觉得云端存储不适合你,你也可以导出镜像文件为一个压缩文件形式供他人使用。
文件导出:
docker save > [image_name].tar.gz [image_name]:latest
其中 > 也可以换为 -o
例如:docker save > fff.tar.gz fff:latest
文件导入:
docker load < [image_name].tar.gz
其中 < 也可以换为 -o
例如:docker load < fff.tar.gz
5.常见报错
5.1 调用GPU时,报错:
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].
这个问题可以通过安装nvidia-container-toolkit来解决
- 1写一个shell文件,如nvidia.sh,写入下面内容:
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey |
sudo apt-key add -
distribution=$(. /etc/os-release;echo I D ID IDVERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list |
sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
- 2运行nvidia.sh添加nvidia-docker的源,否则第三步会报错:
E: Unable to locate package nvidia-container-toolkit
- 3 安装nvidia-container-toolkit:
sudo apt-get install -y nvidia-container-toolkit
- 4 重启docker即可:
sudo systemctl restart docker
若还有其他报错,也会继续更新到这里。