🐳 Docker

Multilingual DevOps cheat sheet: Linux, Docker, Git, Kubernetes, Helm, Terraform, practical scenarios & templates.
Data di Pubblicazione

31 agosto 2025

Docker è una piattaforma per l’esecuzione di applicazioni in container isolati. Questo cheat sheet contiene comandi per lavorare con immagini, container, reti, volumi, oltre a Docker Compose e Swarm.

📦 Comandi di base

Comando

Esempio

Descrizione

docker Il comando principale della CLI Docker usato per eseguire sottocomandi e gestire container, immagini, reti e volumi
docker version Mostra la versione di Docker installata (client e server). Utile per la verifica dell’installazione
docker version --format '{{.Client.APIVersion}}'

Mostra solo la versione API del client Docker

docker version --format '{{.Server.Version}}'

Mostra solo la versione del server Docker (Engine)

docker version --format '{{json .}}'

Mostra le informazioni complete sulla versione in formato JSON

docker system info Mostra informazioni generali sul sistema Docker: numero di container, immagini, risorse
docker info

Mostra dati Docker: versioni, reti, numero di container e immagini

docker info --format '{{json .}}'

Mostra info in formato JSON — utile per l’automazione

docker info --format '{{.NCPU}} CPUs, {{.MemTotal}} bytes RAM'

Mostra numero di CPU e memoria totale

docker info --format '{{.Driver}}'

Mostra il driver di storage utilizzato da Docker

docker image pull Scarica un’immagine da Docker Hub o da un altro registry. I container non possono essere eseguiti senza immagini
docker pull ubuntu

Scarica l’ultima immagine disponibile di Ubuntu

docker pull nginx:alpine

Scarica l’immagine leggera di Nginx basata su Alpine Linux

docker pull redis:7

Scarica l’immagine di Redis versione 7

docker container run Crea ed esegui un nuovo container da un’immagine
docker run -it ubuntu bash

Esegui Ubuntu con un terminale Bash interattivo

docker run -d nginx

Esegui Nginx in modalità detached (in background)

docker run -p 8080:80 nginx

Esegui Nginx e collega la porta 80 del container alla porta 8080 dell’host

docker container ls Elenca i container in esecuzione
docker ps

Mostra solo i container in esecuzione

docker ps -a

Mostra tutti i container, inclusi quelli fermati

docker ps --format '{{.Names}}'

Mostra solo i nomi dei container

docker container start Avvia uno o più container fermati
docker start container_name

Avvia un container per nome

docker start $(docker ps -aq)

Avvia tutti i container

docker start -ai container_name

Avvia un container e collega un terminale interattivo

docker container stop Ferma un container in esecuzione
docker stop container_name

Ferma un container per nome

docker stop $(docker ps -q)

Ferma tutti i container in esecuzione

docker stop -t 5 container_name

Ferma un container concedendo 5 secondi per terminare i processi

docker container restart Riavvia un container
docker restart container_name

Riavvia un container specifico

docker restart $(docker ps -q)

Riavvia tutti i container in esecuzione

docker restart -t 10 container_name

Riavvia un container con un ritardo di 10 secondi

docker container rm Rimuove un container
docker rm container_name

Rimuove un container fermato specifico

docker rm $(docker ps -aq)

Rimuove tutti i container fermati

docker rm -f container_name

Forza la rimozione di un container in esecuzione

docker image ls Elenca le immagini scaricate
docker images

Mostra tutte le immagini sull’host

docker images -a

Mostra tutte le immagini, incluse le layer intermedie

docker images --format '{{.Repository}}:{{.Tag}}'

Mostra solo nomi e tag delle immagini

docker image rm Rimuove una o più immagini dallo storage locale
docker rmi test1:latest

Rimuove l’immagine con tag latest dal repository test1

docker rmi 1a2b3c4d5e6f

Rimuove un’immagine tramite ID

docker rmi $(docker images -q)

Rimuove tutte le immagini (usare con cautela!)

🔁 Gestione dei container

Comando

Esempio

Descrizione

docker container exec Esegui un comando all’interno di un container in esecuzione
docker exec -it container bash

Avvia una shell bash interattiva all’interno del container chiamato container

docker exec container ls /app

Esegui il comando ls nella directory /app all’interno del container

docker exec -d container touch /tmp/testfile

Esegui un comando nel container in modalità detached (senza attendere)

docker container logs Visualizza i log di un container
docker logs container

Mostra tutti i log del container container

docker logs -f container

Segui i log del container in tempo reale

docker logs --tail 50 container

Mostra le ultime 50 righe di log

docker inspect Recupera informazioni dettagliate in JSON su un container o un’immagine
docker inspect container

