Docker e Containerizzazione: Concetti Base e Utilizzo
Docker impacchetta le applicazioni in container per un deployment consistente e portabile. Questa guida copre i fondamenti di Docker, la scrittura di Dockerfile e la gestione dei container.
Ultimo aggiornamento:Cos'è Docker?
Docker è una piattaforma che impacchetta applicazioni e le loro dipendenze in container. I container sono ambienti di runtime leggeri e isolati.
VM vs Container: Le macchine virtuali eseguono un sistema operativo completo (GB). I container condividono il kernel del SO host e occupano MB.
Coerenza: Risolve il problema 'funziona sulla mia macchina'. Gli ambienti di sviluppo, test e produzione usano lo stesso container.
Portabilità: I container funzionano su qualsiasi piattaforma compatibile con Docker (Linux, Windows, Mac, cloud).
Concetti Fondamentali di Docker
Image: Modello per un container. Archiviata come layer di sola lettura. Costruita da un Dockerfile.
Container: Istanza in esecuzione di un'immagine. Ogni container viene eseguito come processo isolato.
Dockerfile: File di testo che definisce come costruire un'immagine. Contiene istruzioni come FROM, RUN, COPY, CMD.
Registry: Repository che archivia e distribuisce immagini. Docker Hub è il registry pubblico più popolare.
Volume: Storage usato per persistere i dati del container. I dati vengono conservati anche se il container viene eliminato.
Scrittura di un Dockerfile
FROM node:18-alpine: Usate Node.js 18 (Alpine Linux) come immagine base. Alpine è un'immagine base di piccole dimensioni.
WORKDIR /app: Impostate la directory di lavoro su /app. Tutti i comandi successivi vengono eseguiti in questa directory.
COPY package*.json ./: Copiate package.json e package-lock.json. Installate le dipendenze con RUN npm install.
COPY . .: Copiate tutto il codice sorgente. Create il build di produzione con RUN npm run build.
EXPOSE 3000: Specificate che il container ascolta sulla porta 3000. Definite il comando da eseguire all'avvio del container con CMD ["npm", "start"].
Comandi Base di Docker
docker build -t myapp:1.0 .: Costruite l'immagine da Dockerfile. Taggate l'immagine con nome:versione usando -t.
docker run -p 3000:3000 myapp:1.0: Eseguite il container. Mappate la porta host alla porta del container con -p.
docker ps: Elencate i container in esecuzione. docker ps -a: Elencate tutti i container (inclusi quelli fermati).
docker stop <container_id>: Fermate il container. docker rm <container_id>: Rimuovete il container.
docker images: Elencate le immagini locali. docker rmi <image_id>: Rimuovete l'immagine.
Docker Compose
Docker Compose è uno strumento per definire e gestire applicazioni multi-container. Configurato con file docker-compose.yml.
Servizi: Ogni servizio è un container. Definite servizi come web (frontend), api (backend), db (database).
Volumes: Definite volumes per la persistenza dei dati. networks: Create networks per la comunicazione inter-servizio.
docker compose up: Avviate tutti i servizi. docker compose down: Fermate e rimuovete tutti i servizi.
docker compose up -d: Eseguite in modalità detached (background). docker compose logs -f: Seguite i log.
Migliori Pratiche
Immagini piccole: Usate immagini base Alpine o distroless. Rimuovete le dipendenze di build dall'immagine finale con multi-stage build.
Layer caching: COPY le dipendenze (che cambiano raramente) prima, il codice (che cambia frequentemente) dopo. Questo ottimizza il build cache.
.dockerignore: Ignorate i file inutili (node_modules, .git, logs). Questo riduce il build context.
Sicurezza: Usate utente non-root invece di root. Create un utente con RUN adduser --disabled-password appuser.
Health check: Usate l'istruzione HEALTHCHECK per eseguire il controllo di salute del container. Docker riavvia automaticamente i container unhealthy.