最近参加江苏省华录杯比赛,复赛要以docker提交结果,由于是第一次参加这种检测比赛,而且对docker很不熟悉,所以花费了很大的功夫,因此写下自己的踩坑之路,希望对大家有所帮助。
首先简单的介绍下什么是docker,这里我主要说比赛中用的的部分,docker的images和containers,对于我这种只是比赛用一用docker的人来说,我觉得这是docker的核心。
images: 就是大家说的docker镜像,也可以叫做镜像。
containers: 就是容器
每当你创建一个image时相当于你只是初始化了一下,每当你运行时就会创建一个容器,容器相当于实例,感觉还是有点晦涩,所以还是以实际为例子把。
docker构建方法
1、直接pull到本地,也就是拉取到本地。我们可以在dockerhub或者阿里云或者华为云上面拉取别人开原的镜像(别人博客说阿里云华为云速度会快点,但是实际用的时候感觉速度和dockerhub差不多,可能是我姿势不对?另外说一下,dockerhub的公开镜像更多,阿里云感觉好少,所以还是建议用dockerhub),然后通过构建dockerfile来构建镜像
2、直接通过dockerfile构建
2种方法其实差别不大,最后的效果是一样的
构建流程(拉取dockerhub的镜像)
下面我以第一种方法说明,这个镜像也不知道是什么问题,在编译mmdet的时候总是提示我no cuda runtime is found,所以这个教程大家就当做教训,看看热闹,在下面我会介绍另一种方法构建流程,按照mmdet仓库dockerfile去构建,所以这个如果不想看可以直接忽略看下面的一个(这里不再介绍如何安装docker,另外如果要用gpu要安装nvidia-docker)
拉取镜像
首先,登录到dockerhub,然后搜索你想要的基础镜像,例如我想要mmdet,cuda版本为10.1,包含cudnn
然后终端输入:docker pull vistart/mmdetection,速度大概500kb吧,比较慢,慢慢等待就行。
构建dockerfile
上面是我的dockerfile和我的项目文件夹,project是我的总代码,依次输入你想要的依赖,这样dockerfile就构建好了。
构建镜像
终端输入:sudo nvidia-docker build -t your_image_name .
(注意有个点,而且是nvidia-docker)
ok,构建结束。
构建流程(拉取mmdet仓库的镜像)
构建dockerfile
首先看下mmdet仓库dockerfile文件:
然后看下我的dockerfile文件:
大家可以根据自己的pytorch版本,cuda版本,cudnn版本改dockerfile,我在这个里面在第八行又加了一行,因为在运行时的发现提示了错误,需要这个包。
关于镜像的一些基本操作
docker start 容器 启动一个已经停止的容器
docker run --gpus all -td --name=ztd vistart/mmdetection:latest bash #进入某个镜像,并产生一个容器
docker exec -it f5b1bb0c54e7e598ad09cc1c2f0dd2384a82ce0f0a8801865b76412696508875 bas #进入容器,f5b1bb0c5为上一步产生的容器
#进入容器后可以像在ubuntu下一样使用终端命令,去下载包,改文件,紧接着
exit #退出容器
docker commit e0246673cba9 mmdet_test16_change #提交容器,将其转为镜像,e0246673cba9为容器id,mmdet_test16_change为新镜像名字
sudo nvidia-docker run -v /home/zhaotongdong/docker_test10/project/code/data/test:/data/test/ mmdet_test16_change #运行容器,并挂载数据。
docker cp mycontainer:/opt/testnew/file.txt /opt/test/ #从容器拷贝文件到宿主机
docker cp /opt/test/file.txt mycontainer:/opt/testnew/ #从宿主机拷贝文件到容器
docker commit 容器 镜像名 #保存修改后的容器
docker save -o 要保存的文件名 要保存的镜像 #导出镜像,注意文件名必须是.tar格式
sudo nvidia-docker run -v /home/zhaotongdong/docker_test4/project/code/data/test:/data/test mmdet_18 ##挂载数据