Come installare e utilizzare Docker su Ubuntu 22.04

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:

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:

  1. sudo apt update

Successivamente, installa alcuni pacchetti prerequisiti che consentono a apt di utilizzare pacchetti tramite HTTPS:

  1. sudo apt install apt-transport-https ca-certificates curl software-properties-common

Quindi aggiungi la chiave GPG per il repository ufficiale di Docker al tuo sistema:

  1. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Aggiungi il repository Docker alle fonti APT:

  1. 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 il tuo elenco esistente di pacchetti affinché l’aggiunta venga riconosciuta:

  1. sudo apt update

Assicurati di essere pronto a installare dal repo Docker invece del repo Ubuntu predefinito:

  1. apt-cache policy docker-ce

Vedrai un output simile a questo, anche se il numero di versione per Docker potrebbe essere diverso:

Output of apt-cache policy docker-ce
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:

  1. sudo apt install docker-ce

Docker dovrebbe essere ora installato, il demone avviato e il processo abilitato all’avvio automatico. Verifica che sia in esecuzione:

  1. sudo systemctl status docker

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:

Output
docker: 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:

  1. sudo usermod -aG docker ${USER}

Per applicare la nuova appartenenza al gruppo, disconnettersi dal server e riconnettersi, o digitare quanto segue:

  1. su - ${USER}

Ti verrà richiesto di inserire la password dell’utente per continuare.

Conferma che il tuo utente sia ora aggiunto al gruppo docker digitando:

  1. groups
Output
sammy 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:

  1. sudo usermod -aG docker username

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:

  1. docker [option] [command] [arguments]

Per visualizzare tutti i sottocomandi disponibili, digitare:

  1. docker

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:

  1. docker docker-subcommand --help

Per visualizzare informazioni a livello di sistema su Docker, utilizzare:

  1. docker info

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:

  1. docker run hello-world

Il risultato indicherà che Docker sta funzionando correttamente:

Output
Unable 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:

  1. docker search ubuntu

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:

Output
NAME 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:

  1. docker pull ubuntu

Vedrai il seguente output:

Output
Using 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:

  1. docker images

L’output sarà simile al seguente:

Output
REPOSITORY 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:

  1. docker run -it ubuntu

Il prompt dei comandi dovrebbe cambiare per riflettere il fatto che stai ora lavorando all’interno del contenitore e dovrebbe assumere questa forma:

Output
root@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:

  1. apt update

Quindi installa qualsiasi applicazione al suo interno. Installiamo Node.js:

  1. apt install nodejs

Questo installa Node.js nel contenitore dal repository ufficiale di Ubuntu. Quando l’installazione è completata, verifica che Node.js sia installato:

  1. node -v

Vedrai il numero di versione visualizzato nel tuo terminale:

Output
v12.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:

  1. docker ps

Vedrai un output simile al seguente:

Output
CONTAINER 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:

  1. docker ps -a

Vedrai un output simile a questo:

Output
CONTAINER 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:

  1. docker ps -l
Output
CONTAINER 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:

  1. docker start 1c08a7a0d0e4

Il container verrà avviato e puoi usare docker ps per vedere il suo stato:

Output
CONTAINER 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:

  1. docker stop 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.

  1. docker rm adoring_kowalevski

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.

  1. docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name

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:

  1. docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs

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:

  1. docker images

Vedrai un output simile a questo:

Output
REPOSITORY 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.

  1. docker login -u docker-registry-username

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:

  1. docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs

Quindi puoi pubblicare la tua immagine usando:

  1. docker push docker-registry-username/docker-image-name

Per pubblicare l’immagine ubuntu-nodejs nel repository sammy, il comando sarebbe:

  1. docker push sammy/ubuntu-nodejs

Il processo potrebbe richiedere del tempo per completarsi poiché carica le immagini, ma una volta completato, l’output avrà questa forma:

Output
The 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:

Output
The 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