Vai al contenuto principale

Eseguire un’immagine Docker come container: guida pratica per principianti

Questo tutorial ti insegna a eseguire con sicurezza immagini Docker usando docker run, con esempi chiari, consigli pratici e suggerimenti per il troubleshooting.
· 9 min leggi

Scopri con l'IA

Se ti stai chiedendo come eseguire un’immagine Docker, non sei il solo. Che tu abbia appena scaricato un’immagine da Docker Hub o l’abbia creata tu, eseguirla è il passaggio chiave che dà vita alla tua applicazione.

Questo tutorial è una guida per principianti al comando docker run e non solo. Imparerai:

  • Cosa sono davvero immagini e container Docker.
  • Come eseguire un’immagine usando diverse opzioni.
  • E come fermare, rimuovere e risolvere i problemi dei container come un professionista.

Alla fine, lancerai i tuoi container con sicurezza e capirai esattamente cosa succede sotto il cofano.

Capire immagini e container Docker

Prima di passare agli esempi di comando, capiamo immagini e container Docker in parole semplici.

Se conosci già questi termini, salta pure alla sezione successiva!

Cos’è un’immagine Docker?

Un’immagine Docker è un blueprint immutabile per la tua app. Definisce tutto ciò di cui il container ha bisogno: codice, librerie, ambiente e configurazioni. Una volta che hai un’immagine, puoi avviare un container o cento. Rimane coerente ogni volta.

Da dove arrivano le immagini? Le costruisci con una Dockerfile. In una Dockerfile definisci quale immagine di base usare, quali dipendenze installare e come deve essere eseguita la tua app.

Quando la tua Dockerfile è pronta, esegui il comando docker build. Questo comando segue i passaggi nel file e li trasforma in un’immagine riutilizzabile.

Cos’è un container Docker?

Un container Docker è la versione attiva di un’immagine Docker. Permette alla tua applicazione di girare in un ambiente isolato, garantendo un comportamento coerente indipendentemente dal sistema host. 

Segue l’approccio “build once, run anywhere”, così non devi configurare l’ambiente a mano ogni volta. 

Immagine vs container

La tabella seguente mette a confronto immagine e container:

Immagine

Container 

Un’immagine è un pacchetto standardizzato che include tutti i file, i binari, le librerie e le configurazioni per eseguire un container.

Un’istanza runtime di un’immagine.

Un’immagine è immutabile. Significa che non può cambiare finché non viene ricostruita.

Il container è mutabile. Puoi modificarlo mentre è in esecuzione, installare nuovi pacchetti o cambiare file di configurazione.

Una Dockerfile (un insieme di istruzioni per costruire un’immagine) crea un’immagine.

Un’immagine crea un container.

Il tuo computer memorizza i file immagine.

Un container gira in memoria.

Se sei alle prime armi con la containerizzazione, il nostro corso Introduzione a Docker ti guida nei concetti fondamentali con esempi pratici.

Il comando docker run

Quando esegui il comando docker run, stai dicendo a Docker di avviare un nuovo container basato su un’immagine.

In parole povere, stai lanciando un programma in un ambiente isolato. Quel programma può essere qualsiasi cosa, da una semplice web app a un servizio completo con più processi. 

Sintassi di base

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

  • [OPTIONS] - Flag extra per personalizzare come gira il container
  • IMAGE - Il nome dell’immagine Docker 
  • [COMMAND] - (Opzionale) Sovrascrive il comando predefinito nell’immagine.
  • [ARG...]- (Opzionale) Argomenti.

Flag e opzioni comuni

  • -d: Modalità detached: esegue i container in background
  • -p: Mapping delle porte: per accedere a un servizio (come un’API o una web app) dal browser, devi esporre una porta. Esempio: -p 3000:3000 mappa la porta 3000 della tua macchina alla porta 3000 del container.
  • --name: Docker assegna un nome di default al container, ma puoi usare questo flag per dargliene uno personalizzato.
  • -v:  Lo usi per tenere i dati separati dal container stesso, così restano anche se il container viene fermato o eliminato.
  • --rm: Quando il container si ferma, questo flag lo elimina automaticamente.
  • -e: Usalo per passare password del database o API key senza inserirle hardcoded nella tua app.

