Installare Docker e il Suo primo container
Modulo 9: Docker e docker compose · Tempo di lettura: 11 minuti
Obiettivo della lezione: Dopo questa lezione saprà installare Docker Engine dal repository ufficiale, avviare, visualizzare, ispezionare e rimuovere i container, e saprà perché il gruppo docker equivale a root.
Concetti chiave: Docker Engine, Docker Desktop, repository apt ufficiale, docker.io di Debian, gruppo docker, rootless mode, docker run, -d, -p, -v, --name, docker ps, docker logs, docker exec, docker stop, docker rm, docker image prune, docker system df
Quale Docker?
Su un server si installa Docker Engine: il servizio in background (dockerd) più il comando docker. Docker Desktop è un'altra cosa: un programma con finestre per Windows, macOS e desktop Linux. Non va installato su un server.
Esistono due fonti affidabili per Docker Engine:
- Il repository di Docker stesso (
download.docker.com). Sempre la versione più recente, incluso il plug-indocker composeche userà nella lezione 9.3. È quanto descrive la documentazione di Docker ed è ciò che usa questo corso. - Il pacchetto
docker.iodi Debian o Ubuntu. Più vecchio, ma aggiornato dalla distribuzione tramite i normali aggiornamenti di sicurezza (lezione 4.2). Va benissimo se preferisce non avere nulla al di fuori della distribuzione; in tal caso verifichi però chedocker compose(con uno spazio) sia disponibile.
Ne scelga una sola. Installarle insieme provoca conflitti; per questo la documentazione di Docker indica di rimuovere prima i pacchetti non ufficiali come docker.io, docker-compose e podman-docker.
Installare dal repository di Docker
Questi sono i passaggi della documentazione di Docker per Debian, con la chiave separata e un proprio Signed-By (lezione 4.1). Se preferisce, crei prima uno snapshot.
anna@web1:~$ sudo apt update
anna@web1:~$ sudo apt install ca-certificates curl
anna@web1:~$ sudo install -m 0755 -d /etc/apt/keyrings
anna@web1:~$ sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
anna@web1:~$ sudo chmod a+r /etc/apt/keyrings/docker.ascPoi il file della fonte /etc/apt/sources.list.d/docker.sources (formato deb822):
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: trixie
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.ascIn Suites va il nome in codice della Sua release (cat /etc/os-release, lezione 4.3) e in Architectures l'output di dpkg --print-architecture. Su Ubuntu l'URL è https://download.docker.com/linux/ubuntu e la suite è per esempio noble.
Quindi installi:
anna@web1:~$ sudo apt update
anna@web1:~$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
anna@web1:~$ sudo docker run hello-world
...
Hello from Docker!
This message shows that your installation appears to be working correctly.Su Debian e Ubuntu Docker si avvia da solo dopo l'installazione e anche dopo ogni riavvio (systemctl status docker, lezione 6.1).
Attenzione: unattended-upgrades (lezione 4.2) per impostazione predefinita non aggiorna automaticamente i pacchetti di questa fonte. Inserisca sudo apt update && sudo apt upgrade per Docker nel Suo ritmo di manutenzione (lezione 10.4), oppure aggiunga consapevolmente la fonte ai Suoi aggiornamenti automatici.
Il gruppo docker è root
Ovunque su internet si legge che conviene aggiungersi al gruppo docker, così da non dover più digitare sudo:
anna@web1:~$ sudo usermod -aG docker annaLo faccia solo se ha capito che cosa significa. La documentazione di Docker è chiara: il gruppo docker concede privilegi a livello di root. Chi può controllare il servizio Docker può avviare un container con l'intero disco dell'host montato al suo interno:
docker run -it -v /:/host debian chroot /hoste diventa così root sul Suo server, senza password e senza traccia nel log di sudo. La documentazione di Docker lo dice così: solo gli utenti fidati dovrebbero poter controllare il servizio Docker.
Per un server che gestisce solo Lei, è una scelta: comodità contro una via in più verso root. Più sicuro è continuare a digitare sudo docker ...; così ogni comando finisce nel log di sudo (lezione 3.2). In ogni caso non aggiunga mai al gruppo un utente che non deve essere root, come un utente di servizio per un sito web.
Rootless mode
Docker può funzionare anche senza root: il servizio e i container girano allora con un utente normale, con un proprio user namespace. Lo si installa come quell'utente con dockerd-rootless-setuptool.sh install (dal pacchetto docker-ce-rootless-extras; prima serve il pacchetto uidmap). Una falla in un container non porta così a root sull'host. Ci sono limitazioni ed è più complicato da configurare; in questo corso usiamo l'installazione normale e restiamo al sicuro con le regole di questo modulo.
Un primo vero container
Avviamo un server web nginx in un container, raggiungibile solo dal server stesso:
anna@web1:~$ sudo docker run -d --name proef -p 127.0.0.1:8080:80 nginx:stable
Unable to find image 'nginx:stable' locally
stable: Pulling from library/nginx
...
3f1c9e0d7a2b...Le parti:
| Parte | Significato |
|---|---|
-d | Esecuzione in background (detached) |
--name proef | Un nome, per non dover lavorare con lunghi ID |
-p 127.0.0.1:8080:80 | La porta 80 nel container diventa la porta 8080 sull'host, solo su loopback |
nginx:stable | L'immagine ufficiale di nginx, tag stable |
Verificare:
anna@web1:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES
3f1c9e0d7a2b nginx:stable "/docker-entrypoint.…" Up 5 seconds 127.0.0.1:8080->80/tcp proef
anna@web1:~$ curl -I http://127.0.0.1:8080
HTTP/1.1 200 OK
Server: nginx/1.28.0
anna@web1:~$ sudo ss -tlnp | grep 8080
LISTEN 0 4096 127.0.0.1:8080 0.0.0.0:* users:(("docker-proxy",pid=2211,fd=7))ss (lezione 5.1) conferma: solo su 127.0.0.1. Se avesse digitato -p 8080:80, vedrebbe 0.0.0.0:8080 e [::]:8080, e il Suo container sarebbe raggiungibile da internet, anche se ufw non consente la porta 8080 (lezione 9.3). La versione nell'header Server può essere diversa nel Suo caso.
Osservare e intervenire
anna@web1:~$ sudo docker logs proef # ciò che il programma ha scritto (stdout e stderr)
anna@web1:~$ sudo docker logs -f --tail 20 proef # le ultime 20 righe e continuare a seguire
anna@web1:~$ sudo docker exec -it proef sh # una shell nel container in esecuzione
# cat /etc/os-release
# exit
anna@web1:~$ sudo docker stop proef
anna@web1:~$ sudo docker start proef
anna@web1:~$ sudo docker rm -f proef # arrestare e rimuoveredocker logs è il primo posto in cui guardare quando un container non si comporta come previsto, proprio come journalctl per i servizi normali (lezione 6.2). Con docker exec può guardare all'interno, ma è meglio non modificare nulla lì: le modifiche nel container spariscono al prossimo aggiornamento (lezione 9.1).
Fare pulizia
Immagini e container fermati restano finché non li rimuove. Su un VPS con un disco piccolo lo spazio occupato cresce senza che se ne accorga.
anna@web1:~$ sudo docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 7 3 1.9GB 1.2GB (63%)
Containers 3 3 12MB 0B (0%)
Local Volumes 2 2 180MB 0B (0%)
Build Cache 0 0 0B 0B
anna@web1:~$ sudo docker image prunedocker image prune rimuove le immagini senza nome che non appartengono più a nulla; con -a anche tutte le immagini non usate da alcun container. Faccia attenzione con docker system prune --volumes: rimuove anche i volumi anonimi (senza nome) che in quel momento non appartengono a un container, e docker volume prune -a persino i volumi con un nome. Lì dentro possono esserci i Suoi dati. Per questo dia sempre un nome ai volumi o usi un bind mount (lezione 9.1), e controlli prima con docker volume ls.
Anche i log dei container possono crescere. Per impostazione predefinita Docker li conserva in file JSON senza limite di dimensione. Un limite si imposta in /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}Poi sudo systemctl restart docker; l'impostazione vale solo per i container creati da quel momento, quelli esistenti vanno ricreati.
In pratica
Docker su un VPS di WebOké funziona come presso qualsiasi altro provider: è software all'interno del Suo server, che installa e aggiorna Lei stesso. Su un VPS piccolo controlli regolarmente lo spazio su disco con docker system df e df -h (lezione 1.4).
Riepilogo
- Installi Docker Engine dal repository di Docker (con chiave propria e
Signed-By) oppuredocker.iodalla distribuzione, non entrambi. - Il gruppo docker equivale a root;
sudo dockerlascia una traccia nel log di sudo. La rootless mode è un'alternativa più sicura ma più limitata. docker run -d --name ... -p 127.0.0.1:host:container image:tagavvia un container raggiungibile solo in locale; verifichi conss.docker ps,logs,exec,stop,rmsono i Suoi strumenti quotidiani.- Rimuova le immagini con
docker image prune, limiti i log dei container (illimitati per impostazione predefinita) e usi con parsimonia--volumes.
Quiz
Esercizio
Esercizio O9.2: Il Suo primo container. Installi Docker Engine sul Suo server seguendo la lezione (oppure su una macchina di prova). Avvii un container nginx in ascolto solo su 127.0.0.1:8080, verifichi con docker ps, curl -I e ss -tlnp, consulti i log e poi lo rimuova. Risponda alle domande: da quale fonte ha installato Docker, che cosa ha mostrato ss per la porta 8080, e si è aggiunto al gruppo docker (perché sì o perché no)?
Esercizio O9.2: Il Suo primo container
Questo esercizio lo svolge da sé; nessuno lo verifica. Spunti ciò che ha fatto e segni l'esercizio come completato.
Se Docker proviene dalla sorgente di Docker, unattended-upgrades non lo aggiorna per impostazione predefinita; docker.io della distribuzione invece sì. ss deve mostrare 127.0.0.1:8080, non 0.0.0.0:8080. Il gruppo docker concede privilegi di root; con sudo docker ogni comando resta nel log di sudo.
Le Sue spunte e note restano solo in questo browser; non le inviamo da nessuna parte. Se ha effettuato l'accesso, conserviamo in I miei corsi solo il fatto che ha svolto l'esercizio.
Per approfondire
- Documentazione di Docker, Install Docker Engine on Debian: https://docs.docker.com/engine/install/debian/
- Documentazione di Docker, Install Docker Engine on Ubuntu: https://docs.docker.com/engine/install/ubuntu/
- Documentazione di Docker, Linux post-installation steps: https://docs.docker.com/engine/install/linux-postinstall/
- Documentazione di Docker, Docker security (Docker daemon attack surface): https://docs.docker.com/engine/security/
- Documentazione di Docker, Rootless mode: https://docs.docker.com/engine/security/rootless/
- Documentazione di Docker, JSON File logging driver: https://docs.docker.com/engine/logging/drivers/json-file/
