docker容器技术现在火的一塌糊涂,最近的工作刚好和这部分内容有交集,就动手搞了一下,这里记录下Docker使用的相关流程。
安装Docker
由于我用的是mac,docker是基于linux系统,因此需要下载docker desktop,是一个mac下的app,下载后放入应用程序中就可以运行。
运行起来会后在顶部的状态栏中常驻一个小鲸鱼的小图标,点击这个图标可以进行重启,退出等操作。
这iterm2中输入docker version,能看到docker相关信息就说明docker安装成功了,可以开始你的docker之旅吧。
自定义镜像是由基础镜像和自定义环境构成。这个例子使用的基础镜像是centos,自定义环境使用 tensorflow的模型例子 https://github.com/tensorflow/models
启动一个基础镜像
docker run -it --name centos centos:latest /bin/bash
docker run命令是启动一个docker容器
-it是指交互式模式
—name是定义容器名称
centos:latest是具体的镜像名称及镜像标签,默认会先从本地的docker镜像库,本地镜像库不存在则会从docker hub上寻找
/bin/bash是交互模式运行的命令
运行完这段代码后会下载相关镜像并进入容器内部,运行/bin/bash
使用exit可以退出容器,使用-it交互模型启动的容器,退出后容器会变成退出状态。
使用docker ps可以查看正在运行的容器。由于刚刚的容器已经退出了,所以此时的列表为空。
可以使用docker ps -a查看所有的容器。
可以看到刚才运行的容器也显示出来了,状态是退出。
使用docker images可以显示本地docker仓库中的所有镜像。
由于tensorflow model需要使用juppyter来查看运行效果,因此,还需要在docker容器运行时将jupyter端口映射到外部,此外,通常还需要将宿主机的硬盘挂载到容器中,这样容器释放后数据还是会在宿主机的硬盘上,同时也可以多个docker共享数据。
让我们先删除之前的这个容器。
docker rm <容器ID>
rm后面的参数是对应的容器ID,容器ID是通过docker ps -a获得的。
如果要将相关的镜像也删除则需要使用
docker image rm <镜像ID>
让我们再重启创建一个docker容器,这次需要将jupyter的端口映射出来,同时要讲一个宿主机的目录挂载到docker中。
docker run
-it
--name centos_jupyter
-v /Users/cloga/Documents/models/research/object_detection:/mnt
-p 9999:8888
centos:latest /bin/bash
-v 是磁盘挂载,格式为宿主机的目录:docker目录
-p 是端口映射,格式为宿主机的端口:docker端口
查看一下磁盘挂载是否成功。
mnt目录存在并且内容也是宿主机上的文件。说明磁盘挂载成功了。
配置自定义的环境
要验证端口映射是不是成功需要在docker容器中安装一个jupyter并启动。jupyter notebook的安装可以参考服务器脚本开发效率神器jupyter notebook。
yum install -y bzip2
curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
conda install jupyter
如果你退出了刚刚的docker容器,导致容器退出,不用怕,只需要docker start,重启启动docker即可。
dokcer ps命令可以显示容器相关的信息,包括使用哪个镜像创建,创建时间,启动的时候的命令以及端口映射等。
这种情况下,或者使用docker run -d时docker是在后台运行,此时想要进入容器可以使用如下命令:
docker exec -it <容器名称> /bin/bash
跑tensorflow的物体识别的demo
启动jupyter notebook,记录下token
jupyter notebook --ip=0.0.0.0 --port=8888 --allow-root
在浏览器打开localhost:9999,输入token后
说明jupyter启动成功,并且docker内的8888端口也成功映射到宿主机的9999端口
在后台运行jupyter
nohup jupyter notebook --ip=0.0.0.0 --port=8888 --allow-root&
安装git,并把tensorflow models下载到本地
yum install git
git clone https://github.com/tensorflow/models.git
安装gcc编译器
yum install gcc gcc-c++ kernel-devel
安装相关组件
conda install tensorflow
yum install protobuf-compiler python-lxml
conda install Cython contextlib2 matplotlib
安装coco API
git clone https://github.com/cocodataset/cocoapi.git
cd cocoapi/PythonAPI
make
cp -r pycocotools ~/models/research/
Protobuf编译
cd ~/models/research/
protoc object_detection/protos/*.proto --python_out=.
添加python路径
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
验证一下安装情况
python object_detection/builders/model_builder_test.py
在jupyter中运行/object_detection/object_detection_tutorial.ipynb
能够生成图片就表示环境没有问题。
将容器导出为容器文件
接下来我们需要把这个容器到处为容器文件,首先从容器中退出,回到宿主机,使用如下命令:
docker export -o <需要保存的本地路径>/<镜像文件名>.tar <容器ID>
将容器保存为镜像有两种方式,一种方式是docker commit将容器保存在镜像,再通过docker save将镜像保存为文件,后续可以通过docker load直接加载镜像到docker镜像库;另一种方式是docker export直接将容器文件存储为容器文件,再通过docker import将容器文件导入到docker镜像库。第一种方式会保留镜像的历史记录,相对生成的docker文件会比较大;第二种方式是直接将当前状态保存下来。这里采用第二种方式。
将自定义容器环境导入为docker镜像
docker import <镜像文件名> <自定义镜像名>:<自定义镜像tag >
使用docker images确认一下相关镜像是否已经在本地的docker镜像库中存在。
用自定义镜像创建一个容器
可以看到文件的目录结果与上一个容器是一样的,查看一下history,可以看到之前的历史也都保留下来了,用同样的方法启动jupyter notebook,并重跑object_detection_tutorial,demo还是可以跑通,说明制作的自定义docker镜像可以正常运行,大功告成。