Esecuzione interattiva vs detached

Docker esegue i container in due modi: modalità interattiva (-it) e modalità detached (-d). Ogni modalità ha casi d’uso specifici in base ai tuoi obiettivi. 

  • -it: Modalità interattiva: se vuoi lavorare direttamente dentro un container usando il terminale, puoi usare il flag -it. Mette il container in modalità interattiva, così puoi digitare comandi, vedere l’output e lavorare in tempo reale.
    • -i: Mantiene l’input aperto così puoi digitare comandi nel container
    • -t: Ti dà un’interfaccia tipo terminale dentro il container
  • -d: Modalità detached: esegue il container in background, così il tuo terminale resta libero per altri compiti. 

Tieni a portata di mano comandi chiave e best practice con il nostro Docker for Data Science Cheat Sheet.

Scaricare ed eseguire immagini Docker

Ora che conosci la sintassi del comando docker run, questa sezione ti mostra come creare immagini personalizzate ed eseguirle.

Usare immagini da Docker Hub

Docker Hub è come una libreria online per le immagini dei container. Puoi prendere immagini precompilate o caricare le tue per condividerle con altri. Supporta sia repository pubblici che privati, così puoi condividere le immagini apertamente con la community o applicare controlli di accesso per i tuoi team interni.

Eseguire immagini personalizzate 

Per eseguire un’immagine Docker, prima devi costruirla usando una Dockerfile. Poi puoi eseguirla in locale o pubblicarla su Docker Hub per condividerla. 

Quindi, creiamo prima una Dockerfile. Ecco un esempio:

# Use official Python base image
FROM python:3.11-slim
# Set working directory in the container
WORKDIR /app
# Copy requirements file and install dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy the rest of the app code
COPY . .
EXPOSE 5000
# Set default command
CMD ["python", "app.py"]

Cosa significa la Dockerfile qui sopra?

  • FROM python:3.11-slim: immagine di base con Python versione 3.11
  • WORKDIR /app: imposta /app come directory di lavoro dentro il container.
  • COPY requirements.txt . : sposta tutte le dipendenze dalla macchina locale alla directory dell’app nel container.
  • RUN pip install --no-cache-dir -r requirements.txt: installa le dipendenze in requirements.txt.
  • COPY . . : copia il codice della directory di lavoro corrente (app, file di configurazione e altro) nella directory dell’app del container.
  • CMD ["python", "app.py"]: esegue app.py all’avvio di un container creato da questa immagine.

Passo 1. Build della Dockerfile 

Vediamo cosa succede quando esegui il build di questa Dockerfile.

  • Esegui il seguente comando:
docker build -t my-python-app .

Nota: Per far funzionare questo comando, devi prima avere Docker configurato sul tuo sistema; questa guida ti aiuta a farlo.

Immagine che mostra in terminale i risultati dell’esecuzione di docker build -t my-python-app.

Ecco cosa succede dietro le quinte quando esegui il comando di build:

  1. Docker legge la Dockerfile
  2. L’immagine base di Python viene scaricata da Docker Hub
  3. La directory di lavoro viene impostata su /app.
  4. requirements.txt viene copiato nel container.
  5. Le dipendenze vengono installate usando pip install.
  6. Il resto del tuo codice viene copiato in /app.
  7. L’immagine finale viene taggata come my-python-app.

Passo 2: Eseguire la Dockerfile

Una volta che l’immagine è stata costruita, puoi eseguirla con:

docker run -p 5000:5000 my-python-app

Ecco cosa succede quando la esegui: 

  • Viene creato un nuovo container dalla tua immagine personalizzata, my-python-app.
  • La porta 5000 della tua macchina viene mappata alla porta 5000 del container (-p 5000:5000).
  • Viene eseguito CMD ["python", "app.py"] e l’app viene avviata.
  • Il container gira in background grazie all’opzione -d (modalità detached).

A questo punto, puoi visitare http://localhost:5000 nel browser e vedrai qualcosa di simile a quanto segue, il che significa che la tua applicazione è in esecuzione:

Screenshot di un browser su http://localhost:5000 che mostra il messaggio

