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 包差异node
、pip
:Node.js 和 Python 依赖差异
4. 总结
dive
适合用于查看镜像层级结构、文件分布、优化建议container-diff
适合用于对比多个镜像之间的差异,如文件系统、包、历史等
✅ 推荐在构建、调试、优化镜像时结合使用这两个工具
❌ 不建议直接用于生产环境
⚠️ 注意:使用 Docker 模式运行 dive
时需映射 /var/run/docker.sock
权限
通过掌握这些工具,你可以更高效地分析和优化容器镜像,提升部署效率与安全性。