Vai al contenuto
Illustrazione 3D di una postazione con computer e vari container colorati impilati vicino alla scrivania.

Immagine generata con IA

Questa guida spiega come installare Docker su Ubuntu nel modo indicato da Docker, cioè dal suo repository apt ufficiale e non con i pacchetti della distribuzione. Alla fine avrete Docker Engine con Buildx e il plugin Compose. Potrete usare il comando docker senza sudo e avrete avviato un primo progetto con un file compose.yaml, quello dell’esempio ufficiale. Docker Desktop, la modalità rootless e lo script di comodo non sono trattati. I comandi sono quelli della documentazione ufficiale di Docker, elencata in fondo.

Cosa serve

I requisiti sono quelli della pagina Install Docker Engine on Ubuntu, consultata il 12 ottobre 2026.

  • Una versione a 64 bit di Ubuntu fra quelle supportate: Ubuntu Resolute 26.04 (LTS), Ubuntu Noble 24.04 (LTS) o Ubuntu Jammy 22.04 (LTS).
  • Un’architettura compatibile: x86_64 (amd64), armhf, arm64, s390x o ppc64le (ppc64el).
  • La possibilità di usare sudo: tutti i comandi di installazione della documentazione lo usano.

Sulle derivate di Ubuntu, come Linux Mint, l’installazione non è supportata ufficialmente, anche se potrebbe funzionare.

Docker e il firewall

Prima di installare c’è una cosa da sapere. Se gestite il firewall con ufw o firewalld, le porte dei contenitori che Docker pubblica scavalcano le vostre regole. Questa guida usa il backend iptables predefinito, con iptables-nft o iptables-legacy. Con questo backend le regole vanno create con iptables o ip6tables e aggiunte alla catena DOCKER-USER. Docker Engine offre anche un backend nftables sperimentale dalla versione 29.0.0, con configurazione e regole differenti (senza catena DOCKER-USER), non utilizzabile in modalità Swarm. I dettagli sono nella sezione «Firewall limitations» della pagina di installazione, che rimanda alle pagine dedicate a ufw e al filtraggio dei pacchetti.

Rimuovere i pacchetti Docker in conflitto

Ubuntu può fornire pacchetti Docker non ufficiali, che entrano in conflitto con quelli di Docker. Prima di installare vanno rimossi: docker.io, docker-compose, docker-compose-v2, docker-doc, docker-buildx e podman-docker. Se avete installato a parte containerd e runc, rimuovete anche quelli, perché Docker Engine ha le sue versioni dentro il pacchetto containerd.io.

Attenzione: il comando che segue disinstalla tutti i pacchetti dell’elenco presenti sul sistema. Se usate già Docker o Podman dai pacchetti di Ubuntu, quei programmi verranno rimossi. Prima di confermare, leggete l’elenco dei pacchetti che apt vi mostra. Immagini, contenitori, volumi e reti salvati in /var/lib/docker/ non vengono cancellati in automatico.

sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc docker-buildx podman-docker containerd runc | cut -f1)

apt potrebbe dirvi che nessuno di questi pacchetti è installato. Va bene così e potete proseguire.

In questa guida Compose si usa solo come plugin, cioè con il comando docker compose scritto con lo spazio. Il pacchetto docker-compose della distribuzione, quello con il trattino, è uno di quelli da rimuovere.

Aggiungere la chiave GPG ufficiale di Docker

Per installare da un repository esterno, apt deve poter verificare la firma dei pacchetti. Per prima cosa aggiornate l’indice dei pacchetti:

sudo apt update

Poi installate i certificati e curl, che serve a scaricare la chiave:

sudo apt install ca-certificates curl

Create la cartella dei portachiavi di apt con i permessi corretti:

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

Scaricate la chiave pubblica di Docker. Il comando salva soltanto un file, senza eseguire nulla:

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

Infine rendete la chiave leggibile da tutti, così apt può usarla. Il comando agisce solo su questo file:

sudo chmod a+r /etc/apt/keyrings/docker.asc

Se tutto è andato bene, il file /etc/apt/keyrings/docker.asc esiste e non sono comparsi messaggi di errore.

Aggiungere il repository di Docker alle sorgenti apt

Ora bisogna dire ad apt dove trovare i pacchetti. Nella pagina ufficiale, sezione «Install using the apt repository», c’è un blocco che comincia con sudo tee /etc/apt/sources.list.d/docker.sources. Copiatelo da lì così com’è, per avere sempre la versione aggiornata pubblicata da Docker.

