一、背景和原因
docker容器就是以便于移植和部署著称。那么在docker使用过程中,少不了对容器进行反复的的打包和部署。为了追求容器完整性,往往使用docker commit 容器ID 新镜像名:tag 来操作,再使用save/load对其进行打包/部署镜像。但是根据上面的命令操作往往发现,即使很小的容器经过上述步骤操作几次后得到的镜像仍旧会变得很大很大(即使容器内的文件都被删掉了)。
这主要是由于docker镜像的构建方式是以层的概念来实现的,在容器内所做的所有操作都会在构建镜像时运行一遍,每一个操作所涉及到的内存空间, 都会成为镜像文件的一部分。
看到的大都是压缩容器根目录制作基础镜像或者操作Dockerfile之类的,相对就比较复杂,或者不是我们想要的答案。以下参考文章中的方法1给出比较详细好用的解决方法步骤。
二、解决方法
为了减少镜像文件所占内容空间,采用export直接打包容器,然后通过import导入镜像,继而展开成容器。
1、可采用export命令打包容器生成镜像文件
docker export -o name.tar 容器ID
或者docker export 容器ID > name.tar
注:此时必须记下当前容器的COMMAND内容,后面要用到。
2、加载成镜像
生成的tar镜像包就可以进行移植和部署,假设换了一台机器后部署该镜像,加载镜像可采用的命令:
docker import name.tar 容器name:tag
3、将镜像展开成容器
如果正常使用的docker run命令时将会出现报错:
docker: Error response from daemon: No command specified.
See 'docker run --help'.
此时就体现第1步中需要记住的COMMAND内容的重要性了。
如果原环境还在,可通过 docker ps --no-trunc 查看你原容器的COMMAND。假设原容器的COMMAND为"bash"。
将原来使用export导出镜像时的容器COMMAND内容追加到要启动容器后面即可:
docker run -itd --restart=always --name xxx xxx:latest "bash"