docker 镜像体积优化

先直接下结论:比起拉取官方镜像,自己安装依赖会更加节约体积。

这句话可能有点难理解。下面就举个例子来说明好了。

先看一组数据

mark

其中 my-nginx 是我自己用 alpine 安装 nginx 后生成的版本。

可以看到,虽然 nginx 官方提供的版本已经很小了,但我们自己安装一遍会更加小。

【如果要找个原因的话应该是官方镜像中还包括了源码,而生产环境并不需要这些】

【不过需要注意自行安装时 nginx 没有配置好文件,需要处理下】

另外一个例子就是 redis,可以看到体积缩小了三分之二,而且功能不变。

mark

所以说如果觉得某个依赖的体积实在太大的话,不妨自己基于 alpine 打包一个最小化版本的。

不过,对于部分依赖,如 MySQL 和 Mongdb 之类的数据库依赖,可能还是难以缩小体积,这时用官方镜像倒也无所谓了。

最后看个更加惊人的例子

mark

同样是 nodejs 环境,但不同的镜像却有着非常大的体积差异,为了优化镜像体积,建议还是用 alpine 镜像从 0 开始 自己安装 nodejs 环境比较好。

如果是 golang 的项目,则可以更加暴力,连操作系统都可以不要了,使用scratch这个空白镜像,直接扔进去一个可执行文件就完事了。

除了选择现有镜像为基础镜像外,Docker 还存在一个特殊的镜像,名为 scratch。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。

如果你以 scratch 为基础镜像的话,意味着你不以任何镜像为基础,接下来所写的指令将作为镜像第一层开始存在。

使用 Go 语言 开发的应用很多会使用这种方式来制作镜像,这也是为什么有人认为 Go 是特别适合容器微服务架构的语言的原因之一。


评论

发表回复