Il blocco va incollato nel terminale tutto in una volta, dalla riga con sudo tee fino alla riga EOF compresa, e non una riga alla volta. Crea il file /etc/apt/sources.list.d/docker.sources nel formato deb822, con questi campi:

  • Types: deb
  • URIs: https://download.docker.com/linux/ubuntu
  • Suites: il nome in codice della vostra versione di Ubuntu, letto in automatico da /etc/os-release
  • Components: stable
  • Architectures: l’architettura del sistema, ricavata con dpkg --print-architecture
  • Signed-By: /etc/apt/keyrings/docker.asc, cioè la chiave scaricata prima

Poi aggiornate di nuovo l’indice, così apt legge anche il repository di Docker:

sudo apt update

Installare Docker Engine, Buildx e il plugin Compose

Un solo comando installa il motore, la riga di comando, containerd, Buildx e il plugin Compose:

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

Controllate che il servizio sia in esecuzione:

sudo systemctl status docker

Se Docker non è in esecuzione, avviatelo a mano:

sudo systemctl start docker

Per una prova completa, lanciate l’immagine di test:

sudo docker run hello-world

Il comando scarica un’immagine di prova e la avvia in un contenitore, che stampa un messaggio di conferma e poi si chiude. Se il messaggio compare, Docker Engine è installato e funziona. Resta da controllare il plugin Compose, come indica la pagina Install the Docker Compose plugin. Il comando deve rispondere con la versione installata:

docker compose version

Per ora i comandi che usano il motore Docker richiedono sudo, perché il gruppo docker esiste ma non contiene utenti. Il passaggio successivo risolve questo limite.

Usare Docker senza sudo con il gruppo docker

Il demone Docker gira sempre come root e riceve i comandi da un socket Unix. All’avvio rende il socket accessibile ai membri del gruppo docker. Se aggiungete il vostro utente a quel gruppo, potrete usare docker senza sudo. Le istruzioni sono nella pagina dei passaggi post-installazione.

Avviso di sicurezza: chi fa parte del gruppo docker ottiene privilegi equivalenti a quelli di root. Aggiungete solo utenti di cui vi fidate. Se vi serve più isolamento, la documentazione suggerisce la modalità rootless oppure di far girare Docker in una macchina virtuale.

Per prima cosa create il gruppo. Su Ubuntu, dopo l’installazione, il gruppo docker esiste già: se groupadd segnala che c’è già, passate al comando successivo.

sudo groupadd docker

Poi aggiungete il vostro utente al gruppo. $USER non va sostituito: è una variabile della shell che contiene già il nome dell’utente con cui avete fatto l’accesso.

sudo usermod -aG docker $USER

Il sistema rilegge l’appartenenza ai gruppi solo con un nuovo accesso, quindi uscite dalla sessione e rientrate. Se Ubuntu gira in una macchina virtuale, potrebbe servire riavviarla. In alternativa potete attivare subito il gruppo con il comando che segue. Vale però solo per il terminale in cui lo lanciate: negli altri terminali bisogna comunque uscire dalla sessione e rientrare.

newgrp docker

Infine controllate che Docker risponda senza sudo:

docker run hello-world

Se ricompare il messaggio di prova, la configurazione è riuscita.

Avvio automatico di Docker con systemd

Su Ubuntu il servizio Docker parte da solo all’accensione, quindi di norma non c’è niente da fare. La documentazione post-installazione riporta comunque i comandi systemd che attivano l’avvio automatico di Docker e containerd:

sudo systemctl enable docker.service
sudo systemctl enable containerd.service

Per disattivare l’avvio automatico si usa disable al posto di enable:

sudo systemctl disable docker.service
sudo systemctl disable containerd.service

Preparare il primo progetto con Docker Compose

Compose raccoglie in un solo file YAML tutti i servizi di un’applicazione. L’esempio della Quickstart ufficiale di Compose è una piccola applicazione web in Python, scritta con Flask, che conta le visite e tiene il contatore in Redis. Per seguirlo non serve conoscere Python.

Create la cartella del progetto:

mkdir compose-demo

Entrateci:

cd compose-demo

Nella cartella vanno creati alcuni file. Copiatene il contenuto dalla sezione «Step 1: Set up the project» e dall’inizio della «Step 2» della Quickstart:

  1. app.py: l’applicazione Flask. Legge indirizzo e porta di Redis dalle variabili d’ambiente e a ogni visita aumenta di uno il contatore hits.
  2. requirements.txt: le due dipendenze Python, flask e redis.
  3. Dockerfile: costruisce l’immagine partendo da python:3.12-alpine, installa le dipendenze ed espone la porta 5000. Il nome deve essere esattamente Dockerfile, senza estensione.
  4. .env: i valori di configurazione APP_PORT=8000, REDIS_HOST=redis e REDIS_PORT=6379. Compose legge questo file da solo e ne usa i valori dentro compose.yaml.
  5. .dockerignore: tiene fuori dall’immagine il file .env, che può contenere segreti, e i file temporanei di Python.
  6. compose.yaml: definisce due servizi. web viene costruito dal Dockerfile e collega la porta 8000 del computer alla 5000 del contenitore. redis usa l’immagine pubblica redis:alpine, scaricata da Docker Hub.