Mostra i dettagli del container container

docker inspect --format '{{.NetworkSettings.IPAddress}}' container

Mostra l’indirizzo IP del container

docker container stats Mostra statistiche in tempo reale sull’utilizzo delle risorse dei container
docker stats

Mostra CPU, memoria, rete e utilizzo disco di tutti i container

docker stats container_name

Mostra statistiche solo per un container specifico

docker stats --no-stream

Mostra uno snapshot unico delle statistiche ed esci

docker container rename Rinomina un container
docker rename old_name new_name

Rinomina un container da old_name a new_name

docker container cp Copia file tra un container e l’host
docker cp container:/src/file.txt ./file.txt

Copia un file dal container alla directory corrente dell’host

docker cp ./config.yaml container:/app/config.yaml

Copia un file dall’host al container

docker cp CONTAINER:/var/logs/app.log - | tar x -O | grep "ERROR"

Trasmetti un file di log dal container e filtra le righe con “ERROR” senza salvarlo su disco

docker container top Mostra i processi in esecuzione all’interno di un container
docker top container

Mostra i processi del container chiamato container

docker container pause Metti in pausa tutti i processi di un container
docker pause container

Metti in pausa il container container

docker container unpause Riprendi l’esecuzione di un container in pausa
docker unpause container

Riprendi il container container

docker container update Aggiorna le impostazioni di un container senza riavvio
docker update --memory 500m container

Limita l’uso della memoria del container a 500 MB

🧱 Immagini e Dockerfile

Comando

Esempio

Descrizione

docker buildx build Crea un’immagine Docker da un Dockerfile
docker build -t my_image .

Crea un’immagine con tag my_image dalla directory corrente

docker build -t my_image:1.0 .

Crea un’immagine con tag di versione 1.0

docker build --no-cache -t my_image .

Crea un’immagine senza usare la cache per una build pulita

docker container commit Crea un’immagine dallo stato attuale di un container
docker commit container my_img:v1

Crea l’immagine my_img con tag v1 dal container container

docker commit -m "Added config" container my_img:v2

Crea un’immagine con un messaggio di commit

docker commit -a "John Doe" container my_img:latest

Crea un’immagine specificando l’autore

docker image tag Aggiungi o modifica un tag di un’immagine
docker tag my_image myrepo/my_image:latest

Aggiungi un tag per il push al registry myrepo

docker tag my_image:1.0 my_image:stable

Crea il tag stable per l’immagine con tag 1.0

docker tag my_image my_image:backup

Aggiungi un tag backup a un’immagine locale

docker image push Invia un’immagine a Docker Hub o a un altro registry
docker push myrepo/my_image:latest

Invia l’immagine con tag latest al repository myrepo

docker push myrepo/my_image:1.0

Invia l’immagine con tag 1.0

docker push myrepo/my_image

Invia l’immagine con tag predefinito latest

docker login Autenticati su Docker Hub o su un altro registry
docker login

Inserisci nome utente e password interattivamente per Docker Hub

docker login myregistry.local:5000

Accedi a un registry privato

docker login -u username -p password

Accedi con nome utente e password (non raccomandato)

docker logout Disconnettiti da Docker Hub o da un altro registry
docker logout

Disconnettiti da Docker Hub

docker logout myregistry.local:5000

Disconnettiti da un registry privato

HEALTHCHECK Istruzione Dockerfile per controllare automaticamente lo stato di salute del container
HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD curl -f http://localhost/ || exit 1

Aggiungi un health check per verificare la disponibilità del servizio ogni 30 secondi

docker inspect --format='{{json .State.Health}}' container_name

Controlla lo stato dell’healthcheck di un container in esecuzione

🔌 Reti e volumi

Comando

Esempio

Descrizione

docker network ls Elenca tutte le reti Docker
docker network ls

Mostra tutte le reti create

docker network ls --filter driver=bridge

Mostra solo le reti con driver bridge

docker network ls --format '{{.Name}}'

Mostra solo i nomi delle reti

docker network create Crea una nuova rete Docker
docker network create my_net

Crea una rete chiamata my_net con impostazioni predefinite

docker network create --driver bridge my_bridge_net

Crea una rete con driver bridge

docker network create --subnet=192.168.10.0/24 my_custom_net

Crea una rete con una subnet specificata

docker network connect Collega un container a una rete
docker network connect my_net container

Collega il container container alla rete my_net

docker network connect --alias db_net my_net container

Collega con alias db_net

docker network disconnect Disconnetti un container da una rete
docker network disconnect my_net container

Disconnetti il container container dalla rete my_net

docker volume ls Elenca tutti i volumi Docker
docker volume ls

Mostra tutti i volumi Docker

