Introduzione
Docker è un’applicazione che semplifica il processo di gestione dei processi delle applicazioni in container. I container ti consentono di eseguire le tue applicazioni in processi isolati dalle risorse. Sono simili alle macchine virtuali, ma i container sono più portatili, più leggeri sulle risorse e dipendono maggiormente dal sistema operativo host.
Per una introduzione dettagliata ai diversi componenti di un container Docker, dai un’occhiata a L’Ecosistema Docker: Introduzione ai Componenti Comuni.
In questo tutorial, installerai e utilizzerai Docker Community Edition (CE) su Ubuntu 22.04. Installerai Docker stesso, lavorerai con container e immagini e caricherai un’immagine in un Repository Docker.
Semplifica il deploy delle applicazioni con DigitalOcean App Platform. Effettua il deploy direttamente da GitHub in pochi minuti.
Prerequisiti
Per seguire questo tutorial, avrai bisogno dei seguenti:
- Un server Ubuntu 22.04 configurato seguendo la guida di configurazione iniziale del server Ubuntu 22.04, incluso un utente
sudo
non root e un firewall. - Un account su Docker Hub se desideri creare le tue immagini e caricarle su Docker Hub, come mostrato nei Passaggi 7 e 8.
Passaggio 1 — Installazione di Docker
Il pacchetto di installazione di Docker disponibile nel repository ufficiale di Ubuntu potrebbe non essere l’ultima versione. Per assicurarci di ottenere l’ultima versione, installeremo Docker dal repository ufficiale di Docker. Per farlo, aggiungeremo una nuova sorgente di pacchetti, aggiungeremo la chiave GPG da Docker per garantire che i download siano validi e quindi installeremo il pacchetto.
Innanzitutto, aggiorna il tuo elenco esistente di pacchetti:
Successivamente, installa alcuni pacchetti prerequisiti che consentono a apt
di utilizzare pacchetti tramite HTTPS:
Quindi aggiungi la chiave GPG per il repository ufficiale di Docker al tuo sistema:
Aggiungi il repository Docker alle fonti APT:
Aggiorna nuovamente il tuo elenco esistente di pacchetti affinché l’aggiunta venga riconosciuta:
Assicurati di essere pronto a installare dal repo Docker invece del repo Ubuntu predefinito:
Vedrai un output simile a questo, anche se il numero di versione per Docker potrebbe essere diverso:
docker-ce:
Installed: (none)
Candidate: 5:20.10.14~3-0~ubuntu-jammy
Version table:
5:20.10.14~3-0~ubuntu-jammy 500
500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
5:20.10.13~3-0~ubuntu-jammy 500
500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
Nota che docker-ce
non è installato, ma il candidato per l’installazione proviene dal repository Docker per Ubuntu 22.04 (jammy
).
Infine, installa Docker:
Docker dovrebbe essere ora installato, il demone avviato e il processo abilitato all’avvio automatico. Verifica che sia in esecuzione:
Il risultato dovrebbe essere simile al seguente, mostrando che il servizio è attivo e in esecuzione:
Output● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2022-04-01 21:30:25 UTC; 22s ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 7854 (dockerd)
Tasks: 7
Memory: 38.3M
CPU: 340ms
CGroup: /system.slice/docker.service
└─7854 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Installare Docker ora fornisce non solo il servizio Docker (demonio) ma anche l’utilità a riga di comando docker
, o il client Docker. Esploreremo come utilizzare il comando docker
più avanti in questo tutorial.
Passaggio 2 — Eseguire il Comando Docker Senza Sudo (Opzionale)
Per impostazione predefinita, il comando docker
può essere eseguito solo dall’utente root o da un utente nel gruppo docker, che viene creato automaticamente durante il processo di installazione di Docker. Se tenti di eseguire il comando docker
senza prefissarlo con sudo
o senza essere nel gruppo docker, otterrai un risultato simile a questo:
Outputdocker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.
Se desideri evitare di digitare sudo
ogni volta che esegui il comando docker
, aggiungi il tuo nome utente al gruppo docker
:
Per applicare la nuova appartenenza al gruppo, disconnettersi dal server e riconnettersi, o digitare quanto segue:
Ti verrà richiesto di inserire la password dell’utente per continuare.
Conferma che il tuo utente sia ora aggiunto al gruppo docker digitando:
Outputsammy sudo docker
Se hai bisogno di aggiungere un utente al gruppo docker
con cui non hai effettuato l’accesso, dichiara esplicitamente quel nome utente utilizzando:
Il resto di questo articolo presuppone che tu stia eseguendo il comando docker
come utente nel gruppo docker. Se scegli di non farlo, premetti i comandi con sudo
.
Esploriamo ora il comando docker
.
Passaggio 3 — Utilizzo del Comando Docker
L’uso di docker
consiste nel passargli una serie di opzioni e comandi seguiti dagli argomenti. La sintassi ha questa forma:
Per visualizzare tutti i sottocomandi disponibili, digitare:
Con Docker versione 20.10.14, l’elenco completo dei sottocomandi disponibili include:
Output attach Attach local standard input, output, and error streams to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container's filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on Docker objects
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
wait Block until one or more containers stop, then print their exit codes
Per visualizzare le opzioni disponibili per un comando specifico, digitare:
Per visualizzare informazioni a livello di sistema su Docker, utilizzare:
Esploriamo alcuni di questi comandi. Inizieremo lavorando con le immagini.
Passaggio 4 — Lavorare con le immagini Docker
I container Docker sono costruiti dalle immagini Docker. Per impostazione predefinita, Docker estrae queste immagini da Docker Hub, un registro Docker gestito da Docker, l’azienda dietro al progetto Docker. Chiunque può ospitare le proprie immagini Docker su Docker Hub, quindi la maggior parte delle applicazioni e delle distribuzioni Linux di cui avrai bisogno avranno immagini ospitate lì.
Per verificare se puoi accedere e scaricare immagini da Docker Hub, digita:
Il risultato indicherà che Docker sta funzionando correttamente:
OutputUnable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:bfea6278a0a267fad2634554f4f0c6f31981eea41c553fdf5a83e95a41d40c38
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
Inizialmente Docker non è riuscito a trovare l’immagine hello-world
localmente, quindi ha scaricato l’immagine da Docker Hub, che è il repository predefinito. Una volta scaricata l’immagine, Docker ha creato un container dall’immagine e l’applicazione all’interno del container è stata eseguita, visualizzando il messaggio.
Puoi cercare immagini disponibili su Docker Hub utilizzando il comando docker
con il sottocomando search
. Ad esempio, per cercare l’immagine di Ubuntu, digita:
Lo script esaminerà Docker Hub e restituirà un elenco di tutte le immagini il cui nome corrisponde alla stringa di ricerca. In questo caso, l’output sarà simile a questo:
OutputNAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 14048 [OK]
websphere-liberty WebSphere Liberty multi-architecture images … 283 [OK]
ubuntu-upstart DEPRECATED, as is Upstart (find other proces… 112 [OK]
neurodebian NeuroDebian provides neuroscience research s… 88 [OK]
open-liberty Open Liberty multi-architecture images based… 51 [OK]
...
Nella colonna UFFICIALE, OK indica un’immagine creata e supportata dalla società dietro al progetto. Una volta identificata l’immagine che desideri utilizzare, puoi scaricarla sul tuo computer utilizzando il sotto-comando pull
.
Esegui il seguente comando per scaricare l’immagine ufficiale ubuntu
sul tuo computer:
Vedrai il seguente output:
OutputUsing default tag: latest
latest: Pulling from library/ubuntu
e0b25ef51634: Pull complete
Digest: sha256:9101220a875cee98b016668342c489ff0674f247f6ca20dfc91b91c0f28581ae
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
Dopo che un’immagine è stata scaricata, puoi quindi eseguire un contenitore utilizzando l’immagine scaricata con il sotto-comando run
. Come hai visto con l’esempio di hello-world
, se un’immagine non è stata scaricata quando docker
viene eseguito con il sotto-comando run
, il client Docker scaricherà prima l’immagine e quindi eseguirà un contenitore utilizzandola.
Per vedere le immagini che sono state scaricate sul tuo computer, digita:
L’output sarà simile al seguente:
OutputREPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 1d622ef86b13 3 weeks ago 73.9MB
hello-world latest bf756fb1ae65 4 months ago 13.3kB
Come vedrai più avanti in questo tutorial, le immagini che utilizzi per eseguire i contenitori possono essere modificate e utilizzate per generare nuove immagini, che possono poi essere caricate (pushed è il termine tecnico) su Docker Hub o altri registri Docker.
Esaminiamo ora come eseguire i contenitori in modo più dettagliato.
Passaggio 5 — Esecuzione di un Contenitore Docker
Il contenitore hello-world
eseguito nel passaggio precedente è un esempio di un contenitore che viene eseguito ed esce dopo aver emesso un messaggio di test. I contenitori possono essere molto più utili di così e possono essere interattivi. Dopotutto, sono simili alle macchine virtuali, solo più amichevoli con le risorse.
Come esempio, eseguiamo un contenitore utilizzando l’ultima immagine di Ubuntu. La combinazione degli interruttori -i e -t ti fornisce accesso interattivo alla shell all’interno del contenitore:
Il prompt dei comandi dovrebbe cambiare per riflettere il fatto che stai ora lavorando all’interno del contenitore e dovrebbe assumere questa forma:
Outputroot@d9b100f2f636:/#
Nota l’ID del contenitore nel prompt dei comandi. In questo esempio, è d9b100f2f636
. Avrai bisogno di quell’ID del contenitore in seguito per identificare il contenitore quando vorrai rimuoverlo.
Ora puoi eseguire qualsiasi comando all’interno del contenitore. Ad esempio, aggiorniamo il database dei pacchetti all’interno del contenitore. Non è necessario prefissare alcun comando con sudo
, perché stai operando all’interno del contenitore come utente root:
Quindi installa qualsiasi applicazione al suo interno. Installiamo Node.js:
Questo installa Node.js nel contenitore dal repository ufficiale di Ubuntu. Quando l’installazione è completata, verifica che Node.js sia installato:
Vedrai il numero di versione visualizzato nel tuo terminale:
Outputv12.22.9
Le modifiche apportate all’interno del contenitore si applicano solo a quel contenitore.
Per uscire dal contenitore, digita exit
al prompt.
Passiamo a gestire i contenitori sul nostro sistema dopo.
Passo 6 — Gestione dei Container Docker
Dopo aver usato Docker per un po’, avrai molti container attivi (in esecuzione) e inattivi sul tuo computer. Per visualizzare quelli attivi, usa:
Vedrai un output simile al seguente:
OutputCONTAINER ID IMAGE COMMAND CREATED
In questo tutorial, hai avviato due container; uno dall’immagine hello-world
e un altro dall’immagine ubuntu
. Entrambi i container non sono più in esecuzione, ma esistono ancora nel tuo sistema.
Per visualizzare tutti i container — attivi e inattivi, esegui docker ps
con l’interruttore -a
:
Vedrai un output simile a questo:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "bash" About a minute ago Exited (0) 7 seconds ago dazzling_taussig
587000e49d53 hello-world "/hello" 5 minutes ago Exited (0) 5 minutes ago adoring_kowalevski
Per visualizzare l’ultimo container creato, passagli l’interruttore -l
:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "bash" 3 minutes ago Exited (0) 2 minutes ago dazzling_taussig
Per avviare un container arrestato, usa docker start
, seguito dall’ID del container o dal nome del container. Avviamo il container basato su Ubuntu con l’ID 1c08a7a0d0e4
:
Il container verrà avviato e puoi usare docker ps
per vedere il suo stato:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "bash" 6 minutes ago Up 8 seconds dazzling_taussig
Per arrestare un container in esecuzione, usa docker stop
, seguito dall’ID o dal nome del container. Questa volta, useremo il nome che Docker ha assegnato al container, che è dazzling_taussig
:
Una volta che hai deciso di non aver più bisogno di un contenitore, rimuovilo con il comando docker rm
, utilizzando nuovamente l’ID del contenitore o il nome. Utilizza il comando docker ps -a
per trovare l’ID o il nome del contenitore associato all’immagine hello-world
e rimuoverlo.
Puoi avviare un nuovo contenitore e dargli un nome utilizzando l’opzione --name
. Puoi anche utilizzare l’opzione --rm
per creare un contenitore che si rimuove automaticamente quando viene arrestato. Consulta il comando docker run help
per ulteriori informazioni su queste opzioni e altre.
I contenitori possono essere trasformati in immagini che puoi utilizzare per creare nuovi contenitori. Vediamo come funziona questo processo.
Passaggio 7 — Salvare le modifiche in un contenitore in un’immagine Docker
Quando avvii un’immagine Docker, puoi creare, modificare ed eliminare file proprio come faresti con una macchina virtuale. Le modifiche che apporti si applicheranno solo a quel contenitore. Puoi avviarlo e arrestarlo, ma una volta distrutto con il comando docker rm
, le modifiche saranno perse definitivamente.
In questa sezione ti mostrerò come salvare lo stato di un contenitore come nuova immagine Docker.
Dopo aver installato Node.js all’interno del container Ubuntu, ora hai un container in esecuzione da un’immagine, ma il container è diverso dall’immagine che hai usato per crearlo. Tuttavia, potresti voler riutilizzare questo container Node.js come base per nuove immagini in seguito.
Quindi, commetti le modifiche in una nuova istanza di immagine Docker usando il seguente comando.
Lo switch -m è per il messaggio di commit che ti aiuta e aiuta gli altri a sapere quali modifiche hai apportato, mentre -a viene utilizzato per specificare l’autore. Il container_id
è quello che hai annotato in precedenza nel tutorial quando hai avviato la sessione interattiva Docker. A meno che tu non abbia creato repository aggiuntivi su Docker Hub, il repository
è di solito il tuo nome utente Docker Hub.
Ad esempio, per l’utente sammy, con l’ID del container d9b100f2f636
, il comando sarebbe:
Quando commetti un’immagine, la nuova immagine viene salvata localmente sul tuo computer. Più avanti in questo tutorial, imparerai come caricare un’immagine in un registro Docker come Docker Hub in modo che altri possano accedervi.
Ri-elencare le immagini Docker mostrerà nuovamente la nuova immagine, così come quella vecchia da cui è derivata:
Vedrai un output simile a questo:
OutputREPOSITORY TAG IMAGE ID CREATED SIZE
sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB
...
In questo esempio, ubuntu-nodejs
è la nuova immagine, che è stata derivata dall’immagine esistente ubuntu
da Docker Hub. La differenza di dimensione riflette le modifiche apportate. E in questo esempio, il cambiamento è stato l’installazione di NodeJS. Quindi la prossima volta che avrai bisogno di eseguire un container utilizzando Ubuntu con NodeJS preinstallato, puoi semplicemente utilizzare la nuova immagine.
Puoi anche creare immagini da un Dockerfile
, che ti consente di automatizzare l’installazione del software in una nuova immagine. Tuttavia, questo è al di fuori dello scopo di questo tutorial.
Ora condividiamo la nuova immagine con gli altri in modo che possano creare container da essa.
Passaggio 8 — Pubblicazione delle immagini Docker in un repository Docker
Il prossimo passaggio logico dopo aver creato una nuova immagine da un’immagine esistente è condividerla con alcuni dei tuoi amici, con tutto il mondo su Docker Hub o su un altro registro Docker a cui hai accesso. Per pubblicare un’immagine su Docker Hub o su qualsiasi altro registro Docker, è necessario avere un account lì.
Per pubblicare la tua immagine, effettua prima l’accesso a Docker Hub.
Ti verrà chiesto di autenticarti utilizzando la tua password di Docker Hub. Se hai specificato la password corretta, l’autenticazione dovrebbe riuscire.
Nota: Se il nome utente del registro Docker è diverso dal nome utente locale che hai usato per creare l’immagine, dovrai etichettare l’immagine con il tuo nome utente del registro. Per l’esempio dato nell’ultimo passaggio, dovresti digitare:
Quindi puoi pubblicare la tua immagine usando:
Per pubblicare l’immagine ubuntu-nodejs
nel repository sammy, il comando sarebbe:
Il processo potrebbe richiedere del tempo per completarsi poiché carica le immagini, ma una volta completato, l’output avrà questa forma:
OutputThe push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed
...
Dopo aver caricato un’immagine su un registro, dovrebbe essere elencata nel dashboard del tuo account, come mostrato nell’immagine qui sotto.
Se un tentativo di push risulta in un errore di questo tipo, allora probabilmente non ti sei autenticato:
OutputThe push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Preparing
5f70bf18a086: Preparing
a3b5c80a4eba: Preparing
7f18b442972b: Preparing
3ce512daaf78: Preparing
7aae4540b42d: Waiting
unauthorized: authentication required
Effettua l’accesso con docker login
e ripeti il tentativo di push. Quindi verifica che esista sulla pagina del repository di Docker Hub.
Ora puoi usare docker pull sammy/ubuntu-nodejs
per scaricare l’immagine su una nuova macchina e usarla per eseguire un nuovo container.
Conclusione
In questo tutorial hai installato Docker, lavorato con immagini e container, e caricato un’immagine modificata su Docker Hub. Ora che conosci le basi, esplora gli altri tutorial su Docker nella Community di DigitalOcean.
Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04