我们知道用 docker inspect命令可以查看一个 docker 镜像的 meta 信息,用 docker history命令可以了解一个镜像的构建历史,但是这些信息对我们去分析一个镜像的具体一层的组成来说还是不太够,不够清晰明了。
  1. $ docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. python 3.6.4 07d72c0beb99 8 months ago 689MB
  4. $ docker inspect python:3.6.4
  5. [
  6. {
  7. ......
  8. "RootFS": {
  9. "Type": "layers",
  10. "Layers": [
  11. "sha256:8fad67424c4e7098f255513e160caa00852bcff347bc9f920a82ddf3f60229de",
  12. "sha256:86985c679800f423275a0ea3ad540e9b7f522dcdcd65ec2b20f407996162f2e0",
  13. "sha256:6e5e20cbf4a7246b94f7acf2a2ceb2c521e95daca334dd1e8ba388fa73443dfe",
  14. "sha256:ff57bdb79ac820da132ad1fdc1e2d250de5985b264dbdf60aa4ce83a05c4da75",
  15. "sha256:6e1b48dc2cccd7c0faf316e5975f1a02f5897723d7fa3b0367b28a20173931d6",
  16. "sha256:325a22db58ea59d76568ded2fac6b783554f8cd5fa8e851c260da4b141c55c6c",
  17. "sha256:a4a7a3673769ce5035e06f56458cab872bb5dc561bebe3571ac62fe2b52f0aaf",
  18. "sha256:c83faac49cbc38f1e458dfffb71b1c87860f56ac34602befefe6005177474ba3"
  19. ]
  20. },
  21. "Metadata": {
  22. "LastTagTime": "0001-01-01T00:00:00Z"
  23. }
  24. }
  25. ]
  26. $ docker history python:3.6.4
  27. IMAGE CREATED CREATED BY SIZE COMMENT
  28. 07d72c0beb99 8 months ago /bin/sh -c #(nop) CMD ["python3"] 0B
  29. <missing> 8 months ago /bin/sh -c set -ex; wget -O get-pip.py 'ht… 6.06MB
  30. <missing> 8 months ago /bin/sh -c #(nop) ENV PYTHON_PIP_VERSION=9.… 0B
  31. <missing> 8 months ago /bin/sh -c cd /usr/local/bin && ln -s idle3… 32B
  32. <missing> 8 months ago /bin/sh -c set -ex && buildDeps=' dpkg-de 62.9MB
  33. <missing> 8 months ago /bin/sh -c #(nop) ENV PYTHON_VERSION=3.6.4 0B
  34. <missing> 8 months ago /bin/sh -c #(nop) ENV GPG_KEY=0D96DF4D4110E… 0B
  35. <missing> 8 months ago /bin/sh -c apt-get update && apt-get install 8.67MB
  36. <missing> 8 months ago /bin/sh -c #(nop) ENV LANG=C.UTF-8 0B
  37. <missing> 8 months ago /bin/sh -c #(nop) ENV PATH=/usr/local/bin:/… 0B
  38. <missing> 8 months ago /bin/sh -c set -ex; apt-get update; apt-ge 320MB
  39. <missing> 8 months ago /bin/sh -c apt-get update && apt-get install 123MB
  40. <missing> 8 months ago /bin/sh -c set -ex; if ! command -v gpg > /… 0B
  41. <missing> 8 months ago /bin/sh -c apt-get update && apt-get install 44.6MB
  42. <missing> 8 months ago /bin/sh -c #(nop) CMD ["bash"] 0B
  43. <missing> 8 months ago /bin/sh -c #(nop) ADD file:bc844c4763367b5f0… 123MB

介绍

接下来我们给大家介绍一个用来分析 docker 镜像层信息的一个工具:dive,地址:https://github.com/wagoodman/dive,该工具主要用于探索 docker 镜像层内容以及发现减小 docker 镜像大小的方法。 要分析一个 docker 镜像,只需要在 dive 工具后面添加上镜像的 tag 即可:
  1. $ dive <镜像TAG>
除此之外,还可以通过 build 命令去构建 docker 镜像后,直接进入分析结果:
  1. $ dive build -t <镜像TAG> .

基本功能

  • 显示每层的 docker 镜像内容:当您在左侧选择一个层时,将在右侧线上显示该层的所有内容,此外,您可以使用箭头按键来浏览整个文件树内容。
  • 指出每层中发生了哪些变化:在文件树中标明已修改、添加或删除的文件,可以调整此值以显示特定层的更改。
  • 估计“镜像效率”:左下方窗格显示基本层信息和一个实验指标,用于猜测图像所包含的空间浪费。这可能是跨层的一些重复文件,跨层移动文件或不完全删除的文件。提供了一个百分比的“得分”和总浪费的文件空间。
  • 快速构建/分析周期:您可以构建 docker 镜像并使用一个命令立即进行分析: dive build-t some-tag.,您只需要将 docker build命令用相同的 dive build命令替换即可。

安装

安装非常简单,我们这里为了方便,直接使用 docker 镜像的方式,其他的安装方法在 dive 文档中查看即可。
  1. $ docker pull wagoodman/dive
镜像 pull 下来后,然后使用该镜像运行一个临时的容器,加上我们需要分析的镜像即可:
  1. $ docker run --rm -it \
  2. -v /var/run/docker.sock:/var/run/docker.sock \
  3. wagoodman/dive:latest <dive arguments...>
比如,我们这里来分析下 python:3.6.4这个镜像:
  1. $ docker run --rm -it \
  2. -v /var/run/docker.sock:/var/run/docker.sock \
  3. wagoodman/dive:latest python:3.6.4
  4. Analyzing Image
  5. Fetching metadata...
  6. Fetching image...
  7. ├─ [layer: 0] 2f1b3001b085f94 : [========================================>] 100 % (465/465)
  8. ├─ [layer: 1] 383de4491c61a96 : [========================================>] 100 % (7/7)
  9. ├─ [layer: 2] 5a18124b107698b : [========================================>] 100 % (1382/1382)
  10. ├─ [layer: 3] 68c6148e6856d76 : [========================================>] 100 % (568/568)
  11. ├─ [layer: 4] 872e2e8e6109ee2 : [========================================>] 100 % (5421/5421)
  12. ├─ [layer: 5] 8aa62fd66ae0210 : [========================================>] 100 % (8252/8252)
  13. ├─ [layer: 6] 93e9cefe47e6b15 : [========================================>] 100 % (11545/11545)
  14. ├─ [layer: 7] f1a4ff99e76e332 : [========================================>] 100 % (1482/1482)
  15. Building tree...
  16. Analyzing layers...

分析完成后,我们就可以进入到一个可操作的界面之中,然后可以使用键盘上的 上下按键去切换镜像的每一层,在左下角会出现这一层的详细信息,有的层就会出现计算出的一些浪费空间的结果,我们就可以根据这个信息去分析如何减少镜像大小,而右侧区域则是显示当前镜像层的内容文件树:💫[Docker] 镜像分析工具 dive 介绍 - 图1