docker volume ls --filter dangling=true

Mostra i volumi non utilizzati

docker volume create Crea un nuovo volume Docker
docker volume create my_vol

Crea un volume chiamato my_vol

docker volume create --driver local --opt type=tmpfs my_tmp_vol

Crea un volume temporaneo usando tmpfs

docker volume inspect Mostra informazioni dettagliate su un volume
docker volume inspect my_vol

Mostra i dettagli del volume my_vol in formato JSON

docker volume rm Rimuove uno o più volumi
docker volume rm my_vol

Rimuove il volume chiamato my_vol

docker volume rm $(docker volume ls -qf dangling=true)

Rimuove tutti i volumi non utilizzati

🧩 Plugin Docker

Comando

Esempio

Descrizione

docker plugin ls Elenca i plugin Docker installati
docker plugin ls

Mostra tutti i plugin e il loro stato

docker plugin install Installa un plugin Docker da un registry
docker plugin install vieux/sshfs

Installa il plugin volume SSHFS

docker plugin install store/weaveworks/net-plugin:latest_release

Installa il plugin di rete Weave

docker plugin disable Disabilita un plugin installato
docker plugin disable vieux/sshfs

Disabilita il plugin SSHFS

docker plugin enable Abilita un plugin precedentemente disabilitato
docker plugin enable vieux/sshfs

Abilita il plugin SSHFS

docker plugin rm Rimuove un plugin Docker
docker plugin rm vieux/sshfs

Rimuove il plugin SSHFS

📋 Docker Compose

Comando

Esempio

Descrizione

docker compose up Avvia i container definiti in docker-compose.yml
docker compose up

Avvia tutti i servizi nella directory corrente in modalità interattiva

docker compose up -d

Avvia i servizi in modalità detached (background)

docker compose up --build

Compila le immagini prima di avviare i servizi

docker compose down Ferma e rimuove container, reti e volumi creati da up
docker compose down

Ferma tutti i servizi in esecuzione e rimuovi le risorse associate

docker compose down --volumes

Rimuovi anche i volumi creati da Compose

docker compose down --rmi all

Rimuovi anche le immagini create da Compose

docker compose logs Visualizza i log di tutti i servizi o di quelli specificati
docker compose logs

Mostra i log di tutti i servizi

docker compose logs -f

Segui i log in tempo reale

docker compose logs web

Mostra i log solo per il servizio web

docker compose exec Esegui un comando all’interno di un container di servizio in esecuzione
docker compose exec web bash

Entra in una shell bash interattiva all’interno del container del servizio web

docker compose exec db ls /var/lib/postgresql

Esegui il comando ls all’interno del container del database

docker compose exec -d worker touch /tmp/done

Esegui un comando all’interno del container worker in modalità detached

docker compose build Crea o ricrea le immagini dei servizi
docker compose build

Compila tutte le immagini definite in docker-compose.yml

docker compose build web

Compila solo l’immagine del servizio web

docker compose build --no-cache

Compila le immagini senza usare la cache

docker compose ps Mostra lo stato di tutti i servizi e container
docker compose ps -a

Mostra tutti i container, inclusi quelli fermati

docker compose ps --services

Mostra solo i nomi dei servizi

docker compose pull Scarica/aggiorna le immagini dei servizi dal registry
docker compose pull web

Scarica l’immagine solo per il servizio web

docker compose pull --ignore-pull-failures

Continua a scaricare anche se alcune immagini falliscono

docker compose restart Riavvia tutti i servizi o quelli specificati
docker compose restart db

Riavvia solo il servizio db

docker compose restart -t 10

Riavvia i servizi con un timeout di 10 secondi

docker compose config Mostra la configurazione finale di Compose in formato YAML
docker compose config --services

Elenca tutti i servizi nella configurazione

docker compose config --volumes

Elenca tutti i volumi definiti nella configurazione

docker compose start Avvia servizi fermati senza ricreare i container
docker compose start web

Avvia il servizio web

docker compose start db api

Avvia più servizi contemporaneamente

docker compose stop Ferma i servizi senza rimuovere i container
docker compose stop web

Ferma il servizio web

docker compose stop -t 5

Ferma i servizi con un timeout di 5 secondi

📤 Esportazione e Importazione

Comando

Esempio

Descrizione

docker image save Salva una o più immagini Docker in un archivio tar per successiva importazione o trasferimento
docker save -o image.tar my_img:tag

Salva un’immagine Docker in un file tar

docker save my_image > my_image.tar

Metodo alternativo per salvare un’immagine in un file

docker save -o redis_latest.tar redis:latest

Salva un’immagine specifica di Redis in un file

docker image load Carica immagini Docker da un archivio tar precedentemente salvato
docker load < image.tar

