怎样使用 Container-diff 分析和比较容器镜像

在本教程中,我们将学习什么是 Container-diff,怎样在各种 Linux 发行版中安装 Container-diff,最后怎样使用 Container-diff 分析和比较容器镜像。

内容

  1. 介绍
  2. 什么是容器差异?
  3. 在 Linux 中安装 Container-diff
  4. 分析容器镜像
  5. 使用 Container-diff 比较容器镜像

介绍

对于在容器上构建应用程序的人来说,我有一个好消息。

想象一下这个场景。 你是一名软件开发人员。 您正在开发一个应用程序,使用由其他人维护的运行时容器映像。

在开发过程中,容器镜像的原始创建者会发布带有更新系统包的基础镜像的新版本。

您下载更新的基础镜像并继续在其上重建您的应用程序。 突然,您的应用程序停止工作。

您已成功使其在前一个映像中运行,但您的应用程序在最新的基础映像中无法运行。

您还非常确定该应用程序在基础映像中先前版本的系统包上运行良好,但您不知道是哪个版本。 这是哪里 “容器差异” 来帮忙。

什么是容器差异?

Container-diff 是一个开源工具,来自 谷歌 帮助您分析和比较托管在 谷歌云平台.

Container-diff,用于轻松跟踪两个基础映像之间发生的更改,因此您可以更好地了解映像内部的真正更改。

这将为您节省大量时间来查找包版本不兼容,并且您可以决定是在最新的容器映像上重建应用程序还是坚持使用旧版本,直到找到合适的解决方法。

它还可以帮助您轻松检查您的应用程序是否可以在容器映像的新版本上运行。

Container-diff 分析容器镜像中的以下内容。

  • Docker 镜像历史,
  • 图像文件系统,
  • 图片大小,
  • apt包,
  • rpm包,
  • pip 包,
  • npm 包。

现在,让我们看看怎样安装 Container-diff 以及怎样使用它来比较容器镜像。

在 Linux 中安装 Container-diff

我在 Ubuntu 系统上测试了 Container-diff。 但是,它应该适用于 Debian 和其他 Ubuntu 变体以及其他 Linux 发行版。

首先,确保你已经安装了 Docker。 如果您还没有安装它,请参考以下链接。

  • 怎样在 Ubuntu 中安装 Docker

安装 Docker 后,使用以下命令在 Linux 系统上安装 Container-diff:

$ curl -LO https://storage.googleapis.com/container-diff/latest/container-diff-linux-amd64
$ sudo install container-diff-linux-amd64 /usr/local/bin/container-diff

或者,如果您不想使用 sudo, 跑:

$ curl -LO https://storage.googleapis.com/container-diff/latest/container-diff-linux-amd64
$ mkdir -p "$HOME/bin" 
$ export PATH="$PATH:$HOME/bin"
$ install container-diff-linux-amd64 $HOME/bin/container-diff

如果您使用的是 Arch Linux,则可以使用以下命令安装 Container-diff:

$ sudo pacman -S container-diff

分析容器镜像

首先,让我们分析一个容器镜像,对于 example Debian 9,它存储在 谷歌容器注册表.

$ container-diff analyze gcr.io/google-appengine/debian9:latest

示例输出:

Retrieving image gcr.io/google-appengine/debian9:latest from source Cloud Registry
Retrieving analyses

-----Apt-----

