Le immagini Docker sono la base dei contenitori Docker. Poiché le immagini sono la base, ti sei mai chiesto come aggiornare i contenitori Docker quando viene rilasciata una nuova versione di un'immagine?
Non meravigliarti più! In questo tutorial imparerai come aggiornare il tuo repository di immagini Docker locale e aggiornare i tuoi contenitori a una nuova versione senza rovinare le cose!
Prerequisiti
Questo tutorial sarà una dimostrazione pratica. Se desideri continuare, assicurati di avere quanto segue:
- Ambiente Linux:il tutorial utilizza Linux (Ubuntu Focal) per eseguire Docker, ma puoi anche applicare gli stessi passaggi generali a Windows o macOS.
- Installa Docker Engine 20.10.8 (Linux) o Docker desktop 3.5.2 (macOS e Windows).
Esecuzione di immagini Docker idempotenti
Un'immagine Docker contiene tutto il software necessario per eseguire l'applicazione ad essa associata, inclusi i pacchetti del sistema operativo e le dipendenze. Docker assembla le immagini tramite istruzioni all'interno di un file chiamato Dockerfile , che contiene istruzioni di installazione idempotenti.
Un'istruzione idempotente implica che l'immagine risultante dall'esecuzione dell'istruzione di installazione risulterà sempre nello stesso output.
Il vantaggio della creazione di immagini idempotenti è che sono indipendenti dal sistema:l'immagine risultante sarà sempre la stessa. Anche l'esecuzione del contenitore sarà sempre la stessa, indipendentemente da dove avvenga l'esecuzione.
Una nuova versione dell'immagine in genere implica alcuni miglioramenti alle istruzioni per la creazione della base del contenitore Docker, ad esempio:
- Una versione più recente del codice sorgente dell'applicazione può sostituire quella precedente;
- Migliore gestione delle dipendenze:meno spazio richiesto o migliori prestazioni;
- Maggiore sicurezza:l'immagine ha patch di sicurezza per evitare vulnerabilità.
Per ottenere gli ultimi vantaggi da qualsiasi aggiornamento nelle immagini Docker, devi sapere come aggiornarle e applicare tali aggiornamenti ai tuoi contenitori.
Aggiornamento delle immagini della Docker locale
Per cominciare, inizia aggiornando un'immagine Docker locale. L'applicazione nell'esempio python
container esegue applicazioni di codice Python. L'aggiornamento dell'immagine Docker locale significa che le applicazioni possono fare affidamento sull'immagine appena aggiornata.
Devi prima sapere quali immagini sono attualmente disponibili nel tuo ambiente locale. Esegui il comando seguente per controllare le tue immagini locali. Il TAG la colonna indica la versione disponibile dell'immagine.
docker images
Ora che hai la tua versione locale dell'immagine, devi trovare l'ultima immagine disponibile su un registro remoto. Esistono più registri Docker remoti (repository di immagini Docker) che il motore Docker interroga per aggiornare le immagini locali. Docker estrae le immagini da DockerHub per impostazione predefinita ma ci sono più alternative, la maggior parte private. Di seguito sono elencati alcuni repository alternativi.
- Galleria pubblica di Amazon Web Service (AWS) ECR
- Sonatipo Nexus
- Porto VM
Naviga attraverso la pagina del repository e cerca l'immagine desiderata:un'immagine Python ufficiale che aggiornerai come esempio. Digita python per trovare l'immagine desiderata in DockerHub e aprirla per trovare i tag disponibili. Gli esempi per questo tutorial sono di un'immagine Python.
Ogni tag ha anche una data push. La data push è la data in cui l'immagine è stata caricata nel registro. Prendi nota del tag dell'immagine e nome , di cui avrai bisogno nei seguenti passaggi.
Ora che hai il tag della versione più recente, è il momento di aggiornare l'immagine. Per eseguire l'aggiornamento a un'immagine più recente, devi prima estrarre la nuova versione. Esegui il docker pull
comando seguito da due punti e il nome e il tag dell'immagine più recente:il nome e il tag di cui hai preso nota in precedenza. Il nome e il tag per l'esempio è python:slim-buster
. Il comando completo e l'output risultante sono mostrati di seguito.
docker pull python:slim-buster
Per estrarre l'immagine dal registro delle immagini Docker non predefinito (DockerHub), è necessario fornire invece l'URI dell'immagine completo. Ad esempio:per estrarre Python da (AWS) ECR Public Gallery, esegui
dockerpull public.ecr.aws/bitnami/python:3.7
Imparare come aggiornare i contenitori Docker
Dopo aver creato un contenitore, l'immagine del contenitore non può essere modificata. Poiché l'immagine non può cambiare, non è possibile aggiornare veramente un contenitore in esecuzione. Quello che devi fare è ricreare tutti i contenitori in esecuzione con contenitori sostitutivi utilizzando la versione dell'immagine più recente.
Dato che hai già la versione più recente, è ora di ricreare i contenitori con le vecchie immagini che devono essere aggiornate.
Per trovare i contenitori che devi ricreare, elenca tutti i contenitori esistenti che eseguono la vecchia immagine. La docker ps
il comando elenca i contenitori. Con il --filter
flag, specifichi quali contenitori elencare. Sono disponibili più opzioni per il filtraggio e l'ancestor
flag filtri in base all'immagine utilizzata come base per costruire il contenitore. I contenitori di partenza negli esempi sono per Python 3.7.2, che applicherai come filtro. Il -a
switch mostra tutti i contenitori disponibili.
docker ps -a --filter "ancestor=python:3.7.2"
Puoi usare l'output di docker ps
come input per eseguire il docker stop
comando su tutti i contenitori elencati. Il flag -q
è incluso, quindi il comando listato restituisce solo gli ID dei contenitori. L'output del comando è l'elenco degli ID dei contenitori fermati.
docker stop $(docker ps -aq --filter "ancestor=python:3.7.2")
Dopo aver arrestato i contenitori, devi chiedere a Docker di eliminarli in modo efficace dal sistema prima di rimuovere l'immagine obsoleta.
docker rm $(docker ps -aq --filter "ancestor=python:3.7.2")
Dopo aver rimosso tutti i contenitori associati all'immagine deprecata, puoi rimuovere la vecchia immagine con il docker rmi
comando.
docker rmi python:3.7.2
Creazione di nuovi contenitori con le immagini di aggiornamento
Ora è il momento di sostituire finalmente i vecchi contenitori, quelli che erano stati precedentemente eliminati, con nuovi contenitori basati sull'immagine aggiornata. Questa volta, creerai i contenitori utilizzando la versione dell'immagine più recente. Poiché i contenitori sono idempotenti, puoi aspettarti che tutto funzioni come prima.
Esegui il nuovo contenitore con docker run
comando e il nome e il tag dell'immagine aggiornata di cui avrà bisogno il contenitore. In questo esempio, il -it
flag indica a Docker di eseguire il contenitore in modalità interattiva, in modo da poter eseguire comandi all'interno del contenitore per verificare eventuali funzionalità aggiornate.
docker run -it python:slim-buster
Si noti che il nuovo contenitore Docker esegue una versione Python più recente:versione 3.9.7.
Conclusione
In questo tutorial, hai dato una sbirciatina dietro le coperte e hai imparato la magia dietro come aggiornare i container Docker:fumo e specchi! Non c'è aggiornamento! Invece, rimuovi tutte le tracce della vecchia versione e sostituiscile con nuovi contenitori utilizzando una versione più recente. E, grazie all'idempotenza, i container continuano a funzionare come al solito:TA-DA!
Quindi, quali sono i contenitori che intendi aggiornare in seguito?