Se stai cercando informazioni su come installare Docker su Ubuntu, sei nel posto giusto. Non solo, ma come bonus, questo tutorial ti mostrerà anche come eseguire i comandi di base di Docker per eseguire e gestire i container.
Utilizzando le pratiche funzionalità di Visual Studio (VS) Code, imparerai anche come potenziare le tue competenze SSH. Cominciamo!
Correlato: Un utente Windows in un mondo Linux: VS Code e SSH remoto
Prerequisiti
Se desideri seguire passo dopo passo questo tutorial, assicurati di avere quanto segue:
- A fresh install of Ubuntu Server LTS with SSH Enabled (This guide will be using Ubuntu Server LTS 20.04.1)
- A Windows Machine with VSCode installed (This guide will be using Visual Studio Code 1.52.1)
- L’estensione ufficiale SSH di VSCode installata e connessa alla tua installazione di Ubuntu Server LTS
Installazione di Docker su Ubuntu
Iniziamo prima installando Docker su Ubuntu. A questo punto, il tutorial presuppone che tu sia sul tuo computer Windows locale con VS Code aperto e connesso al tuo server Ubuntu tramite SSH. Scopri come configurare questo ambiente pratico nell’ultimo articolo sull’utilizzo di VS Code e SSH.
Nell’esempio seguente, VSCode è connesso in remoto a Ubuntu con la cartella home (in questo caso, /home/homelab) aperta come spazio di lavoro:

Il processo effettivo per installare Docker in Ubuntu Server è a due comandi di distanza. Ubuntu rende Docker disponibile come opzione di installazione nel gestore dei pacchetti predefinito che viene fornito con Ubuntu noto come apt
.
Nella finestra terminale SSH di VS Code, eseguire i seguenti due comandi per installare Docker:
Durante l’installazione di Ubuntu Server, potrebbe essere stata offerta l’opzione di installare Docker come snap. Se lo hai fatto, rimuovi prima il pacchetto snap eseguendo
sudo snap remove docker
Puoi vedere l’installazione di Docker nell’animazione sottostante:

Ubuntu è abbastanza gentile da abilitare automaticamente il servizio e impostarlo per avviarsi all’avvio, quindi sei pronto per iniziare a utilizzare Docker!
Creazione ed esecuzione di un container Docker su Ubuntu
Ora che hai installato Docker, cosa puoi fare con esso? Iniziamo con la creazione di un container Docker. Questo tutorial configurerà un server web statico come esempio di un container Docker. In questa sezione, tu:
- Configurerai un nuovo container dal Repository di immagini Docker Hub per eseguire un servizio HTTP
- Utilizzerai il Port Mapping per mappare la porta HTTP all’interno del container all’host Ubuntu
- Configurerai i Bind Mounts per mappare i dati importanti all’interno del container all’host Ubuntu
- Configurare la persistenza attraverso i riavvii per il tuo contenitore
Se alcuni dei passaggi precedenti sembrano confusi, non preoccuparti, copriremo ogni passaggio, uno alla volta per aiutarti a comprendere il processo.
Scaricamento dell’immagine Docker
La prima domanda che devi farti è: da dove verrà questo contenitore? Diamo un’occhiata a Docker Hub.
A large part of Docker is understanding image repositories. Rather than being distributed like packages, services in Docker get distributed as Docker Images.
A Docker Image is a snapshot of the software that the publisher wants to distribute and the entire filing system! This is analogous to creating .wim image of Windows.
Questa cattura del filesystem rende Docker così popolare: il software viene acquisito insieme all’intero ambiente operativo. In questo modo si eliminano i problemi causati dalle differenze tra gli ambienti dei server.
Uno dei repository più popolari (e predefinito) per le immagini è il Docker Hub, noto anche come repository ufficiale di Docker. Il repository delle immagini è il luogo in cui è possibile scaricare migliaia di immagini Docker pre-create da eseguire come contenitori.
Visto che questo tutorial sta configurando un server web statico, è necessario scaricare un’immagine del server web. I due server web più popolari sono Apache httpd e Nginx, ma per variare un po’ le cose e potenzialmente farti conoscere un nuovo server web, utilizziamo uno chiamato Caddy.
Caddy è un server web noto per la sua semplicità. Molte configurazioni di server valide possono essere implementate utilizzando una singola riga in un file. La semplicità è buona e fa anche un buon esempio di base.
- Prima di tutto, dovrai trovare l’immagine Docker. Sul tuo computer Windows, vai su https://hub.docker.com.
- Esegui una ricerca per caddy nell’angolo in alto a sinistra della pagina. Dovresti vedere una pagina simile a quella seguente:

