Cos’è Docker?

Docker è una piattaforma open-source che permette di eseguire applicazioni all’interno di ambienti isolati chiamati container.

Un container contiene tutto il necessario per far funzionare un’applicazione, software, librerie e tutte le sue dipendenze. In questo modo un’applicazione può essere installata, aggiornata e/o rimossa senza modificare direttamente il sistema operativo principale.

Questo approccio è particolarmente utile su un server che ospita diversi servizi contemporaneamente, come ad esempio un servizio web, un database o qualsiasi altra applicazione.


Container e macchine virtuali

È importante capire che un container non è una macchina virtuale (Virtual Machine).

Una macchina virtuale (più comunemente chiamata VM) emula un intero computer, includendo un sistema operativo completo al suo interno. Un container invece utilizza il kernel Linux del sistema operativo ospitante, isolando solamente i processi e le risorse necessarie all’applicazione senza dover emulare un intero sistema operativo.

Questo porta diversi vantaggi:

  • Leggerezza, i container consumano molte meno risorse rispetto alle macchine virtuali, richiedendo meno RAM e CPU;
  • Velocità, un container può essere avviato in pochi secondi;
  • Portabilità, la stessa immagine Docker può essere eseguita su macchine differenti mantenendo lo stesso comportamento;
  • Semplicità di gestione, installare, aggiornare e/o rimuovere un servizio diventa molto più semplice.

Concetti fondamentali

Prima di iniziare è importante conoscere alcuni concetti fondamentali.

Immagine

Un’immagine Docker è un modello pronto all’uso contenente tutto il necessario per creare un container.

Ad esempio, un’immagine può contenere un server web o un database.

Container

Un container è un’istanza in esecuzione di un’immagine. La stessa immagine può generare più container indipendenti.

Volume

I container sono progettati per essere temporanei, se vengono eliminati, anche i dati al loro interno vengono persi. I volumi Docker permettono di salvare dati persistenti all’esterno del container, come ad esempio:

  • database;
  • configurazioni;
  • file degli utenti;
  • dati persistenti dell’applicazione;

Network

Docker permette ai container di comunicare tra loro attraverso reti virtuali.

Questo permette, ad esempio, di creare ambienti isolati dove diversi servizi possono comunicare tra loro senza dover essere necessariamente esposti direttamente sulla rete pubblica.


Docker Compose

Quando un’applicazione è composta da più servizi, gestire manualmente ogni singolo container può diventare complicato.

Docker Compose permette di definire un’intera applicazione attraverso un semplice file YAML, solitamente chiamato:

1
compose.yml

All’interno del file vengono definiti:

  • quali immagini utilizzare;
  • quali porte aprire;
  • quali volumi montare;
  • quali variabili configurare;
  • come collegare i vari container tra loro.

Ad esempio, un servizio web potrebbe essere composto da:

Container Web
      |
      |
Container Database

e Docker Compose permette di avviare l’intera applicazione con un solo comando:

1
docker compose up -d

Installazione di Docker su Linux

Vediamo quindi come installare Docker sulle principali distribuzioni Linux.

Debian e derivate

Prima di procedere è consigliato rimuovere eventuali versioni precedenti o pacchetti Docker installati tramite i repository della distribuzione.

Eseguiamo sul terminale:

1
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt remove $pkg; done

Installiamo i pacchetti necessari:

1
2
3
sudo apt update

sudo apt install ca-certificates curl gnupg

Creiamo la directory per le chiavi GPG:

1
sudo install -m 0755 -d /etc/apt/keyrings

Scarichiamo la chiave ufficiale Docker:

1
2
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release && echo "$ID")/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

Impostiamo i permessi corretti:

1
sudo chmod a+r /etc/apt/keyrings/docker.gpg

Aggiungiamo il repository ufficiale Docker:

1
2
3
4
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/$(. /etc/os-release && echo "$ID") \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Aggiorniamo nuovamente i repository:

1
sudo apt update

Installiamo Docker Engine e Docker Compose confermando l’installazione quando richiesto:

1
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Red Hat e derivate

Questa procedura è valida per Fedora, Red Hat Enterprise Linux (RHEL), AlmaLinux, Rocky Linux e le relative distribuzioni derivate.

Prima di procedere rimuoviamo eventuali vecchie installazioni:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
sudo dnf remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine \
podman \
runc

Installiamo i pacchetti necessari:

1
sudo dnf -y install dnf-plugins-core

Aggiungiamo il repository ufficiale Docker.

Nota: Docker distribuisce un repository dedicato per Fedora, mentre Red Hat Enterprise Linux, AlmaLinux e Rocky Linux utilizzano il repository compatibile con CentOS.

Per Fedora:

1
sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo

Per RHEL, AlmaLinux e Rocky Linux:

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

Installiamo Docker Engine e Docker Compose:

1
sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Arch Linux e derivate

Su Arch Linux Docker è disponibile direttamente nei repository ufficiali della distribuzione.

Digitiamo sul terminale:

1
sudo pacman -S docker docker-compose

Configurazione post installazione

Abilitiamo Docker all’avvio del sistema:

1
sudo systemctl enable docker

Avviamo quindi il servizio docker:

1
sudo systemctl start docker

E verifichiamo che il servizio sia correttamente in esecuzione:

1
systemctl status docker

Utilizzare Docker senza “sudo”

Per impostazione predefinita Docker richiede privilegi amministrativi e i comandi devono essere eseguiti tramite sudo. Per permettere al nostro utente di eseguire i comandi Docker senza utilizzare ogni volta sudo, aggiungiamolo al gruppo docker:

1
sudo usermod -aG docker $USER

⚠️ Attenzione: L’appartenenza al gruppo docker equivale, nella pratica, ad avere privilegi amministrativi sul sistema. Aggiungi solamente utenti di cui ti fidi.

Per rendere effettive le modifiche è necessario effettuare il logout dalla sessione corrente:

1
exit

E dopo aver effettuato nuovamente l’accesso possiamo verificare che Docker sia stato installato correttamente.

Eseguiamo:

1
docker version && docker compose version

L’output dovrebbe essere simile al seguente:

Infine eseguiamo il classico container di test fornito da Docker:

1
docker run --rm hello-world

Se tutto è andato a buon fine, Docker scaricherà automaticamente l’immagine hello-world, creerà un container temporaneo e mostrerà un messaggio di conferma.

Da questo momento potrai installare ed eseguire qualsiasi applicazione distribuita tramite Docker e Docker Compose.