概述
在我的深度学习开发相关工作中,使用docker非常多。有cpu版本的docker也有GPU版本的docker。我可以把很多依赖的软件打包到docker里交给现场运行,这样现场就免去了繁杂的环境配置过程。
在此记录一下常用的docker命令。
搜索和下载镜像
去年阿里有一个可以搜索docker镜像的网站,今年则访问不了了。所以现在只能在https://hub.docker.com查询相关镜像。
其实在命令行里也可以搜索相关docker镜像,比如搜索tensorflow相关的镜像:
$ docker search tensorflow
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tensorflow/tensorflow Official Docker images for the machine lea... 1429
jupyter/tensorflow-notebook Jupyter Notebook Scientific Python Stack w... 145
tensorflow/serving Official images for TensorFlow Serving (ht... 58
xblaster/tensorflow-jupyter Dockerized Jupyter with tensorflow 52 [OK]
rocm/tensorflow Tensorflow with ROCm backend support 22
floydhub/tensorflow tensorflow 18 [OK]
bitnami/tensorflow-serving Bitnami Docker Image for TensorFlow Serving 13 [OK]
比如我觉得第一个镜像不错,然后就可以拉到本地来:
docker pull tensorflow/tensorflow:TAG
注意把上面的TAG换成需要的版本号,如果没有冒号和冒号后面的内容,默认拉取tag为latest的版本,也就是最新版本。
查看镜像和容器
镜像和容器的关系就像程序和进程的关系,一个表示磁盘上的实例,一个表示内存中的实例。
查看docker镜像:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ub1604_py3_opencv_dlib_tf1.7_flask 20190425 7735ef5663e3 6 weeks ago 1.58GB
py3_cpu 0424 dd33f7482bb9 6 weeks ago 1.79GB
tf1.7_cuda9_zj20190404 latest 2db530c66dd3 2 months ago 6.46GB
查看容器:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d88abf4e8181 registry.cn-hangzhou.aliyuncs.com/denverdino/tensorflow:1.6.0-gpu-py3 "/bin/bash" 4 hours ago Up 4 hours face_seg_cy
7b969c58646d py3_cpu:0424 "/app/bin/start.sh" 8 days ago Up 4 hours 0.0.0.0:38240->8240/tcp py3_cpu_tdxbqs_bridge
21c385b452af ub1604_py3_opencv_dlib:20180508 "/bin/bash" 3 weeks ago Up 4 hours adress_matching
e1a41db18177 registry.cn-hangzhou.aliyuncs.com/denverdino/tensorflow:1.6.0-gpu-py3 "/run_jupyter.sh -..." 2 months ago Up 3 hours face_tf1.6_yll
有时停电了,所有的容器都停了,其实这些容器还可以恢复的,可以用“docker ps -a”查看被停止的容器,然后用“docker start NAME”的方式重启。
删除容器和删除镜像
删除分两步,先停止,然后删除(停止后还可以用start重新起来的,就是一个暂停的意思)
# docker stop NAME
# docker rm NAME
删除镜像一步就行:
docker rmi IMG_NAME:TAG
打包和载入
比如我在家里的基础容器内安装了需要的环境,为了交给现场,我需要打包成的镜像:
docker commit 容器名称 NEW_NAME:NEW_TAG
上一步把容器变成了镜像,接着需要把镜像变成一个单独的文件包:
docker save NEW_NAME:NEW_TAG > NAME.tar
上面的NEW_NAME和NEW_TAG、NAME需要自己指定的。
现在我把NAME.tar交给现场部署的人员,他需要把tar包载入到docker程序中:
docker load < NAME.tar
然后用“docker images”就可以看到载入的镜像了。这个方法载入的镜像和“docker pull”下载的镜像是等价的。
启动一个容器
前面唠了那么久,还没开始启动一个容器。启动容器的前提是有镜像,怎么下载和载入镜像前面也都说了。
启动一个容器:
docker run --net=host -dit -v /home/yuanlulu/share4docker:/home/user --name yll_test IMG_NAME:IMG_TAG
上述命令把主机目录/home/yuanlulu/share4docker挂载到容器的/home/user目录下,容器名字为yll_test,启动这个容器的镜像在最后面指定。如果启动的是GPU版本的镜像,需要用nvidia-docker而不是docker。
实际上docker可以对容器的cpu、内存及网络等资源做出配置,可以非常灵活配置各种资源。我就不一一讲了。
启动容器后就可以进入容器内进行各种骚操作了:
docker exec -it yll_test bash
这样就好进入容器的命令行,退出用exit命令。
总结
上面就是我个人常用的命令。真的感觉非常方便。