Carica un’immagine Docker da un file tar

docker load --input redis_latest.tar

Carica un’immagine specificando il file come parametro

docker load --quiet < my_image.tar

Carica un’immagine senza output di avanzamento

docker container export Esporta il filesystem di un container come archivio tar senza cronologia o metadati dell’immagine
docker export container > file.tar

Esporta il filesystem di un container in un archivio

docker export my_container > my_container_fs.tar

Esporta un container per nome

docker export -o container_fs.tar container_id

Esporta per ID container usando il flag -o

docker image import Crea una nuova immagine da un archivio tar di un filesystem
docker import file.tar new_img

Importa un file archivio come nuova immagine Docker

docker import https://example.com/image.tar my_new_image

Importa un’immagine direttamente da un URL

docker import - my_image < file.tar

Importa da input standard

🧹 Pulizia e Diagnostica

Comando

Esempio

Descrizione

docker system df Mostra l’utilizzo disco di Docker: volumi, immagini, container e cache di build
docker system df -v

Output dettagliato con info su ciascuna immagine, container e volume

docker system df --format '{{json .}}'

Mostra informazioni in formato JSON

docker system prune Rimuove tutti i dati Docker non utilizzati: container fermati, reti inutilizzate, immagini dangling e cache di build
docker system prune -a

Rimuove immagini non utilizzate incluse quelle intermedie

docker system prune --volumes

Rimuove volumi inutilizzati insieme ad altre risorse

docker image prune Rimuove immagini Docker non utilizzate incluse le layer dangling
docker image prune -a

Rimuove tutte le immagini non utilizzate incluse quelle dangling

docker image prune --filter "until=24h"

Rimuove immagini più vecchie di 24 ore

docker container prune Rimuove container fermati in base a filtri o tutti se non specificato
docker container prune --filter "until=24h"

Rimuove container fermati da più di 24 ore

docker container prune --force

Rimuove senza richiesta di conferma

🐝 Docker Swarm

Comando

Esempio

Descrizione

docker swarm init Inizializza un nuovo cluster Docker Swarm sul nodo corrente
docker swarm init --advertise-addr 192.168.1.100

Inizializza il cluster specificando l’indirizzo IP

docker swarm init --listen-addr 0.0.0.0:2377

Inizializza con una porta di ascolto specificata

docker service create Crea un nuovo servizio nel cluster Swarm
docker service create --name nginx nginx

Crea un servizio Nginx in Swarm

docker service create --replicas 3 --name web webserver

Crea un servizio con 3 repliche

docker service create --name redis --publish 6379:6379 redis

Crea un servizio con mapping delle porte

docker stack deploy Distribuisce uno stack di servizi nel cluster Swarm basato su un file Compose
docker stack deploy -c docker-compose.yml mystack

Distribuisci lo stack da un file compose

docker stack deploy --with-registry-auth -c compose.yml mystack

Distribuisci con inoltro delle credenziali di registry

docker stack deploy -c swarm-compose.yml mystack

Usa un file compose alternativo per lo stack

docker stack rm Rimuove uno o più stack dal cluster Swarm
docker stack rm mystack

Rimuove lo stack mystack

docker stack rm

Rimuove tutti gli stack (non raccomandato)

docker stack rm mystack && docker swarm leave --force

Rimuove uno stack e lascia Swarm

💼 Utilizzo avanzato di Docker

🚀 Comandi Docker professionali

Comando

Esempio

Descrizione

docker buildx Strumento avanzato di build immagini che sostituisce docker build. Supporta multi-piattaforma, caching, build parallele ed esportazione in vari formati. Utile per CI/CD e sviluppo cross-platform
docker buildx build --platform linux/arm64,linux/amd64 -t myimg:multi .

Compila un’immagine multi-piattaforma (ARM e x86 simultaneamente)

docker buildx build --load -t localimg .

Compila un’immagine e caricala nella cache del Docker Engine locale

docker buildx build --push --platform linux/amd64,linux/arm64 -t repo/app:latest .

Compila e invia un’immagine multi-piattaforma a un registry

docker context Gestisci i contesti Docker per lavorare con ambienti remoti o multipli. Consente passaggi rapidi tra Docker Engine locale e remoto
docker context create myremote --docker "host=ssh://user@host"

Crea un contesto per connetterti a un host Docker remoto

docker context use myremote

Passa al contesto remoto

docker context ls

Elenca i contesti disponibili e quello attivo

docker system events Ascolta eventi Docker in tempo reale, filtrati per tipo (es. avvio container). Utile per monitoraggio e automazione
docker events --filter 'event=start'

Mostra solo eventi di avvio container

docker events --since 1h --until 10m

