先直接下结论:比起拉取官方镜像,自己安装依赖会更加节约体积。
这句话可能有点难理解。下面就举个例子来说明好了。
先看一组数据
其中 my-nginx 是我自己用 alpine 安装 nginx 后生成的版本。
可以看到,虽然 nginx 官方提供的版本已经很小了,但我们自己安装一遍会更加小。
【如果要找个原因的话应该是官方镜像中还包括了源码,而生产环境并不需要这些】
【不过需要注意自行安装时 nginx 没有配置好文件,需要处理下】
另外一个例子就是 redis,可以看到体积缩小了三分之二,而且功能不变。
所以说如果觉得某个依赖的体积实在太大的话,不妨自己基于 alpine 打包一个最小化版本的。
不过,对于部分依赖,如 MySQL 和 Mongdb 之类的数据库依赖,可能还是难以缩小体积,这时用官方镜像倒也无所谓了。
最后看个更加惊人的例子
同样是 nodejs 环境,但不同的镜像却有着非常大的体积差异,为了优化镜像体积,建议还是用 alpine 镜像从 0 开始 自己安装 nodejs 环境比较好。
如果是 golang 的项目,则可以更加暴力,连操作系统都可以不要了,使用scratch
这个空白镜像,直接扔进去一个可执行文件就完事了。
除了选择现有镜像为基础镜像外,Docker 还存在一个特殊的镜像,名为
scratch
。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。如果你以
scratch
为基础镜像的话,意味着你不以任何镜像为基础,接下来所写的指令将作为镜像第一层开始存在。使用 Go 语言 开发的应用很多会使用这种方式来制作镜像,这也是为什么有人认为 Go 是特别适合容器微服务架构的语言的原因之一。
- 本文链接: https://wp.cmyr.ltd/archives/docker-image-volume-optimization
- 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
欢迎关注我的其它发布渠道
发表回复
要发表评论,您必须先登录。