speedtest.it
← Blog
Guide & Tutorial

Cosa sono Docker e Docker Compose e perché usarli

Docker e Docker Compose spiegati senza tecnicismi: cosa sono i container, come funzionano le immagini e perché semplificano sviluppo e deploy.

Cosa sono Docker e Docker Compose e perché usarli

Quante volte hai sentito la frase "sul mio PC funziona" durante una riunione tecnica? È uno dei problemi più frustranti dello sviluppo software: un'applicazione che gira perfettamente in locale crolla in produzione perché la versione di Node è diversa, manca una libreria o il sistema operativo ha una configurazione leggermente diversa. Docker nasce proprio per eliminare questo problema alla radice.

Il problema che Docker risolve

Immagina di sviluppare un'app che usa Python 3.11, una specifica versione di PostgreSQL e una serie di librerie con versioni precise. Sul tuo MacBook tutto funziona. Poi la passi a un collega che ha Windows e una versione diversa di Python: mezzo progetto smette di funzionare. Poi vai in produzione su un server Linux con dipendenze diverse ancora.

Docker elimina questa catena di problemi impacchettando l'applicazione insieme a tutto ciò di cui ha bisogno in un'unità chiamata container: il codice, il runtime, le librerie, le variabili d'ambiente, la configurazione di sistema. Il container gira uguale su qualsiasi macchina che ha Docker installato, indipendentemente dal sistema operativo sottostante.

Cos'è Docker?

Docker è una piattaforma open source che permette di creare, distribuire ed eseguire applicazioni in container. Rilasciato nel 2013 da dotCloud (poi rinominata Docker Inc.), è diventato rapidamente lo standard de facto per la containerizzazione.

Container vs macchine virtuali

È una domanda frequente. La differenza fondamentale:

  • Una macchina virtuale emula un intero computer, sistema operativo incluso. È pesante: ogni VM occupa gigabyte di disco e richiede minuti per avviarsi.
  • Un container Docker condivide il kernel del sistema operativo host. È leggero: occupa megabyte, si avvia in secondi e usa molte meno risorse.

In pratica, su un server puoi avviare 3-4 macchine virtuali o centinaia di container con le stesse risorse hardware.

I concetti chiave

Immagine (Image): il "progetto" del container. È un file immutabile che descrive cosa c'è dentro: sistema base, dipendenze, codice, comandi da eseguire. Si crea con un Dockerfile.

Container: un'istanza in esecuzione di un'immagine. Puoi avviare più container dalla stessa immagine contemporaneamente.

Docker Hub: il registro pubblico da cui scaricare immagini pronte. Trovi immagini ufficiali per quasi tutto: Nginx, MySQL, Redis, Node.js, Python, e migliaia di altre.

Dockerfile: il file di testo che descrive come costruire l'immagine. Esempio minimo per un'app Node.js:

FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

Con docker build -t mia-app . costruisci l'immagine, con docker run -p 3000:3000 mia-app la avvii.

Cos'è Docker Compose?

Quasi nessuna applicazione reale è composta da un solo servizio. Un'app web tipica ha almeno: il backend, un database, magari un cache Redis e un server per i file statici. Avviare e collegare manualmente quattro container separati è tedioso e error-prone.

Docker Compose è lo strumento che permette di definire e gestire applicazioni multi-container attraverso un singolo file YAML chiamato docker-compose.yml. Con un solo comando (docker compose up) avvii l'intera stack.

Esempio pratico: app + database

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgres://user:pass@db:5432/mydb
    depends_on:
      - db

  db:
    image: postgres:16
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: mydb
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

Con questo file:

  • docker compose up — avvia tutto
  • docker compose down — ferma e rimuove i container
  • docker compose logs app — vedi i log del backend
  • docker compose exec db psql -U user mydb — apri una shell nel database

Il depends_on garantisce che il database sia pronto prima che il backend tenti di connettersi.

Perché usare Docker? I vantaggi concreti

Ambienti identici ovunque

Dev, staging e produzione girano tutti lo stesso container. Addio alla sindrome del "funziona solo qui".

Onboarding rapido

Un nuovo sviluppatore che entra nel team esegue git clone + docker compose up e in pochi minuti ha l'ambiente di sviluppo completo, senza installare nulla manualmente.

Isolamento dei servizi

Ogni container vive nel suo ambiente. Un crash del servizio di invio email non abbatte il resto dell'app.

Scalabilità orizzontale

Vuoi gestire più traffico? docker compose up --scale app=5 avvia 5 istanze del backend in parallelo. In ambienti più complessi, Kubernetes orchestra migliaia di container.

CI/CD semplificato

Le pipeline di integrazione continua (GitHub Actions, GitLab CI, Jenkins) usano container per garantire che i test girino sempre in un ambiente pulito e riproducibile.

Docker in produzione: cosa sapere

Docker Compose va bene per ambienti di sviluppo e per deploy semplici su singolo server. Per produzioni più complesse o multi-server, si usa Kubernetes (o alternative più leggere come Docker Swarm o Nomad).

Un consiglio pratico: tieni le immagini piccole. Usa varianti -alpine (basate su Alpine Linux, ~5MB) invece delle immagini base complete. Separa le dipendenze di build da quelle di runtime con il multi-stage build.

Domande frequenti

Docker è gratuito? Docker Desktop (l'applicazione per Mac e Windows) è gratuita per uso personale e per le piccole aziende. Per aziende con più di 250 dipendenti o oltre 10 milioni di dollari di fatturato annuo, richiede una licenza a pagamento. Il motore Docker su Linux è sempre gratuito e open source.

Posso usare Docker su un Raspberry Pi? Sì. Docker gira su ARM, quindi funziona su Raspberry Pi 3, 4 e 5. Attenzione: molte immagini Docker Hub sono solo per x86/amd64, ma le immagini ufficiali dei servizi più popolari offrono anche la versione ARM.

Qual è la differenza tra Docker e Podman? Podman è un'alternativa open source a Docker, sviluppata da Red Hat. La differenza principale: Podman non richiede un demone in esecuzione come root, ed è quindi considerato più sicuro. La sintassi è quasi identica: nella maggior parte dei casi puoi sostituire docker con podman nei tuoi comandi.


← Tutti gli articoli