Mostra eventi dell’ultima ora fino a 10 minuti fa

docker events --filter 'type=network'

Mostra solo eventi relativi alla rete

docker events --filter 'image=nginx'

Mostra eventi relativi all’immagine nginx

docker container update Cambia i limiti di risorse e le impostazioni di un container in esecuzione senza riavvio
docker update --cpus 2 --memory 1g my_container

Imposta limite a 2 CPU e 1 GB di RAM

docker update --restart unless-stopped my_container

Imposta la policy di riavvio automatico su unless-stopped

docker update --pids-limit 200 my_container

Limita il numero di processi a 200

docker container diff Mostra le modifiche al filesystem di un container rispetto alla sua immagine originale. Utile per debug e auditing
docker diff my_container

Mostra tutte le modifiche al filesystem del container

docker diff my_container | grep '^A'

Mostra solo i file aggiunti (A — Added)

docker image history Mostra la cronologia dei layer di un’immagine: comandi di build, dimensione di ogni layer e tempo di creazione. Utile per ottimizzazione e auditing
docker history my_image

Mostra la cronologia dei layer di un’immagine

docker history --no-trunc my_image

Mostra i comandi di build completi senza troncamento

docker history --format "{{.CreatedBy}}: {{.Size}}" my_image

Mostra solo comandi di build e dimensioni dei layer