A benefit (and downside) of Docker Hub is that anyone, even you, can create and upload Docker Images to the site.
Devi fare attenzione per assicurarti che l’immagine che scegli provenga da una fonte attendibile. Chiunque può inserire malware in un’immagine se lo desidera e caricare la propria versione su Docker Hub.
3. Anota il nome dell’immagine. Nello screenshot sopra, il nome è caddy esattamente. Avrai bisogno di questo nome per specificare il nome dell’immagine nei passaggi successivi.
Eseguire un container con Docker su Ubuntu
Una volta che conosci il nome dell’immagine che desideri scaricare, è ora di scaricarla e creare un container da essa.
Avviare un container da un’immagine richiede un singolo comando. Nel terminale SSH connesso al tuo server Ubuntu, esegui il seguente comando docker run
.
Il comando qui sotto verifica la presenza dell’immagine caddy sul computer locale. Se non esiste, scarica l’immagine da Docker Hub, crea un container e lo avvia. Il comando qui sotto utilizza lo switch -p
per mappare la porta di ascolto del server Ubuntu sulla porta 80 del container. Questa funzionalità è chiamata mappatura di porte.
La maggior parte delle immagini su Docker Hub segue una convenzione di denominazione di <utente>/<nome immagine>. Tuttavia, le immagini contrassegnate come “ufficiali” da Docker non hanno un <utente> di fronte a loro (come caddy sopra).
L’esecuzione del comando sopra restituisce qualcosa di simile a quanto segue, con le informazioni di registro di Caddy visualizzate direttamente nel terminale:

Potresti notare che quasi tutti i comandi di Docker sono preceduti da
sudo
, per forzare l’esecuzione dei comandi come amministratore. Di default, il servizio Docker viene eseguito comeroot
, e tutte le modifiche apportate a contenitori o immagini devono essere fatte come amministratore.
E… sei pronto a partire! È tutto qui. Non sei contento di aver installato Docker su Ubuntu?
Ora vai su http://<tuoi-ip> sul tuo computer Windows e dovresti vedere una pagina di destinazione per Caddy. Puoi vederlo qui sotto (l’IP di questa guida è sostituito con http://homelab-docker):

Il contenitore caddy è in esecuzione ora, ma potresti aver notato un problema. Eseguendo quel comando docker
, prendi il controllo della tua riga di comando. Non puoi eseguire altri comandi e se la sessione termina, il contenitore in esecuzione si ferma. Risolviamo quel problema eseguendo il contenitore in background (anche noto come distacco del contenitore).
Esecuzione dei contenitori Docker in background
Ora hai un contenitore in esecuzione ma la tua riga di comando è bloccata. Non puoi fare nient’altro. Hai bisogno di un modo migliore per avviare un contenitore eseguendolo in background come un servizio. Per fare ciò:
- Interrompi il contenitore corrente premendo control+c nella riga di comando. Questo ti restituirà la riga di comando.
- Ora, esegui nuovamente lo stesso comando come prima solo con il parametro
-d
questa volta come mostrato di seguito. Vedrai che Docker restituirà un ID del contenitore e ti passerà nuovamente la riga di comando.

Gestione dei contenitori in background con comandi Docker
Una volta che hai uno o più Docker in background in esecuzione, dovrai gestirli in qualche modo. Docker ti fornisce alcuni comandi diversi per farlo utilizzando i comandi docker container
.
sudo docker container list -a
: Elenca tutti i contenitori (in esecuzione e fermati) e il loro statosudo docker container stop <nome>
: arresta un contenitore Docker per il loro nome (o per il loro ID)sudo docker container start <nome>
: avvia un contenitore Docker per il loro nome (o per il loro ID)sudo docker container prune
: distrugge e rimuove tutti i contenitori fermati
Puoi vedere tutti i comandi sopra utilizzati nel contesto nella schermata seguente:

Esistono molti altri comandi dei contenitori Docker per visualizzare, modificare, ispezionare o persino accedere remotamente ai contenitori sul tuo server. Puoi visualizzarli tutti eseguendo
sudo docker container --help
.
Anche se hai ora distribuito un server web in un contenitore in esecuzione in background, non hai ancora modo di ospitare i tuoi contenuti personalizzati. Così com’è, Caddy sta solo servendo la pagina web predefinita.
Ora vediamo come puoi utilizzare le immagini Docker con un concetto chiamato bind mounts per distribuire contenitori con dati significativi.
Archiviazione dei dati del contenitore con i bind mounts
Docker si basa sul concetto di immagini (e dei relativi contenitori generati) come oggetti usa e getta o transitori. Se viene effettuato un aggiornamento del software Caddy, non si aggiorna il servizio, ma si elimina l’intero pacchetto e si utilizza un’immagine completamente nuova da zero.
I vantaggi di eliminare e ricreare i contenitori in questo modo sono significativi. Le instabilità del software si introducono nel tempo tramite l’aggiornamento continuo di un software (potenzialmente) vecchio di anni. Utilizzando un’immagine nuova ogni volta, Docker ti fornisce una base stabile, affidabile e (presumibilmente) testata ad ogni aggiornamento.
Questo concetto equivale all’utilizzo di un’installazione fresca di Windows ogni volta che si aggiorna il software dell’applicazione di Windows. Non è un’idea divertente su Windows, ma è estremamente applicabile in Docker.
Tuttavia, la metodologia usa e getta presenta un problema evidente. Non si desidera che i dati essenziali vengano eliminati quando il servizio corrente viene eliminato. Docker risolve questo problema utilizzando un concetto chiamato bind mounts.
Ora esploriamo come creare un bind mount per un contenitore.
Creazione della struttura delle cartelle e pulizia
Prima di poter utilizzare i bind mounts, è necessario creare una posizione in cui archiviare questi dati. Questo tutorial creerà una cartella nella tua directory home. Per farlo in VS Code mentre sei ancora connesso al tuo server Ubuntu:
- Fare clic con il pulsante destro del mouse in un’area vuota del pannello di Esplora di VS Code e scegliere nuova cartella.
2. Dare il nome alla nuova cartella containers/caddy/files.
Il nome delle cartelle è a tua scelta, purché siano definite correttamente nel comando Docker successivo. Utilizzando una barra obliqua, VS Code interpreta ciò come la creazione di tre cartelle. La cartella files è una sottodirectory di caddy, e caddy è una sottodirectory di containers. Non è necessario utilizzare questa struttura di cartelle, ma ha più senso quando si hanno più container sullo stesso server.
Se non l’hai già fatto in precedenza, interrompi e rimuovi tutti i container creati in precedenza con il seguente comando:
Puoi vedere questo comando nello screenshot qui sotto:

Sviluppo di un container Caddy con bind mounts
Ora hai creato la struttura delle cartelle sul server Ubuntu. È ora di creare un container Caddy con bind mounts.
- Prima di procedere, scopri dove il container con cui stai lavorando archivia i dati persistenti. Tale posizione sarà diversa a seconda di chi ha creato l’immagine Docker e a quale scopo serve.
Il tuo miglior opzione per trovare dove vengono memorizzati i dati persistenti è controllare la documentazione all’interno del Docker Hub per l’immagine in questione. Per Caddy, puoi trovare la documentazione qui:

2. Avvia il container usando il comando sottostante. Il parametro -v ~/containers/caddy/files:/usr/share/caddy
sta mappando il percorso prima dei due punti (~/containers/caddy/files) alla cartella all’interno del container (/usr/share/caddy). Questo funziona in modo estremamente simile al comando di mappatura della porta: tranne che stai mappando una cartella invece di una porta. Questo tipo di comando è chiamato Bind Mount.
la tilde (
~
) nel codice sopra si riferisce alla cartella home. Per questo articolo, è equivalente a/home/homelab
.
3. Apri un browser e torna all’indirizzo http del tuo server. Noterai che il server sta ora servendo una pagina 404
. Questo è previsto perché attualmente non hai un file index.html in ~/containers/caddy/files.
4. Crea un file index.html in ~/containers/caddy/files sul server Ubuntu nella finestra di esplorazione di VS Code che assomiglia al seguente:
5. Naviga all’indirizzo HTTP del tuo server e conferma che il container sta ora servendo la tua nuova pagina index.html.
Puoi vedere tutto quanto sopra nell’animazione seguente:

A differenza dei comandi di gestione di Docker, i file che stai creando (come index.html) non richiedono privilegi amministrativi. Questo perché possiedi il contenuto che il server caddy sta servendo, in quanto si trovano nella tua cartella home.
Convalida del Bind Mount
Eccellente! Non solo stai utilizzando un container Docker completamente nuovo, ma questo container sta servendo contenuti salvati localmente nella tua cartella home! Puoi dimostrarlo eseguendo il seguente comando:
- Ferma e rimuovi il container in esecuzione. Questo passaggio rimuove completamente tutto, incluso il file index.html se non stavi utilizzando i bind mount.
2. Crea un nuovo container.
3. Verifica che il nuovo container stia ancora servendo il file index.html all’indirizzo http://<il tuo server>
.
Creazione di Container Docker Persistenti
A container isn’t that useful if it stops when the server reboots. By default, that’s what is going to happen if you don’t make it happen. To prevent this, let’s generate a new caddy container again but this time once that restarts when the Docker host, Ubuntu in this case, restarts.
- Ferma e rimuovi tutti i container in esecuzione.
2. Riavvia il container caddy con il parametro --restart always
, per impostare questo nuovo container in modo che si avvii con l’host al riavvio. Con il flag --restart always
in posizione, il tuo container ora si comporta come un servizio corretto: si avvia automaticamente all’avvio.
3. Riavvia il server.
4. Verifica ora che il nuovo container si avvii e stia ancora servendo il file index.html all’indirizzo http://<il tuo server>
.
Puoi vedere i seguenti comandi applicati di seguito:

Procedendo
A questo punto, dovresti avere un ambiente Docker funzionante e una conoscenza di base delle immagini e dei contenitori. Puoi eseguire il pull, avviare, fermare e gestire in modo basilare i tuoi contenitori. Hai anche creato con successo un contenitore di servizio web in esecuzione utilizzando bind mounts e il mapping delle porte.
Ci sono ancora molte cose da approfondire riguardo a Docker: Resta sintonizzato su questo spazio, poiché il prossimo articolo tratterà della gestione avanzata di Docker utilizzando Docker Compose.