Packages found in gcr.io/google-appengine/debian9:latest:
NAME VERSION SIZE
-adduser 3.115 849K
-apt 1.4.8 3.5M
-base-files 9.9 deb9u2 333K
-base-passwd 3.5.43 229K
-bash 4.4-5 5.7M
-bsdutils 1:2.29.2-1 238K
-ca-certificates 20161130 nmu1 468K
-coreutils 8.26-3 14.7M
-dash 0.5.8-2.4 204K
-debconf 1.5.61 558K
-debian-archive-keyring 2017.5 118K
-debianutils 4.8.1.1 213K
-diffutils 1:3.5-3 1.3M
-dpkg 1.18.24 6.6M
-e2fslibs 1.43.4-2 449K
-e2fsprogs 1.43.4-2 3.9M
-findutils 4.6.0 git+20161106-2 1.8M
-gcc-6-base 6.3.0-18 209K
-gpgv 2.1.18-8~deb9u1 721K
-grep 2.27-2 1.1M
-gzip 1.6-5 b1 231K
-hostname 3.18 b1 47K
-init-system-helpers 1.48 131K
-libacl1 2.2.52-3 b1 62K
-libapt-pkg5.0 1.4.8 3M
-libattr1 1:2.4.47-2 b2 42K
-libaudit-common 1:2.6.7-2 30K
-libaudit1 1:2.6.7-2 150K
-libblkid1 2.29.2-1 367K
-libbz2-1.0 1.0.6-8.1 96K
-libc-bin 2.24-11 deb9u1 3.3M
-libc6 2.24-11 deb9u1 10.4M
-libcap-ng0 0.7.7-3 b1 43K
-libcomerr2 1.43.4-2 83K
-libdb5.3 5.3.28-12 deb9u1 1.8M
-libdebconfclient0 0.227 67K
-libfdisk1 2.29.2-1 469K
-libgcc1 1:6.3.0-18 108K
-libgcrypt20 1.7.6-2 deb9u2 1.2M
-libgpg-error0 1.26-2 572K
-liblz4-1 0.0~r131-2 b1 93K
-liblzma5 5.2.2-1.2 b1 339K
-libmount1 2.29.2-1 403K
-libncursesw5 6.0 20161126-1+deb9u1 347K
-libpam-modules 1.1.8-3.6 874K
-libpam-modules-bin 1.1.8-3.6 220K
-libpam-runtime 1.1.8-3.6 1016K
-libpam0g 1.1.8-3.6 229K
-libpcre3 2:8.39-3 668K
-libselinux1 2.6-3 b3 209K
-libsemanage-common 2.6-2 39K
-libsemanage1 2.6-2 291K
-libsepol1 2.6-2 653K
-libsmartcols1 2.29.2-1 257K
-libss2 1.43.4-2 95K
-libssl1.1 1.1.0f-3 deb9u1 3.4M
-libstdc++6 6.3.0-18 2M
-libsystemd0 232-25 deb9u1 652K
-libtinfo5 6.0 20161126-1+deb9u1 478K
-libudev1 232-25 deb9u1 222K
-libustr-1.0-1 1.0.4-6 258K
-libuuid1 2.29.2-1 107K
-login 1:4.4-4.1 2.7M
-lsb-base 9.20161125 49K
-mawk 1.3.3-17 b3 183K
-mount 2.29.2-1 444K
-multiarch-support 2.24-11 deb9u1 220K
-ncurses-base 6.0 20161126-1+deb9u1 340K
-ncurses-bin 6.0 20161126-1+deb9u1 536K
-netbase 5.4 44K
-openssl 1.1.0f-3 deb9u1 1.2M
-passwd 1:4.4-4.1 2.4M
-perl-base 5.24.1-3 deb9u2 7.4M
-sed 4.4-1 799K
-sensible-utils 0.0.9 110K
-sysvinit-utils 2.88dsf-59.9 110K
-tar 1.29b-1.1 2.7M
-tzdata 2017c-0 deb9u1 2.9M
-util-linux 2.29.2-1 3.5M
-zlib1g 1:1.2.8.dfsg-5 156K

如您所见,Container-diff 显示 APT 分析,没有 --type 指定的标志。

可用的分析器列表是;

  • –type=历史 [History]
  • –type=文件 [File System]
  • –type=pip [Pip]
  • –type=apt [Apt]
  • –type=节点 [Node]

您可以一次运行多个分析器,如下所示。

