1. 说明
本文主要讨论在实施过程中,关于镜像构建,拉取,推送流程中的效率提升和优化
2. 构建
1)如何加速镜像构建?
方法1:减少不必要的上下文
.dockerignore文件添加到上下文目录中,我们可以排除构建不需要的文件
方法2:使用轻量级基础镜像
方法3:更合理的安排,镜像分层的构建顺序
Dockerfile中,首先写不变的分层,然后少改动的分层,最后经常更改的分层,这是为了便于构建时,复用分层cache
方法4:多阶段构建,也是为了复用缓存
方法5:使用好缓存,笔者没试过,看了介绍,这里记录下
https://juejin.cn/post/7298428043624775706
方法6:注意工具使用,buildkit是一个改进的构建器,buildx是docker插件,告诉docker使用buildkit能力。
docker build使用的是原来的构建器
设置变量DOCKER_BUILDKIT=1,或者使用命令docker buildx build,都是告诉docker使用新版本的构建器buildkit去构建。这里很多参数可以调整优化,此处不展开。
2)如何缩小镜像的大小
建议使用docker history命令或者div工具,分析镜像的分层,并优化
方法1:更换使用轻量级基础镜像
方法2:从零构建自己的基础镜像,这里可以考虑,将多层镜像合并成一层,方法有两种,一是docker commit命令,二是docker build 命令中使用--squash参数
方法3:分阶段构建
方法4:避免无用的缓存和文件
以 pip 为例,会将下载的响应和构建的中间文件保存在 ~/.cache/pip 目录,应使用 --no-cache-dir 选项禁用默认的缓存行为。
方法5:清理不必要的文件
例如单行RUN命令,使用完,立刻rm清理文件,典型的,源码编译完成,直接删了源码文件夹。
3. 拉取镜像
1)使用国内镜像仓库加速通用开源的镜像拉取,无需多言,懂得都懂
2)本地仓库,一般网络不差,局域网内,也不需要考虑镜像拉取太慢的问题
3)全球仓库,算了,笔者没碰上,可以想到必须有本地仓库与全球仓库建立上下级关系,拉取镜像
4)生产镜像,基础镜像不要频繁变动,因为基础镜像不变的话,本地已有基础镜像,每次实际只拉取发生变动的镜像分层,是可以加快镜像拉取速度的。
4. 推送镜像
1)docker push命令直接推送镜像
无需多言,基本上镜像分层的概念,已推送的分层,是可以不推送的,这加快了镜像上传镜像仓库的时间效率
2)使用tar包前台推送镜像,业界很多系统,不允许你直接docker push到镜像仓库,反而让你前台上传镜像tar包方式推送镜像,这时候镜像tar包的大小决定你的工作效率。
导出的镜像tar包,有两种压缩大小的优化思路:
思路1:构建镜像的时候,使用轻量级基础镜像,分阶段构建,单行RUN命令等方式,压缩镜像大小
思路2:导出镜像增量变动部分,但因为前台上传镜像tar包,该方案可能无效,要现场尝试
参考如下资料docker 如何导出某个镜像增量部分
思路3:Spring Boot的分层打包方案