Docker 镜像优化
一、Docker 镜像优化层面
- 空间优化:优化 Docker 镜像体积(也称为“镜像瘦身”)
- 时间优化:优化 Docker 镜像构建速度
二、Docker 镜像优化方式
- 选择最精简的基础镜像
- 合理规划镜像的层数
- 清理镜像构建的中间产物
- 优化网络需求
- 构建缓存
- 使用多阶段构建镜像
- 编写
.dockerignore
文件
分类说明:
- 空间优化(1、3、6)
- 时间优化(4、5、7)
三、时间优化
时间层面的优化方式有三种:网络优化、构建缓存、编写 .dockerignore
文件。
1. 网络优化
优化网络是为了让镜像下载、依赖安装、代码下载等操作更加流畅。常见的优化方式包括:
- 调整构建机器的网络质量
- 配置就近的加速仓库地址
2. 构建缓存
本地缓存
Docker 构建时下载的基础镜像文件会进行缓存。为了减少镜像的传输下载时间,建议使用固定的机器专门进行镜像的构建。
镜像分层缓存
Docker 镜像采用分层存储,构建时每个指令对应镜像的每一层。只要满足以下条件,构建时可以利用缓存:
- 镜像父层没有变化
- 构建指令保持不变
- 文件校验和一致
满足条件时,该层构建将不会重复执行,而是使用之前的构建结果。
3. 编写 .dockerignore
文件
编写 .dockerignore
文件用于过滤不必要的文件,如 .git
文件夹、Markdown 文档等,从而减少目标镜像大小并加快构建速度。
四、空间优化
1. 选择最精简的基础镜像
Docker 仓库提供同一个基础镜像的多个版本,推荐使用 Alpine 镜像,因其经过优化,包含最少的软件包,从而大幅减少镜像体积。
但使用 Alpine 镜像时需注意以下问题:
- 依赖库缺失:Alpine 为了精简,很多动态链接库没有包含,可能会导致程序运行报错。
- 域名解析行为差异:Alpine 使用
musl libc
,与标准glibc
在域名解析行为上有差异。 - 不兼容 Bash 脚本:Alpine 默认不内置 Bash,因此运行 Bash 脚本时会出现兼容性问题。
- 时区不一致问题:Alpine 镜像没有自动设置时区,需手动调整。
2. 合理规划镜像的层数
通过合并指令来减少镜像的层级。每执行一条指令就会生成一个层,较多的层会导致镜像体积增加。Docker 1.10 之后,只有 RUN
、COPY
、ADD
指令会生成层。
3. 使用多阶段构建镜像
将 Dockerfile 分为 编译环境 和 运行环境,利用多阶段构建技术减少最终镜像的体积,确保只保留运行时所需的内容。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Erebus's Blog!
评论