一、Docker 镜像优化层面

  • 空间优化:优化 Docker 镜像体积(也称为“镜像瘦身”)
  • 时间优化:优化 Docker 镜像构建速度

二、Docker 镜像优化方式

  1. 选择最精简的基础镜像
  2. 合理规划镜像的层数
  3. 清理镜像构建的中间产物
  4. 优化网络需求
  5. 构建缓存
  6. 使用多阶段构建镜像
  7. 编写 .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 之后,只有 RUNCOPYADD 指令会生成层。

3. 使用多阶段构建镜像

将 Dockerfile 分为 编译环境运行环境,利用多阶段构建技术减少最终镜像的体积,确保只保留运行时所需的内容。