主要分三步,制作镜像并导出,导入镜像,启动flask应用。该教程没有采用Dockerfile的方式,因为是直接将开发用python环境包,拷贝到生产用环境包。但是当笔者用这种方式完成镜像的保存后,发现就一个环境包+不到10个python文件,磁盘占用已达到7~8G的大小。相信开发用的python包中有很多库,是该应用没有涉及到的。如果用Dockerfile的方式,就可以比较精准控制哪些包是必须的,从而放到镜像内。故提醒哪些关注镜像大小的朋友谨慎入坑。
导出镜像
-
查看已有的基础镜像
docker images # 跟docker image ps效果一样
-
从基础镜像运行一个容器,并退出
docker run --name flask-app -it <镜像名> /bin/bash exit
如果想重新进入
docker start <容器ID> docker exec -it <容器ID> /bin/bash exit
-
查看正在运行或已经停止工作的容器列表,获得想要拷贝环境包的容器名
docker ps -a
-
将python环境包拷贝该容器
docker cp miniconda3_withpytorch.zip <容器ID>:/home/
进入容器,在这个比较干净的ubuntu环境中安装unzip
apt-get update apt-get install unzip #还应该安装netstat工具
-
解压python环境包,并删除压缩包,退出
unzip miniconda3_withpytorch.zip rm miniconda3_withpytorch.zip exit
-
将添加了环境包的容器名保存为镜像
docker commit flask-app topo-service:v1
可查看镜像列表
docker images REPOSITORY TAG IMAGE ID CREATED SIZE topo-service v1 2450d3fa63dc 23 seconds ago 5.4GB
仅仅是拷贝了一个2G左右的压缩包后解压,镜像就膨胀到5.4G。
-
将保存的镜像导出到指定目录,确保到处前该镜像已经创建并停止。
docker save -o /home/user/myapp.tar myapp:latest
导入镜像
-
将压缩包.tar考入到目标机器。
-
在命令行中使用
docker load
命令来导入镜像:docker load -i myapp.tar
-
导入完成后,可以使用
docker images
命令查看已导入镜像的列表。
启动
启动容器,并将flask中暴露的端口映射成外部机器暴露的端口
docker run -p 8299:8299 -it topo-service:latest /bin/bash
进入容器内指定目录,启动flask服务
/home/your/path/python servicecase.py
启动工作完成,最后退出容器Ctrl + P + Q,不关闭容器,查看外部端口使用情况
netstat -anp | grep 8099
如果有输出,说明容器内的服务端程序启动成功,且端口正常暴露。
其他常用命令速递
删除容器
要删除已停止的容器,可以使用以下命令:
docker rm <容器ID>
其中,<容器ID>
为要删除的容器的ID。如果要删除多个容器,可以在命令后面添加多个容器ID。
如果要删除所有已经停止的容器,可以使用以下命令:
docker container prune
退出容器
docker exec -it <容器ID> /bin/bash
docker attach <容器ID>
以上两种方式进入容器的方式,使用exit退出,均会导致容器停止。包括run -it从镜像启动的容器。
Ctrl + P + Q退出容器不停止运行