Padroneggiare Docker Run: Spiegazione delle Opzioni Essenziali del Comando
Impara i flag di Docker run che usi più spesso: porte, volumi, variabili d'ambiente, nomi, modalità distaccata, politiche di riavvio e pulizia.
Padroneggiare Docker Run: Opzioni dei Comandi Essenziali Spiegate
docker run crea un nuovo contenitore da un'immagine e lo avvia. Il comando sembra semplice all'inizio, ma le opzioni determinano come il tuo contenitore si connette alla rete, memorizza i dati, riceve la configurazione e si comporta dopo un riavvio.
Usa questa guida quando conosci l'immagine che vuoi eseguire ma hai bisogno dei flag giusti per una configurazione pratica.
Sintassi di Base
docker run [OPZIONI] IMMAGINE [COMANDO] [ARG...]
IMMAGINE è il nome dell'immagine, come nginx o postgres:16. COMANDO e ARG... sono opzionali e sovrascrivono o estendono il comando predefinito dell'immagine.
Per un rapido test in primo piano:
docker run hello-world
Per servizi reali, di solito aggiungi opzioni.
Eseguire in Background con -d
Per impostazione predefinita, Docker collega il tuo terminale all'output del contenitore. La modalità distaccata esegue il contenitore in background:
docker run -d nginx
Docker stampa l'ID del nuovo contenitore e restituisce il prompt. Controllalo con:
docker ps
Leggi i log da un contenitore distaccato con:
docker logs <id_o_nome_contenitore>
Pubblicare le Porte con -p
I contenitori hanno il proprio namespace di rete. Se un servizio ascolta all'interno del contenitore, pubblica la porta per raggiungerlo dal tuo host:
docker run -d -p 8080:80 nginx
Questo mappa la porta host 8080 alla porta del contenitore 80, quindi http://localhost:8080 raggiunge Nginx.
Puoi pubblicare più di una porta:
docker run -d -p 8080:80 -p 8443:443 nginx
Per associare solo a localhost sull'host, includi l'IP dell'host:
docker run -d -p 127.0.0.1:8080:80 nginx
Questo è utile per strumenti locali che non vuoi esporre su ogni interfaccia dell'host.
Persistere i Dati con i Volumi
I layer scrivibili del contenitore non sono un buon posto per dati durevoli. Usa un bind mount quando vuoi montare un percorso host specifico nel contenitore:
docker run -d -p 8080:80 -v "$PWD/html:/usr/share/nginx/html:ro" nginx
Questo serve file dalla tua directory html locale. Il suffisso :ro rende il mount di sola lettura all'interno del contenitore.
Usa un volume nominato quando Docker dovrebbe gestire la posizione di archiviazione:
docker run -d --name postgres -v pgdata:/var/lib/postgresql/data postgres:16
Se pgdata non esiste, Docker lo crea. Ispeziona i volumi con:
docker volume ls
Per nuovi lavori, la sintassi --mount di Docker è più verbosa ma più chiara:
docker run -d --mount type=volume,src=pgdata,dst=/var/lib/postgresql/data postgres:16
Passare la Configurazione con -e e --env-file
Le variabili d'ambiente sono un modo comune per configurare le app containerizzate:
docker run -d -e APP_ENV=production my-custom-app:latest
Usa -e più di una volta per più variabili:
docker run -d -e DB_HOST=database.example.com -e DB_USER=app my-app:latest
Per molte variabili, usa un file env:
docker run -d --env-file ./app.env my-app:latest
Tieni i segreti fuori dai file .env committati. Le variabili d'ambiente sono facili da ispezionare dall'host e dai processi con accesso sufficiente, quindi usa il gestore di segreti della tua piattaforma per valori sensibili in produzione.
Assegnare Nomi ai Contenitori con --name
Docker può generare un nome, ma un nome chiaro rende più facili i comandi successivi:
docker run -d --name web -p 8080:80 nginx
Poi puoi usare:
docker logs web
docker stop web
docker exec -it web sh
I nomi dei contenitori devono essere univoci. Se web esiste già, rimuovi o rinomina il vecchio contenitore prima di riutilizzare il nome.
Usare la Modalità Interattiva con -it
Per shell e sessioni di risoluzione dei problemi, combina la modalità interattiva e un pseudo-TTY:
docker run -it ubuntu bash
Quando esci dalla shell, il contenitore si ferma. Aggiungi --rm per sessioni usa e getta:
docker run --rm -it alpine sh
Scegliere una Politica di Riavvio
Le politiche di riavvio dicono a Docker cosa fare quando un contenitore esce:
docker run -d --name web --restart unless-stopped -p 8080:80 nginx
Le politiche comuni sono:
no: non riavviare automaticamente. Questo è il valore predefinito.on-failure[:max-retries]: riavvia solo dopo un codice di uscita diverso da zero.always: riavvia ogni volta che il contenitore si ferma, incluso dopo il riavvio del demone Docker.unless-stopped: riavvia a meno che tu non abbia fermato esplicitamente il contenitore.
Per servizi locali a lunga esecuzione, unless-stopped è spesso una scelta migliore di always perché un arresto manuale rimane rispettato.
Rimuovere Contenitori Usa e Getta con --rm
I contenitori fermati rimangono su disco finché non li rimuovi. Per comandi una tantum, --rm pulisce il contenitore dopo che esce:
docker run --rm ubuntu echo "Ciao da un contenitore temporaneo"
Non usare --rm per contenitori di cui devi ispezionare lo stato fermato in seguito.
Esempio Pratico
Questo comando esegue un'app web con un nome stabile, una porta pubblicata, una directory di log montata con bind, una variabile d'ambiente e una politica di riavvio:
docker run -d \
--name my-app \
--restart on-failure \
-p 3000:80 \
-v "$PWD/logs:/app/logs" \
-e NODE_ENV=production \
my-node-app:1.0
Dopo che si avvia, verifica il contenitore e controlla i log:
docker ps
docker logs my-app
Conclusione
Inizia con il comando docker run più piccolo che funziona, poi aggiungi opzioni per il comportamento di cui hai bisogno: -d per servizi in background, -p per l'accesso, -v o --mount per i dati, -e per la configurazione, --name per le operazioni, --restart per la resilienza e --rm per esecuzioni temporanee.