Vai al contenuto

Impostazioni cookie

Scelga per ogni tipo quali cookie consente. Può modificare la sua scelta in qualsiasi momento tramite Impostazioni cookie in fondo a ogni pagina. Informativa sulla privacy

Necessari

Sempre attivi

Servono per accedere, conservare il carrello e ricordare le sue scelte. Sono sempre attivi.

Quali cookie?
  • weboke_sessie, weboke_klant, weboke_remember: la sua sessione e la permanenza dell'accesso
  • weboke_basket: il suo carrello
  • wkBtwIncl: visualizzazione dei prezzi con o senza IVA
  • wok_cookies: la sua scelta sui cookie, 12 mesi

Misurano quale annuncio porta a una visita o a un ordine, così non paghiamo annunci che non funzionano.

Quali cookie?
  • Google Ads tramite Google Tag Manager (_gcl_au, _gcl_aw), fino a 90 giorni
  • OpenAI Ads, annunci in ChatGPT
  • wok_aff: tramite quale partner è arrivato da noi (programma di affiliazione), 60 giorni

4,6

Paese e lingua

Ogni paese ha il suo sito, con i prezzi e l'IVA di quel paese.

Vedi

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:

  1. Il repository di Docker stesso (download.docker.com). Sempre la versione più recente, incluso il plug-in docker compose che userà nella lezione 9.3. È quanto descrive la documentazione di Docker ed è ciò che usa questo corso.
  2. Il pacchetto docker.io di 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ò che docker 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.asc

Poi 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.asc

In 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 anna

Lo 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 /host

e 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:

ParteSignificato
-dEsecuzione in background (detached)
--name proefUn nome, per non dover lavorare con lunghi ID
-p 127.0.0.1:8080:80La porta 80 nel container diventa la porta 8080 sull'host, solo su loopback
nginx:stableL'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 rimuovere

docker 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 prune

docker 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) oppure docker.io dalla distribuzione, non entrambi.
  • Il gruppo docker equivale a root; sudo docker lascia 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:tag avvia un container raggiungibile solo in locale; verifichi con ss.
  • docker ps, logs, exec, stop, rm sono 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

1. Perché l'appartenenza al gruppo docker concede di fatto privilegi di root?



2. Dopo docker run -d -p 8080:80 nginx, ss -tlnp mostra la riga 0.0.0.0:8080. Che cosa avrebbe dovuto digitare per pubblicare la porta solo in locale?



3. Un container si avvia, ma il sito web al suo interno non funziona. Che cosa controlla per prima cosa?



4. Perché si sceglie una sola fonte per Docker e non si installano insieme docker.io e docker-ce?



5. Che cosa fa docker system prune --volumes che è importante sapere?



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.




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

Un momento…

Configuri i suoi domini

Per ogni dominio imposti i nameserver, il collegamento al suo hosting e chi ne diventa l'intestatario.

Caricamento dei suoi domini…