简介
因与同事公用GPU服务器,采用docker来实现环境的相互隔离。这里记录一下。
比如我们有两个人AB要开发同一torch版本下的deeplearning项目,还有两人CD要用同一个tensorflow版本的项目。大家希望彼此的环境,文件,操作等互不影响。
解决方案是,用两个镜像,一个torch一个tf;四个容器,ABCD各一个。
docker中有两个重要概念,镜像(Image)和容器(Container)。镜像就像一个装系统用的光盘,是只读的;容器就像用这个光盘装好的系统(虚拟机),可以修改,对容器的修改不会改变镜像。
操作步骤是:
- 在服务器上安装docker。
- 拉取所需的torch和tf对应版本的镜像。
- 从这两个镜像里分别创建容器,各两个,一共四个。
- ABCD四人工作时,分别进入这四个容器工作。
因为我们服务器上docker已经安装好了,这里就不介绍安装了,直接记录使用笔记。
使用笔记
主要参考的是菜鸟教程。
权限问题
https://blog.csdn.net/u011337602/article/details/104541261
查看本地镜像
docker images
首先需要拉取所需的镜像,比如我们的项目是tf>=1.3的。我就尝试了如下命令:
docker pull tensorflow/tensorflow:1.13.1-gpu-py3。
然而他速度很慢,我就想会不会本地已经有同事pull好了的呢。
随用docker images
命令查看本地镜像
(随便打了下码)
一看有个tf1.14的,这也不够啊,还得自己拉。
拉取镜像(下载到本地)
docker有一个官网,里面有一些镜像。我们可以把它下载到本地。
步骤如下:
去官网看找到要下载的镜像,比如找到tensorflow的docker镜像官网:https://hub.docker.com/r/tensorflow/tensorflow
仔细研读他对tags的说明,因为gpu版的要看显卡驱动,CUDA,CUDNN等。
然后去这个full list of tags里找到自己要的
比如说,我们们是python3.6,tf1.3,gpu版的,在这里输一下
找到一个这个
感觉可以的。
https://www.tensorflow.org/install
新建容器
基础
docker run命令新建容器,最基本的命令格式是:
docker run image_name command
例子:
例子:
docker run tensorflow/tensorflow /bin/bash
这样不指定版本的话默认使用最新版的(updagted)镜像。command 一般我就写/bin/bash。
指定镜像的版本
格式:
docker run image_name:TAG command
例子:
docker run tensorflow/tensorflow:1.13.0-gpu-py3 /bin/bash
这里的image_name就是刚才docker images得到的表格里面,repository这一列的内容,比如我们的tensorflow/tensorflow。 TAG是tag那一列的内容,比如1.13.0-gpu-py3.
端口映射/共享文件夹设置
为了以后远程编辑代码,可以需要做端口映射或设置共享文件夹:
指定端口映射
docker run -p 6009:6006 -p 23:22 -it -d --name qiaoTF tensorflow/tensorflow:1.3.0-gpu-py3 /bin/bash
指定工作路径映射(-v 宿主机目录:容器目录)
docker run -it -v /home/yuqiao/tfDocker:/home/yuqiao -w /home/yuqiao -d --name qiaoTF tensorflow/tensorflow:1.3.0-gpu-py3 /bin/bash
一些参数解释:
- -i是interaction,交互
- -t是terminal,分配一个伪终端
- -d是后台运行
- –name是指定容器的名称(这里显示的有点奇怪,应该是两个短横线)
- -w是指定容器的工作路径(working directory),一进入容器就会进到该路径
- -p是指定端口映射,容器端口:宿主端口
- -v是指定工作路径映射(-v 宿主机目录:容器目录)
进入容器
通过
docker ps -a 查看这个容器的id。
然后
docker exec -it containerID /bin/bash
删除容器
如果这个容器不用了就把它删了:
通过
docker ps -a 查看这个容器的id。
然后
docker rm -f containerID
保存和重载镜像
保存:commit 和 export 二选一
重载:commit的可以直接run,export的需要import
docker commit dockerid
qiao_rfd_conda_commit # 可回滚,最后的参数是镜像的名字,可以直接run它,不需要import
docker export -o /qiaodisk/qiaoRfdConda.tar dockerid # 完全clean的新镜像,需要import之后才能run # 7.6G
scp -P 22 qiaoRfDConda_old.tar yuqiao@XXX.XX.XX.XX:/home/yuqiao/ # 移动到另一台设备
docker import /qiaodisk/qiaoRfdConda.tar qiao_rfd_conda2:xxx
#docker run --privileged -it -p 50003:22 -v /qiaodisk/tfDocker:/home/yuqiao -w /home/yuqiao -d --name qiao_conda qiaorfd /bin/bash
#docker run --privileged -p 10108:6006 -p 10109:22 -it -d -v /qiaodisk/tfDocker:/home/yuqiao -w /home/yuqiao -e DISPLAY=:10.0 -e GDK_SCALE -e GDK_DPI_SCALE --name qiao_rfd_conda qiao_rfd_conda /bin/bash
docker run --privileged --gpus all --shm-size 8G -p XXXXX:6006 -p XXXXX:22 -it -d -v ~/docker_home:/home/yuqiao -w /home/yuqiao --name qiao_rfd_conda qiao_rfd_conda /bin/bash #dockerid
# 如果报错: docker: Error response from daemon: No command specified.
# 用下面这个命令查看command:
docker ps --no-trunc
# 然后把查看到的command放到docker run的最后(代替/bin/bash)
docker exec -it dockerid /bin/bash
passwd
service ssh status
service ssh start