Docker è una tecnologia di containerizzazione che consente di creare, testare e distribuire rapidamente applicazioni come container portatili e autosufficienti che possono essere eseguiti praticamente ovunque.

In questo tutorial, vedremo come installare Docker CE su CentOS 8 ed esploreremo i concetti e i comandi di base di Docker.

Prerequisiti

Prima di procedere con questa esercitazione, assicurarsi che siano soddisfatti i seguenti prerequisiti:

Se desideri installare Docker 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 su CentOS

Sebbene il pacchetto Docker sia disponibile nel repository ufficiale CentOS 8, potrebbe non essere sempre l'ultima versione. L'approccio consigliato è installare Docker dai repository Docker.

Per installare Docker sul tuo server CentOS 8, procedi nel seguente modo:

Inizia aggiornando i pacchetti di sistema e installa le dipendenze richieste:

sudo yum update
sudo yum install yum-utils device-mapper-persistent-data lvm2

Quindi, esegui il comando seguente che aggiungerà il repository stabile Docker al tuo sistema:

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

Ora che il repository Docker è abilitato, installa l'ultima versione di Docker CE (Community Edition) usando yum digitando:

sudo yum install docker-ce

Potresti ricevere un output simile al seguente:

CentOS-8 - AppStream                                                                                                                                                            113 kB/s | 4.3 kB     00:00
CentOS-8 - Base                                                                                                                                                                  12 kB/s | 3.9 kB     00:00
CentOS-8 - Extras                                                                                                                                                                49 kB/s | 1.5 kB     00:00
Docker CE Stable - x86_64                                                                                                                                                       201 kB/s |  21 kB     00:00
Error:
 Problem: package docker-ce-3:19.03.5-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed
  - cannot install the best candidate for the job
  - package containerd.io-1.2.10-3.2.el7.x86_64 is excluded
  - package containerd.io-1.2.2-3.3.el7.x86_64 is excluded
  - package containerd.io-1.2.2-3.el7.x86_64 is excluded
  - package containerd.io-1.2.4-3.1.el7.x86_64 is excluded
  - package containerd.io-1.2.5-3.1.el7.x86_64 is excluded
  - package containerd.io-1.2.6-3.3.el7.x86_64 is excluded
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)

Quindi installare Docker Ce con il seguente comando che permette di evitare i pacchetti non più disponibili o corrotti:

sudo yum -y install docker-ce --nobest

Una volta installato il pacchetto Docker, avvia il daemon Docker e abilitalo ad avviarsi automaticamente all'avvio:

sudo systemctl start docker
sudo systemctl enable docker

Per verificare che il servizio Docker sia in esecuzione, digitare:

sudo systemctl status docker

L'output dovrebbe assomigliare a questo:

● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2020-01-15 00:06:26 CET; 4s ago
     Docs: https://docs.docker.com
 Main PID: 11075 (dockerd)
    Tasks: 18
   Memory: 51.6M
   CGroup: /system.slice/docker.service
           ├─11075 /usr/bin/dockerd -H fd://
           └─11091 containerd --config /var/run/docker/containerd/containerd.toml --log-level info

Al momento in cui scrivo, l'attuale versione stabile di Docker è 19.03.5, per stampare il tipo di versione Docker:

docker -v
Docker version 19.03.5, build 633a0ea

Eseguire il comando Docker senza Sudo

Per impostazione predefinita, Docker richiede i privilegi di amministratore. Se si desidera eseguire i comandi Docker come utente non root senza anteporre sudo è necessario aggiungere l'utente al gruppo docker creato durante l'installazione del pacchetto Docker CE. Puoi farlo digitando:

sudo usermod -aG docker $USER

$USER è una variabile di ambiente che contiene il tuo nome utente.

Disconnettersi e riconnettersi in modo da aggiornare l'appartenenza al gruppo.

Per verificare che Docker sia installato correttamente e che sia possibile eseguire i comandi docker senza sudo, emettere il seguente comando che scaricherà un'immagine di prova, eseguirà in un contenitore e stamperà un messaggio "Hello from Docker" ed esce:

docker container run hello-world

L'output dovrebbe essere simile al seguente:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:d1668a9a1f5b42ed3f46b70b9cb7c88fd8bdc8a2d73509bb0041cf436018fbf5
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

Interfaccia della riga di comando Docker

Ora che abbiamo un'installazione Docker funzionante, passiamo alla sintassi di base della CLI Docker.

La riga di comando della finestra mobile assume la forma seguente:

docker [option] [subcommand] [arguments]

Puoi elencare tutti i comandi disponibili digitando docker senza parametri:

docker

Se hai bisogno di ulteriore aiuto su qualsiasi [subcommand], basta digitare:

docker [subcommand] --help

Immagini Docker

Un immagine Docker è costituita da una serie di strati che rappresentano istruzioni nella dell'immagine Dockerfile che compongono un'applicazione software eseguibile. Un'immagine è un file binario immutabile che include l'applicazione e tutte le altre dipendenze come binari, librerie e istruzioni necessarie per eseguire l'applicazione. In breve, un'immagine Docker è essenzialmente un'istantanea di un contenitore Docker.

Docker Hub è un servizio di registro basato su cloud che tra le altre funzionalità viene utilizzato per conservare le immagini Docker in un repository pubblico o privato.