🛠 Buone pratiche Docker e automazione

  • Minimizzare la dimensione dell’immagine
    Usa immagini base come alpine o scratch per dimensioni minime.
    Per unire i layer, puoi usare --squash durante la build (richiede funzionalità sperimentali abilitate).
    Inoltre, rimuovi file temporanei e cache in un unico layer:

    RUN apk add --no-cache curl && rm -rf /var/cache/apk/*
  • Minimizzare il numero di layer
    Combina comandi in un unico RUN per ridurre il numero di layer e la dimensione finale dell’immagine:

    RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
  • Ottimizzare la build del Dockerfile
    Usa build multi-stage così che solo i file necessari rimangano nell’immagine finale.
    Copia e installa le dipendenze prima, poi copia il codice — questo migliora la cache dei layer e velocizza le ricompilazioni.

  • Separare segreti e configurazioni
    Non archiviare mai file .env, chiavi API o certificati privati dentro l’immagine.
    Usa per la configurazione:

    • docker secret (in Swarm)
    • variabili d’ambiente (-e VAR=value o .env)
    • volumi esterni per configurazioni

  • Segreti di build (BuildKit)
    Per passare segreti in modo sicuro durante la build, usa il flag --secret:

    docker buildx build --secret id=mysecret,src=./secret.txt .

    Nel Dockerfile, il segreto è disponibile in /run/secrets/mysecret:

    RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret

    🛡 Questo impedisce che i segreti vengano salvati nei layer dell’immagine.

  • Docker senza root
    Eseguire Docker senza privilegi root migliora la sicurezza e riduce il rischio di compromissione dell’host.
    Per abilitare:

    dockerd-rootless-setuptool.sh install
    export PATH=/usr/bin:$PATH

    Verifica:

    docker info | grep Rootless

    ⚠ Alcune funzionalità (es. inoltro porte <1024) non saranno disponibili.

  • Scansione delle immagini per vulnerabilità
    Usa strumenti integrati:

    docker scan my_image

    Oppure la nuova CLI:

    docker scout cves my_image

    Questo aiuta a rilevare vulnerabilità nelle immagini base e nelle dipendenze.

  • Monitoraggio utilizzo risorse
    Limita i container per memoria, CPU e numero di processi:

    docker run --memory=512m --cpus="1.5" --pids-limit=200 myimage

    Questo impedisce consumo eccessivo di risorse.
    Puoi anche limitare l’I/O:

    docker run --device-read-bps /dev/sda:1mb --device-write-bps /dev/sda:1mb myimage

    Utile per container che non devono sovraccaricare il sottosistema disco.

  • Pulizia automatica
    Rimuovi regolarmente immagini, container, volumi e reti inutilizzati:

    docker system prune -af --volumes

    ⚠ Attenzione: questo comando elimina tutte le risorse non utilizzate.

    Per una pulizia selettiva usa:

    docker image prune --filter "until=24h"
  • Integrazione CI/CD
    Integra build, test e deploy in GitHub Actions, GitLab CI, Jenkins pipelines.
    Esempio di step GitHub Actions:

    - run: docker build -t myapp:${GITHUB_SHA} .
    - run: docker push myapp:${GITHUB_SHA}
  • Logging e monitoraggio
    Collega driver di log (--log-driver) a sistemi centralizzati: ELK, Loki, Splunk.
    Usa Prometheus + cAdvisor per metriche dei container.

  • Deployment in produzione
    Separa configurazioni per sviluppo e produzione usando docker-compose.override.yml.
    Per alta disponibilità e scalabilità usa:

    • Docker Swarm
    • Kubernetes

🐞 Debugging e Profilazione dei Container Docker

Comando

Esempio

Descrizione

docker container exec Esegue un comando all’interno di un container in esecuzione, fornendo accesso interattivo o la possibilità di avviare processi nell’ambiente isolato del container
docker exec -it my_container bash

Avvia un terminale interattivo (bash) all’interno di un container in esecuzione

docker exec -it my_container sh

Avvia una shell minimale all’interno del container (se bash non è disponibile)

docker exec my_container ls /app

Esegui un comando all’interno del container senza modalità interattiva

docker container logs Mostra i log del container specificato, consentendo di visualizzare output ed eventi relativi al suo funzionamento per diagnostica e monitoraggio
docker logs -f --tail 100 my_container

Visualizza le ultime 100 righe di log con streaming in tempo reale

docker logs my_container

Mostra tutti i log disponibili del container

docker logs --since 1h my_container

Mostra i log dell’ultima ora

docker inspect Restituisce informazioni dettagliate in formato JSON su un oggetto Docker (container, immagine, rete, ecc.), incluse configurazioni e stato
docker inspect my_container

Ottieni info JSON complete sul container

docker inspect --format '{{.State.Pid}}' my_container

Mostra il PID del processo principale del container sull’host

docker inspect --format '{{.NetworkSettings.IPAddress}}' my_container

Mostra l’indirizzo IP del container

nsenter (with strace) Utility Linux per entrare nei namespace di un altro processo (qui, il container). Usata con strace per tracciare le system call all’interno del container per il debug
nsenter --target $(docker inspect --format '{{.State.Pid}}' my_container) --mount --uts --ipc --net --pid strace -p 1

Entra nei namespace del container e traccia le system call del processo 1

nsenter --target $(docker inspect --format '{{.State.Pid}}' my_container) --mount --uts --ipc --net --pid bash

Apri una shell bash nei namespace del container

nsenter --target $(docker inspect --format '{{.State.Pid}}' my_container) --net netstat -tulnp

Visualizza le porte aperte all’interno del container

tcpdump (inside container) Strumento da console per catturare e analizzare traffico di rete. Usato nel container per diagnosticare problemi di rete, analizzare pacchetti e monitorare connessioni
docker exec -it my_container tcpdump -i any

Cattura e analizza il traffico di rete nel container

docker exec -it my_container tcpdump -nn port 80

Cattura traffico solo sulla porta 80

docker exec -it my_container tcpdump -w /tmp/dump.pcap

Salva traffico su file per analisi successiva

docker container stats Mostra metriche di utilizzo risorse correnti (CPU, memoria, rete, disco) per uno o più container in tempo reale
docker stats my_container

Mostra in tempo reale utilizzo di CPU, memoria, rete e disco del container

docker stats

Mostra statistiche per tutti i container

docker stats --no-stream

Mostra una sola volta le statistiche ed esci

docker container top Mostra la lista dei processi in esecuzione all’interno del container, simile a ps in Linux, per analizzare l’attività del container
docker top my_container

Mostra i processi in esecuzione nel container

docker top my_container aux

Usa un formato alternativo come ps aux

docker top my_container -eo pid,cmd

Mostra solo PID e comando dei processi

docker diff Mostra le modifiche al filesystem del container rispetto alla sua immagine di base, indicando file aggiunti, modificati o eliminati
docker diff my_container

Mostra le modifiche al filesystem del container rispetto all’immagine base

docker diff my_container | grep '^A'

Mostra solo i file aggiunti (A — Added)

docker diff my_container | grep '^C'

Mostra solo i file modificati (C — Changed)

docker cp Copia file e directory tra un container e l’host, abilitando lo scambio dati e il backup
docker cp my_container:/path/to/file ./file

Copia un file dal container all’host

docker cp ./config.yaml my_container:/app/config.yaml

Copia un file dall’host al container

docker cp my_container:/var/log/app.log - | tar x -O | grep "ERROR"

Copia un file di log e filtra le righe di errore senza salvarlo su disco

💡 Per il debugging avanzato puoi usare nsenter, strace, tcpdump, gdb e altri strumenti di basso livello.

💼 Uso Avanzato di Docker Compose

🚀 Comandi Professionali di Docker Compose

Comando

Esempio

Descrizione

docker compose up Avvia e gestisce il ciclo di vita dei servizi specificati dal file docker-compose.yml con la possibilità di eseguirli in background
docker compose up -d web db

Esegui solo i servizi web e db in modalità detached

docker compose up --build

Ricompila le immagini prima di avviare i servizi

docker compose up --remove-orphans

Rimuovi container non definiti nel file compose corrente

docker compose build Compila le immagini per i servizi come descritto nel file compose con controllo cache e parallelismo
docker compose build --no-cache

Ricompila completamente le immagini senza usare cache

docker compose build --parallel

Compila tutti i servizi in parallelo per velocizzare il processo

docker compose build web

Compila l’immagine solo per il servizio web

docker compose pull Scarica le versioni più recenti delle immagini dal registry per tutti o per servizi specifici
docker compose pull

Scarica le immagini per tutti i servizi

docker compose pull db

Scarica l’immagine solo per il servizio db

docker compose pull --ignore-pull-failures

Continua l’esecuzione ignorando gli errori durante il pull delle immagini

docker compose restart Riavvia tutti o specifici servizi senza ricreare i container
docker compose restart

Riavvia tutti i servizi del progetto corrente

docker compose restart worker

Riavvia solo il servizio worker

docker compose restart web db

Riavvia più servizi contemporaneamente

docker compose exec Esegue un comando all’interno di un container di servizio in esecuzione con modalità interattiva opzionale
docker compose exec db psql -U user -d database

Esegui psql all’interno del container del servizio db

docker compose exec web sh

Apri una shell nel container web

docker compose exec api curl http://localhost:8080

Esegui una richiesta curl dal container del servizio api

docker compose config Mostra la configurazione finale di Compose considerando tutti i file e le variabili d’ambiente
docker compose config

Mostra configurazione unificata in formato YAML

docker compose config --services

Elenca tutti i servizi

docker compose config --environment

Mostra tutte le variabili d’ambiente usate dai servizi

docker compose watch Riavvia automaticamente i servizi quando cambiano i file sorgente, utile per lo sviluppo
docker compose watch

Avvia il monitoraggio dei file e riavvia i servizi ai cambiamenti

docker compose events Trasmette eventi di Compose: avvio, stop, aggiornamento servizi
docker compose events --json

Ricevi eventi in formato JSON

docker compose rm Rimuove i container dei servizi fermati
docker compose rm web db

Rimuovi i container dei servizi web e db

docker compose pause Metti in pausa l’esecuzione dei servizi
docker compose pause api

Metti in pausa il servizio api

docker compose unpause Riprendi l’esecuzione dei servizi in pausa
docker compose unpause api

Riprendi il servizio api

docker compose create Crea i container senza avviarli
docker compose create web db

Crea container per web e db ma non avviarli

docker compose images Mostra l’elenco delle immagini usate dai servizi
docker compose images

Mostra le immagini di tutti i servizi

docker compose top Mostra i processi in esecuzione all’interno dei container dei servizi
docker compose top web

Mostra i processi nei container del servizio web

🛠 Buone Pratiche e Automazione con Docker Compose

  • Separazione degli Ambienti
    Usa file docker-compose.override.yml separati per diversi ambienti — development, staging, production. Questo aiuta a isolare configurazioni ed evitare conflitti tra impostazioni.
    Puoi anche combinare più file di configurazione usando il flag -f:

    docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d

    Usa diversi file .env (.env.dev, .env.prod, ecc.) per gestire le variabili d’ambiente.

  • Archiviazione Sicura dei Segreti
    Non includere dati sensibili (password, token) direttamente nei file Compose. Usa invece:

    • file .env per variabili d’ambiente (nota che i file .env non sono cifrati e non dovrebbero essere commitati in repository pubblici)
    • docker secret e docker config per la gestione sicura di segreti e configurazioni in Docker Swarm
    • volumi esterni per file di configurazione contenenti segreti
    • sistemi esterni di gestione segreti (es. HashiCorp Vault, AWS Secrets Manager)

  • Ordine di Avvio con depends_on e healthcheck
    Per fare in modo che i servizi attendano che le dipendenze siano pronte:

    services:
      db:
        image: postgres
        healthcheck:
          test: ["CMD-SHELL", "pg_isready -U postgres"]
          interval: 10s
          retries: 5
      api:
        image: my_api
        depends_on:
          db:
            condition: service_healthy
  • Minimizzare il Downtime Durante gli Aggiornamenti
    Prima di aggiornare i servizi, esegui:

    docker compose pull && docker compose up -d --remove-orphans

    L’opzione -d esegue i container in background, e --remove-orphans rimuove i container non definiti nelle configurazioni correnti.
    Per fermare e rimuovere completamente i vecchi container se necessario:

    docker compose down --remove-orphans

    Questo garantisce che vengano caricate immagini aggiornate e che i container non utilizzati siano rimossi senza downtime.

  • Hot Reload del Codice per lo Sviluppo
    Usa volumes per montare directory locali nei container. Questo permette l’applicazione immediata delle modifiche al codice senza ricompilare le immagini.
    Presta attenzione a problemi di permessi file e cache del filesystem, specialmente su Windows e macOS, per evitare problemi di performance.

  • Hot Reload del Codice Senza Volume (Compose 2.22+)

    develop:
      watch:
        - path: ./src
          action: sync
          target: /app
  • Log Centralizzati dei Servizi
    Reindirizza i log dei container a sistemi di monitoraggio e aggregazione log come ELK Stack, Loki, Prometheus e Fluentd per analisi e allerta semplici.
    Usa i driver di logging Docker (--log-driver) per abilitare raccolta e processamento centralizzati dei log.
    Configura i driver di logging per i container in Compose:

    services:
      api:
        image: my_api
        logging:
          driver: "json-file"
          options:
            max-size: "10m"
            max-file: "3"
  • Riavvio Automatico dei Servizi
    Configura la policy di riavvio in docker-compose.yml:

    restart: unless-stopped

    Altre policy di riavvio includono:

    • no — nessun riavvio automatico (default)
    • always — riavvia sempre il container
    • on-failure — riavvia solo in caso di errori (opzionalmente con numero di retry)

    In produzione, unless-stopped è la scelta ottimale per garantire la resilienza del servizio.
    Questo abilita il recupero automatico dei servizi dopo errori o riavvii dell’host.

  • Profili di Servizio
    Consentono di eseguire solo gruppi specifici di servizi:

    services:
      db:
        image: postgres
        profiles: ["backend"]
      web:
        image: nginx
        profiles: ["frontend"]

    Per eseguire solo il profilo frontend:

    docker compose --profile frontend up

🐞 Debugging e Profilazione dei Servizi in Docker Compose

Comando

Esempio

Descrizione

docker compose exec Esegui un comando all’interno di un servizio in esecuzione, fornendo accesso al container o avviando processi individuali
docker compose exec web sh

Apri una shell all’interno del container del servizio web

docker compose exec db psql -U user -d database

Esegui il comando psql all’interno del container del servizio db

docker compose logs Visualizza i log dei servizi per diagnostica e monitoraggio
docker compose logs -f db

Visualizza i log del servizio db in tempo reale

docker compose logs --tail=50 api

Mostra le ultime 50 righe di log del servizio api

docker compose logs --since=1h web

Mostra i log dell’ultima ora per il servizio web

docker inspect Visualizza informazioni dettagliate sul container che esegue un servizio
docker inspect $(docker compose ps -q web)

Ottieni JSON con info dettagliate sul container del servizio web

docker container stats Monitora l’utilizzo risorse dei container che eseguono servizi
docker stats $(docker compose ps -q worker)

Traccia CPU, memoria e altre risorse del container del servizio worker

docker compose run --rm Esegui un container temporaneo con le impostazioni del servizio, utile per il debug
docker compose run --rm web sh

Avvia un container one-off per il servizio web con shell interattiva

docker container cp Copia file tra host e container
docker cp $(docker compose ps -q db):/dump.sql ./dump.sql

Copia un file dal container del servizio db all’host

💡 Per un debug comodo di setup multi-servizio complessi, usa docker compose run --rm per avviare container individuali con le reti e i volumi necessari senza influenzare i servizi principali.

📚 Risorse Aggiuntive

🚫 Ignorare File con .dockerignore

Aggiungi file e cartelle al file .dockerignore che non dovrebbero essere inclusi nell’immagine per ridurre la dimensione e velocizzare la build:

node_modules/
*.log
.env

⚡ Semplificazione dei Comandi con Alias

Puoi creare alias per i comandi usati frequentemente per eseguirli più velocemente:

alias dcu="docker compose up -d"
alias dcd="docker compose down"
alias dcb="docker compose build"

🧠 Consiglio: Suggerimenti sull’Uso di Docker

  • Non cercare di memorizzare tutto — usa docker --help o docker <command> --help per esplorare i comandi.
  • Esercitati regolarmente e sperimenta con progetti semplici.
  • Tieni sotto controllo la dimensione delle immagini e rimuovi file non necessari tramite .dockerignore.

🌐 Link Utili

📘 Documentazione Ufficiale Docker — guide complete e riferimenti su tutti gli argomenti Docker:
https://docs.docker.com/

📙 Docker Cheat Sheet — cheat sheet ufficiale completo di Docker:
https://dockerlabs.collabnix.com/docker/cheatsheet/

📗 Docker Hub — immagini e registry:
https://hub.docker.com/