Avviare, controllare e fermare i servizi con Compose

Dalla cartella compose-demo avviate tutto:

docker compose up

Compose costruisce l’immagine di web, scarica quella di Redis e avvia i due contenitori, mentre il terminale mostra i log. Attenzione: la configurazione dell’esempio pubblica la porta 8000 su tutti gli indirizzi del computer, rendendo il servizio potenzialmente raggiungibile dall’esterno. Per questa prova locale, prima di eseguire docker compose up sostituite la voce ports del servizio web con "127.0.0.1:${APP_PORT}:5000". Poi aprite nel browser l’indirizzo http://localhost:8000. Dovreste leggere questa riga:

Hello from Docker! I have been seen 1 time(s).

Il numero aumenta ogni volta che ricaricate la pagina.

Con questo avvio il terminale resta occupato dai log. Per fermare i servizi potete aprire un altro terminale, entrare nella stessa cartella e scrivere il comando qui sotto. Poco più avanti trovate un modo di avviare i servizi che lascia libero il terminale.

docker compose down

Il comando rimuove i contenitori e con loro il contatore, che al prossimo avvio ripartirà da zero. La Quickstart spiega come conservarlo con un volume.

Con l’opzione -d i servizi partono in modalità distaccata e il terminale resta libero per i comandi successivi:

docker compose up -d

Per seguire in tempo reale i log di tutti i servizi:

docker compose logs -f

Ricaricate la pagina nel browser e vedrete comparire le richieste gestite da Flask. Premete Ctrl+C per smettere di seguire i log: i contenitori restano accesi. Quando avete finito, spegnete tutto con docker compose down.

Disinstallare Docker Engine

Se un giorno vorrete togliere Docker, la procedura è nella pagina di installazione. Il primo comando rimuove i pacchetti di Docker Engine, CLI, containerd, Buildx e Compose:

sudo apt purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras

Immagini, contenitori, volumi e file di configurazione personalizzati restano sul disco.

Attenzione: i due comandi che seguono cancellano definitivamente tutte le immagini, i contenitori e i volumi di Docker e containerd. Con loro spariscono anche i dati dei servizi salvati nei volumi, come database e file caricati, e non si possono recuperare. Prima di lanciarli copiate altrove quello che vi serve. Controllate anche di aver scritto il percorso esattamente come qui: un rm -rf lanciato con sudo su un percorso sbagliato può cancellare altre cartelle del sistema.

sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

Poi togliete il repository e la chiave aggiunti all’inizio:

sudo rm /etc/apt/sources.list.d/docker.sources
sudo rm /etc/apt/keyrings/docker.asc

I file di configurazione modificati da voi vanno cancellati a mano.

Se qualcosa va storto

  • Errore su ~/.docker/config.json. Se avete usato la CLI con sudo prima di entrare nel gruppo docker, potreste vedere questo avviso:
WARNING: Error loading config file: /home/user/.docker/config.json -
stat /home/user/.docker/config.json: permission denied
  • Vuol dire che i permessi della cartella ~/.docker/ sono sbagliati. Potete cancellare la cartella, che viene ricreata da sola, ma così perdete le impostazioni personalizzate. In alternativa potete restituirne la proprietà al vostro utente con i comandi della pagina post-installazione.
  • Docker chiede ancora sudo dopo l’aggiunta al gruppo. L’appartenenza ai gruppi si aggiorna solo con un nuovo accesso: uscite dalla sessione e rientrate. newgrp docker risolve solo nel terminale in cui lo lanciate. In una macchina virtuale potrebbe servire un riavvio.
  • La build del progetto Compose fallisce. Controllate che il file si chiami Dockerfile senza estensione: alcuni editor aggiungono .txt da soli.
  • L’app web va in errore all’avvio. Nell’esempio base web parte insieme a redis. Se Redis non è ancora pronto, Flask non riesce a collegarsi e va in crash. La Quickstart risolve il problema nella sezione «Step 3» con un controllo di salute (healthcheck) nel compose.yaml.

Documentazione di riferimento

Pagine ufficiali consultate il 12 ottobre 2026:

Leggi anche