1. Docker 镜像结构解析

容器本质上是操作系统中隔离出的一个独立运行环境,而 Docker 将其封装成一个可管理的单元,即 Docker 镜像。它包含运行应用所需的所有静态文件和依赖。

Docker 镜像的结构由三部分组成:

  • manifest(JSON):高层清单,指向更具体的清单,描述镜像和每一层
  • configuration(JSON):元数据、根文件系统差异、镜像构建历史
  • layer set:实际数据内容

每一层通常是只读的,通过叠加的方式构建最终的镜像。例如:

FROM debian:latest
RUN mkdir --parents /home/baeldung/
COPY file /home/baeldung/file
RUN apt-get update
RUN apt-get install -y vim
CMD ["vim", "--version"]

每一行指令都会生成一个新层。合理合并指令可以优化镜像大小和构建速度,例如:

FROM debian:latest
RUN mkdir --parents /home/baeldung/ && \
    apt-get update && \
    apt-get install -y vim
COPY file /home/baeldung/file
CMD ["vim", "--version"]

这样可以减少层数,提升效率。


2. 使用 dive 深入分析镜像

dive 是一个用于分析 Docker 镜像的命令行工具,支持交互式查看每层内容,并提供优化建议。

2.1 安装方式

  • Debian/Ubuntu

    DIVE_VERSION=$(curl -s 'https://api.github.com/repos/wagoodman/dive/releases/latest' | perl -n0we 'print $1 if /"tag_name": "v(.*?)"/;')
    curl -L -o dive.deb "https://github.com/wagoodman/dive/releases/latest/download/dive_${DIVE_VERSION}_linux_amd64.deb"
    sudo dpkg -i dive.deb
    
  • Snap

    sudo snap install dive
    
  • Docker

    alias dive='docker run --rm -t -i -v /var/run/docker.sock:/var/run/docker.sock wagoodman/dive'
    

2.2 基本使用

dive e3cbd207d8e5

进入交互界面后,可以使用以下快捷键:

  • Tab:切换视图
  • Ctrl + F:文件过滤
  • Ctrl + A:显示聚合层变化
  • Ctrl + L:显示当前层变化
  • Space:展开/折叠目录

2.3 非交互输出

导出 JSON 数据:

dive --json output.json e3cbd207d8e5

CI 模式输出摘要:

CI=true dive e3cbd207d8e5

输出示例:

efficiency: 100.0000 %
wastedBytes: 0 bytes
Result: PASS

2.4 自定义镜像分析示例

dive 666d0107200d

分析结果会显示镜像效率得分、潜在浪费空间等信息:

Image efficiency score: 99%
Potential wasted space: 1.9 MB

常见浪费文件包括:

/var/cache/debconf/templates.dat
/var/lib/dpkg/status-old
/var/log/apt/eipp.log.xz

3. 使用 container-diff 对比镜像

container-diff 是 Google 提供的用于比较容器镜像的工具,支持多种对比类型。

3.1 安装

curl -L -o container-diff "https://storage.googleapis.com/container-diff/latest/container-diff-linux-amd64"
chmod +x container-diff
sudo mv container-diff /usr/local/bin/

3.2 对比文件系统差异

container-diff diff --type file daemon://debian:latest daemon://repox:tax

输出示例:

These entries have been added to debian:latest:
FILE
      SIZE
/etc/alternatives/editor
      18B
/etc/alternatives/editor.1.gz
      ...

These entries have been changed:
FILE                    SIZE1    SIZE2
/var/lib/dpkg/status    75K      79.2K
/var/lib/apt/extended_states 5K  5.3K

3.3 分析镜像历史

container-diff analyze --type history daemon://repox:tax

输出示例:

-/bin/sh -c #(nop) ADD file:...
-RUN /bin/sh -c apt-get update
-RUN /bin/sh -c apt-get install -y vim
-COPY file /home/baeldung/file

3.4 支持的对比类型

  • history:构建历史
  • metadata:元数据
  • layer:层级信息
  • file:文件系统
  • size:整体大小
  • apt:APT 包管理差异
  • rpm:RPM 包差异
  • nodepip:Node.js 和 Python 依赖差异

4. 总结

  • dive 适合用于查看镜像层级结构、文件分布、优化建议
  • container-diff 适合用于对比多个镜像之间的差异,如文件系统、包、历史等

✅ 推荐在构建、调试、优化镜像时结合使用这两个工具
❌ 不建议直接用于生产环境
⚠️ 注意:使用 Docker 模式运行 dive 时需映射 /var/run/docker.sock 权限

通过掌握这些工具,你可以更高效地分析和优化容器镜像,提升部署效率与安全性。


原始标题:Guide to dive and container-diff