Se lavori nel machine learning, queste migliori immagini Docker per ML e AI possono velocizzare la configurazione del tuo ambiente.

Eseguire immagini con configurazione

Per alcune applicazioni potresti dover eseguire immagini con una configurazione specifica. Ecco due esempi comuni.

Persistenza dei dati

I container memorizzano i dati temporaneamente. Una volta che li elimini, i dati spariscono. Un volume è un modo per archiviare i dati al di fuori del container in modo che persistano anche se il container viene rimosso o riavviato.

Per montare un volume, devi eseguire un comando come il seguente:

docker run -v my-volume:/app/data my-image

I dati scritti in /app/data vengono salvati nel volume anche dopo che il container è stato rimosso.

Passare variabili d’ambiente

Le variabili d’ambiente passano impostazioni di configurazione a un container Docker in fase di esecuzione. Questo ti permette di personalizzare i container senza modificare le immagini Docker. 

Hai due modi per passare variabili d’ambiente: 

  1. Puoi passarle usando il parametro -e. Ecco un esempio di comando:
docker run -e ENV=production -e DEBUG=False my-image
  1. Puoi creare un file .env con tutte le variabili d’ambiente e passarlo al comando. Ecco un esempio:
docker run --env-file .env my-image

Esempio di file .env:

ENV=staging
DEBUG=True
SECRET_KEY=mysecret

Gestire i container in esecuzione

Quando un container è in esecuzione, puoi visualizzarlo, fermarlo e accedervi. Vediamo come fare.

Visualizzare i container attivi

Per elencare tutti i container Docker attivi in esecuzione sul tuo sistema, esegui il comando docker ps o docker container ls. Questo comando mostra ID del container, immagine, comando, porta, stato e altri dettagli.

docker ps
# or
docker container ls

Per includere tutti i container — non solo quelli in esecuzione — come quelli terminati o creati ma non avviati, usa il flag -a:

docker ps -a

Per vedere solo il container creato più di recente, usa il flag -l (last):

docker ps -l

Se vuoi vedere tutti i container ordinati per data di creazione, con i più recenti per primi, esegui:

docker ps -a --sort=created

Fermare e rimuovere container

Per fermare uno specifico container in esecuzione, usa il comando docker stop seguito dall’ID o dal nome del container:

docker stop <container_id_or_name>

Per fermare tutti i container in esecuzione, usa:

docker stop $(docker ps -q)
  • $(docker ps -q) restituisce un elenco di tutti gli ID dei container in esecuzione.

Una volta fermato un container, puoi rimuoverlo con:

docker rm <container_id_or_name>

Per rimuovere tutti i container fermati, esegui:

docker container prune

Per andare oltre e rimuovere container, volumi, reti e immagini inutilizzati, dai un’occhiata alla guida a Docker prune.

Accedere ai log e alla shell del container

  • docker logs - Il comando docker logs recupera in blocco i log presenti al momento dell’esecuzione.
  • docker exec - docker exec ti permette di eseguire un nuovo comando dentro un container già in esecuzione senza fermarlo o riavviarlo. È come aprire un nuovo terminale dentro il tuo container — così puoi esplorare, eseguire script, controllare log o fare debug.
  • docker attach - docker attach collega il tuo terminale direttamente al processo principale di un container in esecuzione. Questo significa che puoi vedere l’output live del container (log, prompt, ecc.) e persino interagirci se il processo accetta input.

Risoluzione dei problemi comuni

Soluzioni semplici a problemi comuni. Ecco alcuni errori frequenti durante l’esecuzione di immagini Docker e come affrontarli. 

Errore 1: “Error response from daemon: pull access denied for alpine-python, repository does not exist or may require ‘docker login’: denied: requested access to the resource is denied.”

  • Cosa significa: Docker ha provato a scaricare un’immagine, in questo caso l’immagine alpine-python da Docker Hub, ma l’immagine non esiste oppure è privata e non sei autenticato.
  • Come risolvere:
    • Ricontrolla il nome e il tag dell’immagine su Docker Hub.
    • Se è un’immagine privata, esegui docker login per autenticarti.
    • Assicurati che l’immagine esista se la stai scaricando da un registry personalizzato.