Per cercare un'immagine nel repository Docker Hub basta usare il sottocomando search. Ad esempio, per cercare l'immagine CentOS, eseguire:

docker search centos

L'output dovrebbe essere simile al seguente:

NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   5770                [OK]
ansible/centos7-ansible            Ansible on Centos7                              126                                     [OK]
jdeathe/centos-ssh                 OpenSSH / Supervisor / EPEL/IUS/SCL Repos - …   114                                     [OK]
consol/centos-xfce-vnc             Centos container with "headless" VNC session…   108                                     [OK]
centos/mysql-57-centos7            MySQL 5.7 SQL database server                   67
imagine10255/centos6-lnmp-php56    centos6-lnmp-php56                              57                                      [OK]
tutum/centos                       Simple CentOS docker image with SSH access      44
centos/postgresql-96-centos7       PostgreSQL is an advanced Object-Relational …   39
kinogmt/centos-ssh                 CentOS with SSH                                 29                                      [OK]
pivotaldata/centos-gpdb-dev        CentOS image for GPDB development. Tag names…   10
guyton/centos6                     From official centos6 container with full up…   9                                       [OK]
nathonfowlie/centos-jre            Latest CentOS image with the JRE pre-install…   8                                       [OK]
drecom/centos-ruby                 centos ruby                                     6                                       [OK]
....

Come si può vedere i risultati delle ricerche stampe una tabella con cinque colonne, NAME, DESCRIPTION, STARS, OFFICIAL e AUTOMATED. L'immagine ufficiale è un'immagine che Docker sviluppa in collaborazione con partner.

Se vogliamo scaricare la build ufficiale di CentOS 8, possiamo farlo utilizzando il sottocomando image pull:

docker image pull centos
Using default tag: latest
latest: Pulling from library/centos
729ec3a6ada3: Pull complete
Digest: sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

A seconda della velocità di Internet, il download potrebbe richiedere alcuni secondi o alcuni minuti. Una volta scaricata l'immagine, possiamo elencare le immagini con:

docker image ls

L'output dovrebbe essere simile al seguente:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              0f3e07c0138f        3 months ago        220MB
hello-world         latest              fce289e99eb9        12 months ago       1.84kB

Se per qualche motivo vuoi eliminare un'immagine puoi farlo con il sottocomando image rm [image_name]:

docker image rm centos
Untagged: centos:latest
Untagged: [email protected]:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Deleted: sha256:0f3e07c0138fbe05abcb7a9cc7d63d9bd4c980c3f61fea5efa32e7c4217ef4da
Deleted: sha256:9e607bb861a7d58bece26dd2c02874beedd6a097c1b6eca5255d5eb0d2236983

Contenitori Docker

Un'istanza di un'immagine è chiamata contenitore. Un contenitore rappresenta un runtime per una singola applicazione, processo o servizio.

Potrebbe non essere il confronto più appropriato ma se sei un programmatore puoi pensare a un'immagine Docker come classe e contenitore Docker come istanza di una classe.

Possiamo avviare, arrestare, rimuovere e gestire un contenitore con il sottocomando docker container.

Il comando seguente avvierà un contenitore Docker basato sull'immagine CentoOS. Se non hai l'immagine localmente, la scaricherà prima:

docker container run centos

A prima vista, può sembrarti che non sia successo nulla. Il contenitore CentOS si arresta immediatamente dopo l'avvio perché non ha un processo di lunga durata e non abbiamo fornito alcun comando, quindi il contenitore si è avviato, ha eseguito un comando vuoto e quindi è uscito.

L'opzione -it ci consente di interagire con il contenitore tramite la riga di comando. Per avviare un tipo di contenitore interattivo:

docker container run -it centos /bin/bash

Come puoi vedere dall'output una volta avviato il contenitore, il prompt dei comandi viene modificato, il che significa che ora stai lavorando dall'interno del contenitore:

[[email protected] /]#

Per elencare i contenitori in esecuzione, digitare:

docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
1d11ac462fb5        centos              "/bin/bash"         6 seconds ago       Up 5 seconds                            angry_volhard

Se non si dispone di contenitori in esecuzione, l'output sarà vuoto.

Per visualizzare sia i contenitori in esecuzione che quelli fermati, usare l'opzione -a:

docker container ls -a

L'output dovrebbe essere simile al seguente:

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
1d11ac462fb5        centos              "/bin/bash"         19 seconds ago      Up 19 seconds                                     angry_volhard
31256e550edc        centos              "/bin/bash"         41 seconds ago      Exited (127) 27 seconds ago                       epic_hypatia
df0b941a0a14        centos              "/bin/bash"         52 seconds ago      Exited (0) 51 seconds ago                         nostalgic_goldwasser
34912fcfaf8e        hello-world         "/hello"            5 minutes ago       Exited (0) 5 minutes ago                          stupefied_rosalind

Per eliminare uno o più contenitori è sufficiente copiare l'ID contenitore (o gli ID) e incollarli dopo il sottocomando container rm,in questo modo:

docker container rm 34912fcfaf8e

Conclusione

Hai imparato come installare Docker sul tuo server CentOS 8 e come scaricare le immagini Docker e gestire i contenitori Docker. Potresti anche leggere informazioni su Docker Compose, che ti consente di definire ed eseguire applicazioni Docker multi-container.