Introduzione

Docker è un ottimo strumento per automatizzare la distribuzione di applicazioni Linux all'interno di contenitori software, ma per sfruttare appieno il suo potenziale ogni componente di un'applicazione dovrebbe essere eseguito nel proprio contenitore individuale. Per applicazioni complesse con molti componenti, l'orchestrazione di tutti i contenitori per l'avvio, la comunicazione e l'arresto insieme può diventare rapidamente ingombrante.

La community di Docker ha trovato una soluzione popolare chiamata Fig , che ti ha permesso di utilizzare un singolo file YAML per orchestrare tutti i contenitori e le configurazioni Docker. Questo è diventato così popolare che il team Docker ha deciso di creare Docker Compose in base alla fonte Fig, che ora è obsoleta. Docker Compose consente agli utenti di orchestrare più facilmente i processi dei contenitori Docker, inclusi l'avvio, l'arresto e l'impostazione dei collegamenti e dei volumi all'interno del contenitore.

In questo tutorial, ti mostreremo come installare l'ultima versione di Docker Compose per aiutarti a gestire le applicazioni multi-container su Ubuntu 18.04 LTS.

Prerequisiti

Per seguire questo articolo, avrai bisogno di un server Ubuntu 18.04 con il seguente:

Nota: anche se i prerequisiti forniscono istruzioni per l'installazione di Docker su Ubuntu 18.04, i comandi docker in questo articolo dovrebbero funzionare su altri sistemi operativi fintanto che Docker è installato.

Se il tuo intento è installare Docker Compose su un server in remoto continua a leggere, altrimenti salta il primo paragrafo "Connessione al Server" e leggi il successivo.

Connessione al Server

Per accedere al server, è necessario conoscere l'indirizzo IP. Avrai anche bisogno dell'username e della password per l'autenticazione. Per connettersi al server come utente root digitare il seguente comando:

ssh [email protected]_DEL_SERVER

Successivamente sarà necessario inserire la password dell'utente root.

Se non utilizzate l'utente root potete connettervi con un'altro nome utente utilizzando lo stesso comando, quindi modificare root con il vostro nome_utente:

ssh [email protected]_DEL_SERVER

Successivamente vi verrà chiesto di inserire la password del vostro utente.

La porta standard per connettersi tramite ssh è la 22, se il vostro server utilizza una porta diversa, sarà necessario specificarla utilizzando il parametro -p, quindi digitare il seguente comando:

ssh [email protected]_DEL_SERVER -p PORTA

Installare Docker Compose

Sebbene possiamo installare Docker Compose dal repository ufficiale di Ubuntu, si tratta di diverse versioni secondarie dietro l'ultima versione, quindi installeremo Docker Compose dal repository GitHub di Docker. Il comando seguente è leggermente diverso da quello che troverai nella pagina Release. Utilizzando il flag -o per specificare prima il file di output anziché reindirizzare l'output, questa sintassi evita di incorrere in un errore di autorizzazione negato causato durante l'utilizzo sudo.

Controlleremo la versione corrente e, se necessario, la aggiorneremo nel seguente comando:

sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

Successivamente imposteremo le autorizzazioni:

sudo chmod +x /usr/local/bin/docker-compose

Quindi verificheremo che l'installazione è andata a buon fine controllando la versione:

docker-compose --version

Questo stamperà la versione che abbiamo installato:

Outputdocker-compose version 1.21.2, build a133471

Ora che Docker Compose è installato, siamo pronti per eseguire un esempio di "Hello World".

Eseguire un contenitore con Docker Compose

Il registro pubblico Docker, Docker Hub, include un'immagine Hello World per dimostrazione e test. Illustra la configurazione minima richiesta per eseguire un contenitore tramite Docker Compose: un file YAML che chiama una singola immagine.

Innanzitutto, creeremo una directory per il file YAML e ci sposteremo in esso:

mkdir hello-world
cd hello-world

Quindi, creeremo il file YAML:

nano docker-compose.yml

Inserisci i seguenti contenuti nel file, salva il file ed esci dall'editor di testo:

nano docker-compose.yml
my-test:
 image: hello-world

La prima riga nel file YAML viene utilizzata come parte del nome del contenitore. La seconda riga specifica quale immagine utilizzare per creare il contenitore. Quando si esegue il comando docker-compose up cercherà un'immagine locale dal nome che abbiamo specificato, hello-world. Quindi salviamo e usciamo dal file.

Possiamo visualizzare manualmente le immagini sul nostro sistema con il comando docker images:

docker images

Quando non ci sono immagini locali, vengono visualizzate solo le intestazioni di colonna:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

Ora, mentre siamo ancora nella directory ~/hello-world, eseguiremo il seguente comando:

docker-compose up

La prima volta che eseguiamo il comando, se non esiste alcuna immagine locale denominata hello-world, Docker Compose la estrarrà dal repository pubblico Docker Hub:

Pulling my-test (hello-world:latest)...
latest: Pulling from library/hello-world
c04b14da8d14: Downloading [==================================================>] c04b14da8d14: Extracting [==================================================>]  c04b14da8d14: Extracting [==================================================>]  c04b14da8d14: Pull complete
Digest: sha256:0256e8a36e2070f7bf2d0b0763dbabdd67798512411de4cdcf9431a1feb60fd9
Status: Downloaded newer image for hello-world:latest
. . .

Dopo aver estratto l'immagine, docker-compose crea un contenitore, si collega ed esegue il programma Hello, che a sua volta conferma che l'installazione funzioni:

. . .
Creating helloworld_my-test_1...
Attaching to helloworld_my-test_1
my-test_1 |
my-test_1 | Hello from Docker.
my-test_1 | This message shows that your installation appears to be working correctly.
my-test_1 |
. . .

Quindi stampa una spiegazione di ciò che ha fatto:

Output of docker-compose up1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.

I contenitori Docker funzionano solo finché il comando è attivo, quindi una volta terminata l'esecuzione di hello, il contenitore si arresta. Di conseguenza, quando esaminiamo i processi attivi, verranno visualizzate le intestazioni di colonna, ma il contenitore hello-world non verrà elencato perché non è in esecuzione.

docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES

Possiamo vedere le informazioni sul contenitore, di cui avremo bisogno nel prossimo passaggio, usando il flag -a che mostra tutti i contenitori, non solo quelli attivi:

docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
06069fd5ca23        hello-world         "/hello"            22 minutes ago      Exited (0) 22 minutes ago                       drunk_payne

In questo modo vengono visualizzate le informazioni necessarie per rimuovere il contenitore al termine.

Rimuovere l'immagine (opzionale)

Per evitare l'utilizzo di spazio su disco non necessario, rimuoveremo l'immagine locale. Per fare ciò, dovremo eliminare tutti i contenitori che fanno riferimento all'immagine usando il comando docker rm, seguito dall'ID CONTAINER o dal NOME. Di seguito, stiamo usando l'ID CONTAINER dal comando docker ps -a che abbiamo appena eseguito. Assicurati di sostituire l'ID del tuo contenitore:

docker rm 06069fd5ca23

Una volta rimossi tutti i contenitori che fanno riferimento all'immagine, possiamo rimuovere l'immagine:

docker rmi hello-world

Conclusione

Abbiamo installato Docker Compose su Ubuntu 18.04 LTS, testato la nostra installazione eseguendo un esempio Hello World e rimosso l'immagine di prova e il contenitore.