$ container-diff analyze gcr.io/google-appengine/debian9:latest --type=history --type=apt --type=file

使用 Container-diff 比较容器镜像

要比较两个容器映像,请使用以下命令:

$ container-diff diff gcr.io/google-appengine/debian9:latest gcr.io/google-appengine/debian9:2017-10-18-191738

在这里,我比较了两个容器镜像,最新的 Debian 9 构建镜像和 2017 年 18 月 10 日构建的 Debian 9 镜像。

示例输出:

Starting diff on images gcr.io/google-appengine/debian9:latest and gcr.io/google-appengine/debian9:2017-10-18-191738, using differs: [apt]
Retrieving image gcr.io/google-appengine/debian9:2017-10-18-191738 from source Cloud Registry
Retrieving image gcr.io/google-appengine/debian9:latest from source Cloud Registry
Computing diffs

-----Apt-----

Packages found only in gcr.io/google-appengine/debian9:latest: None

Packages found only in gcr.io/google-appengine/debian9:2017-10-18-191738: None

Version differences:
PACKAGE IMAGE1 (gcr.io/google-appengine/debian9:latest) IMAGE2 (gcr.io/google-appengine/debian9:2017-10-18-191738)
-libssl1.1 1.1.0f-3 deb9u1, 3.4M 1.1.0f-3, 3.4M
-openssl 1.1.0f-3 deb9u1, 1.2M 1.1.0f-3, 1.2M
-tzdata 2017c-0 deb9u1, 2.9M 2017b-1, 2.9M

正如您在输出中看到的,在最新版本中更新了三个包。

如果两个图像之间没有差异,您将看到类似下面的输出。

Computing diffs

-----Apt-----

Packages found only in gcr.io/google-appengine/debian9:latest: None

Packages found only in gcr.io/google-appengine/debian9:2017-11-27-220229: None

Version differences: None

就像我已经说过的,默认情况下,没有 --type 指定标志,container-diff 将运行 Apt 包分析。

我们可以一次运行多个分析器,如下所示。

$ container-diff diff gcr.io/google-appengine/debian9:latest gcr.io/google-appengine/debian9:2017-10-18-191738 --type=history --type=apt --type=node

在这里,我正在运行三个分析器 历史, 易于, 和 节点.

示例输出:

Starting diff on images gcr.io/google-appengine/debian9:latest and gcr.io/google-appengine/debian9:2017-10-18-191738, using differs: [history apt node]
Retrieving image gcr.io/google-appengine/debian9:2017-10-18-191738 from source Cloud Registry
Retrieving image gcr.io/google-appengine/debian9:latest from source Cloud Registry
Computing diffs

-----Apt-----

Packages found only in gcr.io/google-appengine/debian9:latest: None

Packages found only in gcr.io/google-appengine/debian9:2017-10-18-191738: None

Version differences:
PACKAGE IMAGE1 (gcr.io/google-appengine/debian9:latest) IMAGE2 (gcr.io/google-appengine/debian9:2017-10-18-191738)
-libssl1.1 1.1.0f-3 deb9u1, 3.4M 1.1.0f-3, 3.4M
-openssl 1.1.0f-3 deb9u1, 1.2M 1.1.0f-3, 1.2M
-tzdata 2017c-0 deb9u1, 2.9M 2017b-1, 2.9M

-----History-----

Docker history lines found only in gcr.io/google-appengine/debian9:latest: None

Docker history lines found only in gcr.io/google-appengine/debian9:2017-10-18-191738: None

-----Node-----

Packages found only in gcr.io/google-appengine/debian9:latest: None

Packages found only in gcr.io/google-appengine/debian9:2017-10-18-191738: None

Version differences: None

您还可以将本地存储的图像与远程图像进行比较,如下所示。

$ container-diff diff daemon://modified_debian:latest remote://gcr.io/google-appengine/debian9:latest

有关更多详细信息,请参阅下面给出的 Container-diff 官方链接。

资源: