微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Docker的一次完整使用总结

最近在项目中存在这一个需求,就是对深度学习的一些代码要大规模部署,但是依赖一些环境和显卡驱动,所以考虑将代码和所需要的环境打包成docker镜像来方便部署,经过了一两周的学习和实验以及请教他人,目前我算是基本搞明白了一些,先主要总结一些容易出错的点或者疑惑的点。

1、制作Dockerfile

在制作Dockerfile的过程中,用到了一些指令:

FROM、ENV、copY、ADD、CMD、RUN、EXPOSE

有以下几点注意:

---copY和ADD,copY只是将数据进行一个复制,而ADD除了会进行复制之外,还可以执行一些其他的操作,比如说我们复制了一个.tar.gz的压缩文件,那么ADD会在复制完成之后进行一个解压缩操作,所以后期我们可以直接使用已经解压缩出来的数据。

---CMD,CMD表示的是在使用docker镜像启动一个容器的时候,如果在docker run的时候没有指定执行什么命令,那么就会执行CMD后面的动作。而CMD可以执行两种动作,一种是执行可执行程序,并传递参数:CMD ["exec","params1","params2"],为什么可以这样使用呢,因为docker容器本身也是一个进程,进程在执行的时候是可以传递参数的,所以通过这种方式可以传递参数,不过只能运行可执行程序。如果运行的是脚本,如shell,则不能采用上述方式,用CMD compand1 compand2等。如:CMD cd src && python start.py。但是因为shell命令的上下文只能用在一句命令上,所以如果想一次执行多个命令,需要用 &&来连接即可。

---EXPOSE,EXPOSE只是对外(宿主机)暴露可访问的端口而已,该端口如果要实现能够被其他主机访问,需要在启动docker容器的时候增加-p或-P参数来指定将宿主机上的端口映射到docker容器内部的端口,这样外部的主机就可以访问docker容器内部的端口上的服务了。

-p 宿主机端口:容器端口

---RUN,RUN可以执行一个指令。

需要注意的是,以上每个命令在Dockerfile中存在一次就会给最终的docker镜像增加一层,所以尽量的减少镜像的层数是必要的,有助于减小镜像的大小。如EXPOSE,就应该一个命令后面写多个端口,以及RUN 如果要mkdir则应该使用 && 一个指令创建多个路径

2、制作镜像

制作镜像使用docker build指令

docker build -t "镜像的tag":"镜像的版本号(一般我使用年月日时分来标记)" . 在使用的时候一定要注意最后有个 点,这个点表示的是当前上下文,为什么会有上下文的概念呢?因为实际上docker镜像的制作是由docker daemo进程来制作的,我们平时输入docker命令的是docker的客户端,docker客户端将我们的指令以及上下文的内容传输给docker 的服务端,服务端来给我们制作镜像。这也就是docker build命令执行之后会出现数据传输的现象。

3、根据镜像启动docker容器

根据docker镜像启动docker容器主要使用以下命令,其中需要注意,-v表示使用宿主机上的某个目录来映射容器中的某个目录,这样我们就不需要去容器中查看一些数据了,如日志等,此外,容器中的数据在容器结束之后,就被清理掉了,采用这种方式数据就不会被清理调。那问题就来了,这是为什么呢?我觉得和这些数据存储的路径有关,具体原因需要在查询

4、启动nvidia-docker,启动一个能使用GPU的容器环境

由于代码中使用了caffe等深度学习的框架,需要GPU来运行,所以普通的docker环境是不行的,因为普通的docker环境是泡在cpu上的,所以很多一般的机器是没有GPU环境的。这个问题一开始我并不知道,导致浪费了我很多时间。。。,我们需要在有GPU的机器上,安装三个部分:docker、GPU驱动,一般是Nvidia驱动,nvidia-docker。具体安装过程及原因请参考文章"nvidia-docker的使用",我参考了一位网友的博客实现的。

nvidia-docker的使用

5、编写docker启动脚本

注意点:后台运行docker

只需要在docker run命令中增加 -d参数就可以,如果不加-d 那么docker就会在控制台运行,输出信息到控制台

命令:nvidia-docker run -v /home/xiaoju/logs:/workspace/logs -p 8090:8090 --name "image-face-detection" -d $image

其中 -v:卷挂载,-p端口映射,--name指定容器名,$image 表示在执行这个shell的时候输入的镜像名,-d表示后台运行

另外需要注意一点,如果系统已经开起来了nvidia-docker,那么就可以直接用docker命令就可以,不需要在用nvidia-docker,毕竟还是用docker命令来的爽。如果在dockerfile中没有CMD命令 那么可以使用最经典的用法

docker run -it image_name /bin/bash

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