Differenza tra immagini Docker e contenitori

1. Panoramica

Docker è uno strumento per creare, distribuire ed eseguire facilmente le applicazioni. Ci consente di impacchettare le nostre applicazioni con tutte le dipendenze e di distribuirle come singoli pacchetti. Docker garantisce che la nostra applicazione verrà eseguita allo stesso modo su ogni istanza Docker.

Quando iniziamo a utilizzare Docker, ci sono due concetti principali su cui dobbiamo essere chiari: immagini e contenitori .

In questo tutorial impareremo cosa sono e come differiscono.

2. Immagini Docker

Un'immagine è un file che rappresenta un'applicazione in pacchetto con tutte le dipendenze necessarie per funzionare correttamente. In altre parole, potremmo dire che un'immagine Docker è come una classe Java .

Le immagini sono costruite come una serie di livelli . Gli strati vengono assemblati uno sopra l'altro. Allora, cos'è uno strato? In poche parole, un livello è un'immagine.

Supponiamo di voler creare un'immagine Docker di un'applicazione Java Hello World. La prima cosa a cui dobbiamo pensare è di cosa ha bisogno la nostra applicazione.

Per iniziare, è un'applicazione Java, quindi avremo bisogno di una JVM. OK, sembra facile, ma cosa serve per eseguire una JVM? Ha bisogno di un sistema operativo. Pertanto, la nostra immagine Docker avrà un livello del sistema operativo, una JVM e la nostra applicazione Hello World .

Uno dei principali vantaggi di Docker è la sua vasta comunità. Se vogliamo costruire su un'immagine, possiamo andare su Docker Hub e cercare se l'immagine di cui abbiamo bisogno è disponibile.

Supponiamo di voler creare un database, utilizzando il database PostgreSQL. Non è necessario creare una nuova immagine PostgreSQL da zero. Andiamo su Docker Hub, cerchiamo postgres , che è il nome dell'immagine ufficiale di Docker per PostgresSQL, scegliamo la versione di cui abbiamo bisogno ed eseguiamola.

Ogni immagine che creiamo o estraiamo da Docker Hub è archiviata nel nostro filesystem ed è identificata dal suo nome e tag. Può anche essere identificato dal suo ID immagine .

Utilizzando il comando docker images , possiamo visualizzare un elenco di immagini che abbiamo a disposizione nel nostro filesystem:

$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE postgres 11.6 d3d96b1e5d48 4 weeks ago 332MB mongo latest 9979235fc504 6 weeks ago 364MB rabbitmq 3-management 44c4867e4a8b 8 weeks ago 180MB mysql 8.0.18 d435eee2caa5 2 months ago 456MB jboss/wildfly 18.0.1.Final bfc71fe5d7d1 2 months ago 757MB flyway/flyway 6.0.8 0c11020ffd69 3 months ago 247MB java 8-jre e44d62cf8862 3 years ago 311MB

3. Esecuzione di immagini Docker

Un'immagine viene eseguita utilizzando il comando docker run con il nome e il tag dell'immagine. Diciamo che vogliamo eseguire l'immagine postgres 11.6:

docker run -d postgres:11.6

Notare che abbiamo fornito l' opzione -d . Questo dice a Docker di eseguire l'immagine in background, nota anche come modalità scollegata.

Usando il comando docker ps possiamo controllare se la nostra immagine è in esecuzione dovremmo usare questo comando:

$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3376143f0991 postgres:11.6 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 5432/tcp tender_heyrovsky

Notare l' ID CONTAINER nell'output sopra. Diamo un'occhiata a cos'è un contenitore e come è correlato a un'immagine.

4. Contenitori Docker

Un contenitore è un'istanza di un'immagine. Ogni contenitore può essere identificato dal suo ID. Tornando alla nostra analogia con lo sviluppo di Java, potremmo dire che un contenitore è come un'istanza di una classe .

Docker definisce sette stati per un contenitore: creato , riavviato , in esecuzione , rimosso , sospeso , chiuso e inattivo . Questo è importante da sapere. Poiché un contenitore è solo un'istanza dell'immagine, non è necessario che sia in esecuzione.

Ora ripensiamo al comando di esecuzione che abbiamo visto sopra. Abbiamo detto che viene utilizzato per eseguire immagini, ma non è del tutto accurato. La verità è che il comando run viene utilizzato per creare e avviare un nuovo contenitore dell'immagine.

Un grande vantaggio è che i container sono come VM leggere. I loro comportamenti sono completamente isolati l'uno dall'altro. Ciò significa che possiamo eseguire più contenitori della stessa immagine, ognuno in uno stato diverso con dati e ID diversi.

Essere in grado di eseguire più contenitori della stessa immagine contemporaneamente è un grande vantaggio perché ci consente un modo semplice di ridimensionare le applicazioni. Ad esempio, pensiamo ai microservizi. Se ogni servizio è confezionato come un'immagine Docker, significa che i nuovi servizi possono essere distribuiti come contenitori su richiesta.

5. Ciclo di vita dei contenitori

In precedenza, abbiamo menzionato i sette stati di un contenitore, ora vediamo come possiamo utilizzare lo strumento della riga di comando docker per elaborare i diversi stati del ciclo di vita.

Starting up a new container requires us to create it and then start it. This means that it has to go through the create state before it can be running. We can do this by creating and starting the container explicitly:

docker container create : docker container start 

Or we can easily do this with the run command:

docker run :

We can pause a running container and then put it on running state again:

docker pause  docker unpause 

A paused container will show “Paused” as the status when we check the processes:

$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9bef2edcad7b postgres:11.6 "docker-entrypoint.s…" 5 minutes ago Up 4 minutes (Paused) 5432/tcp tender_heyrovsky

We can also stop a running container and then rerun it:

docker stop  docker start 

And finally, we can remove a container:

docker container rm 

Only containers in the stopped or created state can be removed.

For more information regarding the Docker commands, we can refer to the Docker Command Line Reference.

6. Conclusion

In questo articolo, abbiamo discusso delle immagini e dei contenitori Docker e di come differiscono. Le immagini descrivono le applicazioni e come possono essere eseguite. I contenitori sono le istanze dell'immagine, in cui è possibile eseguire più contenitori della stessa immagine, ciascuno in uno stato diverso.

Abbiamo anche parlato del ciclo di vita dei contenitori e imparato i comandi di base per gestirli.

Ora che conosciamo le basi, è tempo di saperne di più sull'entusiasmante mondo di Docker e di iniziare ad aumentare le nostre conoscenze!