Errore 2: “No such image found: <image-name>:<tag>”

  • Cosa significa: Hai provato a eseguire o taggare un’immagine in locale, ma l’immagine (o il tag specificato) non è disponibile sul tuo sistema.
  • Come risolvere:
    • Usa docker images per controllare le immagini disponibili.
    • Scarica esplicitamente l’immagine:
docker pull <image-name>:<tag>

Errore 3: “manifest for <image>:<tag> not found: manifest unknown: The named manifest is not known to the registry.”

  • Cosa significa: Probabilmente si verifica quando l’immagine o il tag specificati non esistono.
  • Possibili soluzioni: Questi suggerimenti risolvono la maggior parte degli errori comuni: 
    • Verifica il nome corretto dell’immagine e del tag.
    • Consulta i tag dell’immagine su Docker Hub o sul tuo registry personalizzato.
    • Usa docker pull <image>:<tag> per recuperare una versione valida.
    • Se stai facendo il build in locale, usa una Dockerfile corretta e costruisci l’immagine con:
docker build -t <image>:<tag> .

Conflitti di porta ed errori di bind

I conflitti di porta si verificano quando più container o un container e un’altra applicazione tentano di accedere alla stessa porta.

  • Come risolvere:
    • Usa una porta host diversa quando esegui il tuo container:
docker run -p 8081:80 <image>
  • Ferma il servizio che attualmente usa la porta.
  • Identifica cosa sta usando una porta (es. 8080) con:
lsof -i :8080

Conclusione 

Eseguire un’immagine Docker è uno dei passaggi più importanti e gratificanti nell’uso dei container, che tu stia avviando un semplice web server o distribuendo un’applicazione complessa. Con pochi comandi come docker run, docker ps e docker stop, ora hai gli strumenti per avviare, gestire e risolvere i problemi dei container con sicurezza.

Se vuoi andare oltre, prova a creare una tua immagine con una Dockerfile, esplora i flag avanzati di docker run o impara a gestire più container con Docker Compose.

Dai un’occhiata a questi corsi per continuare il tuo percorso con Docker:

FAQ

Posso eseguire più container dalla stessa immagine Docker?

Sì, puoi eseguire più container dalla stessa immagine. Ogni container è isolato e può avere le proprie impostazioni, porte e variabili d’ambiente.

Come passo in modo sicuro secret o API key a un container Docker?

Usa il flag -e per impostare le variabili d’ambiente oppure usa un file .env e --env-file per passare i secret in esecuzione senza inserirli hardcoded.

Come eseguo un’immagine Docker in background?

Usa il flag -d con docker run per avviare il container in modalità detached, lasciando il terminale libero per altri comandi.

Qual è la differenza tra docker exec e docker attach?

 docker exec apre una nuova sessione shell dentro il container, mentre docker attach si collega al processo principale del container e al suo output live.

Perché ricevo 'pull access denied' quando eseguo un’immagine?

Di solito significa che l’immagine è privata o scritta male. Controlla nome, tag e assicurati di aver fatto login su Docker Hub con docker login.

Come posso mantenere i dati in un container dopo che si ferma?

Usa il flag -v per montare un volume, assicurando che i dati siano archiviati al di fuori del container e rimangano intatti anche dopo la sua rimozione.

Qual è il modo migliore per eseguire un container per lo sviluppo?

Usa i flag -it per la modalità interattiva, insieme al mount di volumi e alle variabili d’ambiente per simulare un ambiente di sviluppo locale.

Come scopro quali porte vanno in conflitto sulla mia macchina?

Usa lsof -i :<port> per identificare quale processo usa una porta specifica, poi fermalo oppure usa una porta host diversa per il tuo container.

Come posso visualizzare i log di un container Docker in esecuzione?

Usa il comando docker logs <container_id> per recuperare e consultare i log dallo standard output e dallo standard error del container.

Srujana Maddula

Autore

Srujana Maddula

Srujana è una tech writer freelance con una laurea quadriennale in Informatica. Scrivere di vari argomenti, tra cui data science, cloud computing, sviluppo, programmazione, sicurezza e molti altri, le viene naturale. Ama la letteratura classica ed esplorare nuove destinazioni.

Argomenti

Correlato