In questo tutorial impareremo cos'è Container-diff, come installare Container-diff in varie distribuzioni Linux e infine come analizzare e confrontare le immagini del container usando Container-diff.
Introduzione
Ho una buona notizia per coloro che stanno creando applicazioni su container.
Immagina questo scenario. Sei uno sviluppatore di software. Stai lavorando su un'applicazione, su un'immagine del contenitore di runtime gestita da qualcun altro.
Nel bel mezzo dello sviluppo, il creatore originale dell'immagine del contenitore rilascia una nuova versione dell'immagine di base con pacchetti di sistema aggiornati.
Scarica l'immagine di base aggiornata e continua a ricostruire l'applicazione su di essa. Improvvisamente, la tua applicazione ha smesso di funzionare.
L'hai fatto funzionare correttamente nell'immagine precedente, ma la tua applicazione non ha funzionato nell'ultima immagine di base.
Sei anche abbastanza sicuro che l'applicazione abbia funzionato bene sulla versione precedente dei pacchetti di sistema nell'immagine di base, ma non hai idea di quale. Qui è dove "Differenza contenitore" viene in aiuto.
Cos'è Container-diff?
Container-diff è uno strumento open source di Google che ti aiuta ad analizzare e confrontare le immagini dei container ospitate nella piattaforma cloud di Google .
Container-diff, viene utilizzato per tracciare facilmente quali modifiche sono state apportate tra le due immagini di base, in modo da poter comprendere meglio ciò che è realmente cambiato all'interno delle immagini.
Ciò ti farà risparmiare un sacco di tempo per trovare l'incompatibilità della versione del pacchetto e potrai decidere se ricostruire l'applicazione sull'ultima immagine del contenitore o semplicemente restare con la vecchia versione finché non trovi una soluzione adeguata.
Ti aiuta anche a esaminare facilmente se la tua applicazione funzionerà o meno sulle nuove build di un'immagine contenitore.
Container-diff analizza quanto segue nelle immagini del contenitore.
- Cronologia immagini Docker,
- Sistema di file immagine,
- Dimensioni immagine,
- Pacchetti adatti,
- Pacchetti RPM,
- pacchetti di pip,
- pacchetti npm.
Ora, vediamo come installare Container-diff e come utilizzarlo per confrontare le immagini del contenitore.
Installa Container-diff in Linux
Ho testato Container-diff su un sistema Ubuntu. Tuttavia, dovrebbe funzionare su Debian e altre varianti di Ubuntu e anche su altre distribuzioni Linux.
Innanzitutto, assicurati di aver installato Docker. Se non l'hai già installato, fai riferimento al seguente link.
- Come installare Docker in Ubuntu
Una volta installato Docker, installa Container-diff sul tuo sistema Linux utilizzando i seguenti comandi:
$ curl -LO https://storage.googleapis.com/container-diff/latest/container-diff-linux-amd64
$ sudo install container-diff-linux-amd64 /usr/local/bin/container-diff
Oppure, se non vuoi usare sudo, esegui:
$ 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
Se sei su Arch Linux, puoi installare Container-diff usando il seguente comando:
$ sudo pacman -S container-diff
Analizza le immagini del contenitore
Innanzitutto, analizziamo un'immagine contenitore, ad esempio Debian 9, che è archiviata in Google Container Registry .
$ container-diff analyze gcr.io/google-appengine/debian9:latest
Risultato di esempio:
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
Come puoi vedere, Container-diff mostra l'analisi APT senza --type
flag specificato.
L'elenco degli analizzatori disponibili è;
- --type=history [Cronologia]
- --type=file [File system]
- --type=pip [Pip]
- --type=apt [Apt]
- --type=nodo [Nodo]
Puoi eseguire più analizzatori contemporaneamente come di seguito.
$ container-diff analyze gcr.io/google-appengine/debian9:latest --type=history --type=apt --type=file
Confronta le immagini del contenitore utilizzando Container-diff
Per confrontare due immagini di Contenitori, usa il seguente comando:
$ container-diff diff gcr.io/google-appengine/debian9:latest gcr.io/google-appengine/debian9:2017-10-18-191738
Qui sto confrontando due immagini di container, l'ultima immagine di build di Debian 9 e un'immagine di Debian 9 creata il 18, 10, 2017.
Risultato di esempio:
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
Come puoi vedere nell'output, sono stati aggiornati tre pacchetti nell'ultima build.
Se non ci sono differenze tra le due immagini, vedrai un output simile a quello di seguito.
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
Come ho già detto, per impostazione predefinita, senza --type
flag specificato, container-diff eseguirà l'analisi del pacchetto Apt.
Possiamo eseguire più analizzatori contemporaneamente come mostrato di seguito.
$ container-diff diff gcr.io/google-appengine/debian9:latest gcr.io/google-appengine/debian9:2017-10-18-191738 --type=history --type=apt --type=node
Qui sto eseguendo tre analizzatori, vale a dire storia , adeguato e nodo .
Risultato di esempio:
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
Puoi anche confrontare l'immagine memorizzata localmente con l'immagine remota come mostrato di seguito.
$ container-diff diff daemon://modified_debian:latest remote://gcr.io/google-appengine/debian9:latest
Per maggiori dettagli, fare riferimento ai link ufficiali Container-differenz forniti di seguito.