Introduzione
Docker è un'applicazione che semplifica il processo di gestione dei processi applicativi nei contenitori . 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ù rispettosi delle risorse e più dipendenti dal sistema operativo host.
Per un'introduzione dettagliata ai diversi componenti di un container Docker, dai un'occhiata a The Docker Ecosystem:An Introduction to Common Components.
In questo tutorial, installerai e utilizzerai Docker Community Edition (CE) su Ubuntu 22.04. Installerai Docker stesso, lavorerai con contenitori e immagini e trasferirai un'immagine a un Docker Repository.
Prerequisiti
Per seguire questo tutorial, avrai bisogno di quanto segue:
- Un server Ubuntu 22.04 configurato seguendo la guida all'installazione iniziale del server Ubuntu 22.04, incluso un
sudo
non root utente e un firewall. - Un account su Docker Hub se desideri creare le tue immagini e inviarle a Docker Hub, come mostrato nei passaggi 7 e 8.
Passaggio 1:installazione di Docker
Il pacchetto di installazione Docker disponibile nel repository ufficiale di Ubuntu potrebbe non essere l'ultima versione. Per assicurarci di ottenere l'ultima versione, installeremo Docker dal repository Docker ufficiale. Per fare ciò, aggiungeremo una nuova fonte del pacchetto, aggiungeremo la chiave GPG da Docker per assicurarci che i download siano validi, quindi installeremo il pacchetto.
Innanzitutto, aggiorna l'elenco esistente di pacchetti:
- sudo apt update
Quindi, installa alcuni pacchetti prerequisiti che consentano a apt
usa i pacchetti su HTTPS:
- sudo apt install apt-transport-https ca-certificates curl software-properties-common
Quindi aggiungi la chiave GPG per il repository Docker ufficiale al tuo sistema:
- curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Aggiungi il repository Docker ai sorgenti APT:
- echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Aggiorna nuovamente l'elenco dei pacchetti esistente per far riconoscere l'aggiunta:
- sudo apt update
Assicurati di eseguire l'installazione dal repository Docker anziché dal repository Ubuntu predefinito:
- apt-cache policy docker-ce
Vedrai un output come questo, anche se il numero di versione per Docker potrebbe essere diverso:
Output della politica apt-cache docker-cedocker-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:
- sudo apt install docker-ce
Docker ora dovrebbe essere installato, il demone avviato e il processo abilitato per l'avvio all'avvio. Verifica che sia in esecuzione:
- sudo systemctl status docker
L'output dovrebbe essere simile al seguente, a indicare 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
L'installazione di Docker ora ti offre non solo il servizio Docker (daemon) ma anche la docker
utilità della riga di comando o il client Docker. Esploreremo come utilizzare la docker
comando più avanti in questo tutorial.
Passaggio 2:esecuzione del comando Docker senza Sudo (opzionale)
Per impostazione predefinita, la docker
il comando può essere eseguito solo da root utente o da un utente nella docker gruppo, che viene creato automaticamente durante il processo di installazione di Docker. Se tenti di eseguire la docker
comando senza anteporre sudo
o senza essere nella docker gruppo, otterrai un output come questo:
Outputdocker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.
Se vuoi evitare di digitare sudo
ogni volta che esegui la docker
comando, aggiungi il tuo nome utente alla docker
gruppo:
- sudo usermod -aG docker ${USER}
Per applicare la nuova appartenenza al gruppo, esci dal server e riconnettiti oppure digita quanto segue:
- su - ${USER}
Ti verrà richiesto di inserire la password dell'utente per continuare.
Verifica che il tuo utente sia ora aggiunto alla docker raggruppare digitando:
- groups
Outputsammy sudo docker
Se devi aggiungere un utente alla docker
gruppo con cui non hai effettuato l'accesso, dichiara esplicitamente quel nome utente utilizzando:
- sudo usermod -aG docker username
Il resto di questo articolo presuppone che tu stia eseguendo la docker
comando come utente nella docker gruppo. Se scegli di non farlo, anteponi i comandi con sudo
.
Esploriamo la docker
comando successivo.
Passaggio 3:utilizzo del comando Docker
Utilizzando docker
consiste nel passargli una catena di opzioni e comandi seguiti da argomenti. La sintassi assume questa forma:
- docker [option] [command] [arguments]
Per visualizzare tutti i sottocomandi disponibili, digita:
- docker
A partire dalla versione Docker 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, digita:
- docker docker-subcommand --help
Per visualizzare le informazioni a livello di sistema su Docker, utilizzare:
- docker info
Esaminiamo alcuni di questi comandi. Inizieremo lavorando con le immagini.
Passaggio 4:utilizzo delle immagini Docker
I contenitori Docker sono creati da immagini Docker. Per impostazione predefinita, Docker estrae queste immagini da Docker Hub, un registro Docker gestito da Docker, la società dietro il 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 avrà immagini ospitate lì.
Per verificare se puoi accedere e scaricare immagini da Docker Hub, digita:
- docker run hello-world
L'output indicherà che Docker funziona 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 è stato in grado di trovare hello-world
image localmente, quindi ha scaricato l'immagine da Docker Hub, che è il repository predefinito. Una volta scaricata l'immagine, Docker ha creato un contenitore dall'immagine e l'applicazione all'interno del contenitore eseguita, visualizzando il messaggio.
Puoi cercare le immagini disponibili su Docker Hub utilizzando la docker
comando con il search
sottocomando. Ad esempio, per cercare l'immagine di Ubuntu, digita:
- docker search ubuntu
Lo script eseguirà la scansione di 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 sezione UFFICIALE colonna, OK indica un'immagine costruita e supportata dall'azienda dietro il progetto. Una volta identificata l'immagine che desideri utilizzare, puoi scaricarla sul tuo computer utilizzando il pull
sottocomando.
Esegui il comando seguente per scaricare ubuntu
ufficiale immagine sul tuo computer:
- docker pull ubuntu
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 run
sottocomando. Come hai visto con hello-world
ad esempio, se un'immagine non è stata scaricata quando docker
viene eseguito con run
sottocomando, il client Docker scaricherà prima l'immagine, quindi eseguirà un contenitore che la utilizza.
Per vedere le immagini che sono state scaricate sul tuo computer, digita:
- docker images
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 container possono essere modificate e utilizzate per generare nuove immagini, che possono quindi essere caricate (push è il termine tecnico) a Docker Hub o altri registri Docker.
Diamo un'occhiata a come eseguire i container in modo più dettagliato.
Passaggio 5:esecuzione di un container Docker
Il hello-world
il contenitore eseguito nel passaggio precedente è un esempio di contenitore che viene eseguito ed esce dopo aver emesso un messaggio di prova. I contenitori possono essere molto più utili di così e possono essere interattivi. Dopotutto, sono simili alle macchine virtuali, solo più rispettose delle risorse.
Ad esempio, eseguiamo un contenitore utilizzando l'ultima immagine di Ubuntu. La combinazione di -i e -t switch ti offre l'accesso interattivo della shell al contenitore:
- docker run -it ubuntu
Il tuo prompt dei comandi dovrebbe cambiare per riflettere il fatto che ora stai lavorando all'interno del contenitore e dovrebbe assumere questa forma:
Outputroot@d9b100f2f636:/#
Prendere nota dell'ID del contenitore nel prompt dei comandi. In questo esempio, è d9b100f2f636
. Avrai bisogno dell'ID contenitore in seguito per identificare il contenitore quando desideri rimuoverlo.
Ora puoi eseguire qualsiasi comando all'interno del contenitore. Ad esempio, aggiorniamo il database del pacchetto all'interno del contenitore. Non è necessario anteporre a nessun comando sudo
, perché stai operando all'interno del contenitore come root utente:
- apt update
Quindi installa qualsiasi applicazione al suo interno. Installiamo Node.js:
- apt install nodejs
Questo installa Node.js nel contenitore dal repository ufficiale di Ubuntu. Al termine dell'installazione, verifica che Node.js sia installato:
- node -v
Vedrai il numero di versione visualizzato nel tuo terminale:
Outputv12.22.9
Eventuali modifiche apportate all'interno del contenitore si applicano solo a quel contenitore.
Per uscire dal contenitore, digita exit
al prompt.
Diamo un'occhiata alla gestione dei container sul nostro sistema in seguito.
Fase 6:gestione dei container Docker
Dopo aver utilizzato Docker per un po', avrai molti contenitori attivi (in esecuzione) e inattivi sul tuo computer. Per visualizzare i quelli attivi , usa:
- docker ps
Vedrai un output simile al seguente:
OutputCONTAINER ID IMAGE COMMAND CREATED
In questo tutorial, hai avviato due contenitori; uno dal hello-world
immagine e un altro da ubuntu
Immagine. Entrambi i container non sono più in esecuzione, ma esistono ancora sul tuo sistema.
Per visualizzare tutti i contenitori, attivi e inattivi, esegui docker ps
con il -a
interruttore:
- docker ps -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 che hai creato, passagli il -l
interruttore:
- docker ps -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 interrotto, utilizza docker start
, seguito dall'ID contenitore o dal nome del contenitore. Iniziamo il contenitore basato su Ubuntu con l'ID di 1c08a7a0d0e4
:
- docker start 1c08a7a0d0e4
Il contenitore si avvierà e potrai usare docker ps
per vederne lo stato:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "bash" 6 minutes ago Up 8 seconds dazzling_taussig
Per interrompere un container in esecuzione, usa docker stop
, seguito dall'ID o dal nome del contenitore. Questa volta useremo il nome che Docker ha assegnato al container, che è dazzling_taussig
:
- docker stop dazzling_taussig
Una volta deciso che non hai più bisogno di un contenitore, rimuovilo con il docker rm
comando, sempre utilizzando l'ID contenitore o il nome. Usa la docker ps -a
comando per trovare l'ID contenitore o il nome per il contenitore associato a hello-world
immagine e rimuoverla.
- docker rm adoring_kowalevski
Puoi avviare un nuovo contenitore e dargli un nome usando il --name
interruttore. Puoi anche usare il --rm
passare per creare un contenitore che si rimuove da solo quando viene arrestato. Consulta la docker run help
comando per ulteriori informazioni su queste e altre opzioni.
I contenitori possono essere trasformati in immagini che puoi utilizzare per creare nuovi contenitori. Diamo un'occhiata a come funziona.
Passaggio 7:commit delle modifiche in un container in un'immagine Docker
Quando avvii un'immagine Docker, puoi creare, modificare ed eliminare file proprio come con una macchina virtuale. Le modifiche che apporti si applicheranno solo a quel contenitore. Puoi avviarlo e interromperlo, ma una volta che lo distruggi con il docker rm
comando, le modifiche andranno perse per sempre.
Questa sezione mostra come salvare lo stato di un container come nuova immagine Docker.
Dopo aver installato Node.js all'interno del contenitore Ubuntu, ora hai un contenitore che scorre da un'immagine, ma il contenitore è diverso dall'immagine che hai usato per crearlo. Ma potresti voler riutilizzare questo contenitore Node.js come base per nuove immagini in un secondo momento.
Quindi salva le modifiche in una nuova istanza dell'immagine Docker utilizzando il comando seguente.
- docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name
Il -m switch è per il messaggio di commit che aiuta te e gli altri a sapere quali modifiche hai apportato, mentre -a serve per specificare l'autore. Il container_id
è quello che hai notato in precedenza nel tutorial quando hai avviato la sessione interattiva di 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 contenitore di d9b100f2f636
, il comando sarebbe:
- docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs
Quando ti impegni un'immagine, la nuova immagine viene salvata localmente sul tuo computer. Più avanti in questo tutorial imparerai come inviare un'immagine a un registro Docker come Docker Hub in modo che altri possano accedervi.
Elencare nuovamente le immagini Docker mostrerà la nuova immagine, oltre a quella vecchia da cui è stata derivata:
- docker images
Vedrai un output come 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'esistente ubuntu
immagine da Docker Hub. La differenza di dimensioni riflette le modifiche apportate. E in questo esempio, la modifica consisteva nell'installazione di NodeJS. Quindi la prossima volta che devi eseguire un container usando Ubuntu con NodeJS preinstallato, puoi semplicemente usare la nuova immagine.
Puoi anche creare immagini da un Dockerfile
, che consente di automatizzare l'installazione del software in una nuova immagine. Tuttavia, questo non rientra nell'ambito di questo tutorial.
Ora condividiamo la nuova immagine con altri in modo che possano creare contenitori da essa.
Passaggio 8:invio di immagini Docker a un repository Docker
Il passaggio logico successivo dopo aver creato una nuova immagine da un'immagine esistente è condividerla con pochi amici selezionati, il mondo intero su Docker Hub o un altro registro Docker a cui hai accesso. Per inviare un'immagine a Docker Hub o a qualsiasi altro registro Docker, devi disporre di un account lì.
Per eseguire il push della tua immagine, accedi prima a Docker Hub.
- docker login -u docker-registry-username
Ti verrà chiesto di autenticarti utilizzando la tua password 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 utilizzato per creare l'immagine, dovrai contrassegnare l'immagine con il nome utente del registro. Per l'esempio fornito nell'ultimo passaggio, digitare:
- docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs
Quindi puoi spingere la tua immagine usando:
- docker push docker-registry-username/docker-image-name
Per eseguire il push di ubuntu-nodejs
immagine al sammy repository, il comando sarebbe:
- docker push sammy/ubuntu-nodejs
Il completamento del processo potrebbe richiedere del tempo mentre carica le immagini, ma una volta completato, l'output sarà simile al seguente:
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 eseguito il push di un'immagine in un registro, dovrebbe essere elencata nella dashboard del tuo account, come quella mostrata nell'immagine qui sotto.
Se un tentativo di push genera un errore di questo tipo, probabilmente non hai eseguito l'accesso:
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
Accedi con docker login
e ripetere il tentativo di spinta. Quindi verifica che esista nella pagina del repository Docker Hub.
Ora puoi usare docker pull sammy/ubuntu-nodejs
per trasferire l'immagine su una nuova macchina e usarla per eseguire un nuovo contenitore.
Conclusione
In questo tutorial hai installato Docker, lavorato con immagini e contenitori e inviato un'immagine modificata a Docker Hub. Ora che conosci le nozioni di base, esplora gli altri tutorial di Docker nella community di DigitalOcean.