En este tutorial, aprenderemos qué es Container-diff, cómo instalar Container-diff en varias distribuciones de Linux y, finalmente, cómo analizar y comparar imágenes de contenedores usando Container-diff.
Introducción
Tengo buenas noticias para aquellos que están creando aplicaciones en contenedores.
Imagina este escenario. Eres un desarrollador de software. Está trabajando en una aplicación, en una imagen de contenedor de tiempo de ejecución que mantiene otra persona.
En medio del desarrollo, el creador original de la imagen del contenedor lanza una nueva versión de esa imagen base con paquetes de sistema actualizados.
Descarga la imagen base actualizada y continúa reconstruyendo su aplicación en ella. De repente, su aplicación dejó de funcionar.
Ha logrado que funcione con éxito en la imagen anterior, pero su aplicación no funcionó en la imagen base más reciente.
También está bastante seguro de que la aplicación funcionó bien en la versión anterior de los paquetes del sistema en la imagen base, pero no tiene idea de cuál. Aquí es donde "Container-diff" viene en ayuda.
¿Qué es Container-diff?
Container-diff es una herramienta de código abierto de Google que te ayuda a analizar y comparar imágenes de contenedores alojadas en la plataforma en la nube de Google .
Container-diff, se usa para rastrear fácilmente qué cambios se han realizado entre las dos imágenes base, para que pueda comprender mejor qué ha cambiado realmente dentro de las imágenes.
Esto le ahorrará mucho tiempo para encontrar la incompatibilidad de la versión del paquete, y puede decidir si reconstruir la aplicación en la última imagen del contenedor o simplemente quedarse con la versión anterior hasta que encuentre una solución adecuada.
También le ayuda a examinar fácilmente si su aplicación funcionará o no en las nuevas compilaciones de una imagen de contenedor.
Container-diff analiza lo siguiente en imágenes de contenedores.
- Historial de imágenes de Docker,
- Sistema de archivos de imagen,
- Tamaño de imagen,
- Paquetes aptos,
- Paquetes de rpm,
- paquetes de pips,
- paquetes npm.
Ahora, veamos cómo instalar Container-diff y cómo usarlo para comparar imágenes de contenedores.
Instalar Container-diff en Linux
Probé Container-diff en un sistema Ubuntu. Sin embargo, debería funcionar en Debian y otras variantes de Ubuntu y también en otras distribuciones de Linux.
Primero, asegúrese de haber instalado Docker. Si aún no lo ha instalado, consulte el siguiente enlace.
- Cómo instalar Docker en Ubuntu
Una vez que Docker esté instalado, instale Container-diff en su sistema Linux usando los siguientes comandos:
$ curl -LO https://storage.googleapis.com/container-diff/latest/container-diff-linux-amd64
$ sudo install container-diff-linux-amd64 /usr/local/bin/container-diff
O, si no desea utilizar sudo, ejecute:
$ 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
Si está en Arch Linux, puede instalar Container-diff usando el siguiente comando:
$ sudo pacman -S container-diff
Analizar imágenes de contenedores
Primero, analicemos una imagen de contenedor, por ejemplo Debian 9, que se almacena en Google Container Registry. .
$ container-diff analyze gcr.io/google-appengine/debian9:latest
Salida de muestra:
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
Como puede ver, Container-diff muestra el análisis APT sin --type
bandera especificada.
La lista de analizadores disponibles son;
- --type=historia [Historia]
- --type=file [Sistema de archivos]
- --type=pip [Pip]
- --type=apto [Apto]
- --type=nodo [Nodo]
Puede ejecutar varios analizadores a la vez como se muestra a continuación.
$ container-diff analyze gcr.io/google-appengine/debian9:latest --type=history --type=apt --type=file
Compara imágenes de contenedores usando Container-diff
Para comparar dos imágenes de contenedores, use el siguiente comando:
$ container-diff diff gcr.io/google-appengine/debian9:latest gcr.io/google-appengine/debian9:2017-10-18-191738
Aquí, estoy comparando dos imágenes de contenedor, la última imagen de compilación de Debian 9 y una imagen de Debian 9 compilada el 10 de octubre de 2017.
Salida de muestra:
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
Como puede ver en el resultado, hay tres paquetes que se han actualizado en la última compilación.
Si no hay diferencias entre las dos imágenes, verá una salida similar a la siguiente.
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
Como ya dije, por defecto, sin --type
marca especificada, container-diff ejecutará el análisis del paquete Apt.
Podemos ejecutar múltiples analizadores a la vez como se muestra a continuación.
$ container-diff diff gcr.io/google-appengine/debian9:latest gcr.io/google-appengine/debian9:2017-10-18-191738 --type=history --type=apt --type=node
Aquí, estoy ejecutando tres analizadores, a saber, historial , apto y nodo .
Salida de muestra:
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
También puede comparar la imagen almacenada localmente con la imagen remota como se muestra a continuación.
$ container-diff diff daemon://modified_debian:latest remote://gcr.io/google-appengine/debian9:latest
Para obtener más detalles, consulte los enlaces oficiales de Container-diff que figuran a continuación.