Docker镜像越大存储管理成本越大,大量的Docker Images 会浪费很多磁盘存储另外传输也不方便。

一般情况下我们是编写Dockerfile生成镜像。Dockerfile 就像git 一样,每执行一条命令就会对应生成一层。即使后一条命令删除了前一条命令执行的结果,最终构建出的镜像依然会包两层的大小。例如:

上面的这几条命令半会产生3个层,虽然我们在倒数第二条命令时删除了clib.tar 但最终的镜像大小仍然包含了clib.tar 的大小。

另外根据官方文档介绍,在我们使用docker build 命令构建镜像时,如果发现我们已有的镜像中已经包含了某一层可以复用,那么构建引擎将直接使用这一层。从而使多个镜像共享通用层来降低存储。

对于Docker的层来说,虽然官方限制了最多只能127层。但在笔者使用和测试中发现,对于同样的镜像内容如果我们在写Dockerfile时能够将多行命令整合成一行,那么也将有效的减少镜像的大小。

总结如下:

优化点一: 减少层个数,多行命令整合成一行并删除安装过程中产生的临时文件

 

优化点二:  删除镜像中无用的文件,如软件的文档,demo示例 (尽量写成这样)

优化点三:让Dockerfile 尽量短,不同的软件最好分到不同的镜像中,减少构建镜像的时间和复用层。(这一点根据业务需要和你想做的优化目标做权衡)如:可以将C++ 基础库做为一个镜像,Python 支持从C++库派生成一个新镜像。

优化点四:分发镜像或传输镜像时,可以考虑按层分发。如果觉得太麻烦可以使用docker-squash 工具进行压缩后再传输。

 

总结:笔者建议在优化镜像时还是要根据自己的业务点和期望优化的目标进行抉择。