Docker — Cheat Sheet

Tag: docker, containers, devops, docker-compose, virtualization, microservices

Livello: intermedio

TL;DR: Principi di containerizzazione, isolamento di processo e gestione lifecycle di container, volumi e immagini per ambienti riproducibili.

Concetti chiave

I container condividono il kernel dell'host a differenza delle macchine virtuali tradizionali.

Un'immagine Docker e' un template immutabile composto da layer read-only sovrapposti.

Un container e' un'istanza in esecuzione di un'immagine con un thin layer scrivibile in cima.

Il Dockerfile definisce le istruzioni sequenziali per assemblare un'immagine ottimizzata.

Ogni istruzione RUN, COPY, ADD crea un nuovo layer permanente all'interno dell'immagine.

L'istruzione ENTRYPOINT definisce il binario immutabile di default da eseguire.

L'istruzione CMD fornisce argomenti predefiniti facilmente sovrascrivibili da command line.

I volumi gestiscono la persistenza dei dati disaccoppiando lo storage dal ciclo vitale del container.

Le Docker bridge network consentono la comunicazione DNS isolata tra container sullo stesso host.

Le multi-stage build permettono di compilare asset scartando toolchain pesanti nell'immagine finale.

Domande tipiche e risposte pronte

Q: Che differenza passa tra CMD ed ENTRYPOINT in un Dockerfile?R: Uso ENTRYPOINT per definire l'eseguibile fisso del container e CMD per passare i parametri di default. Se chi esegue il container passa parametri extra, sovrascrive solo CMD.

Q: Come riduci le dimensioni di un'immagine di produzione?R: Sfrutto il multi-stage build isolando compiler e dipendenze di build, adotto immagini base minimali come Alpine o Distroless e accorpo comandi RUN con pulizia cache.

Q: Che differenza c'e' tra volumi denominati e bind mount?R: I volumi Docker sono gestiti interamente dal daemon Docker in storage isolato; i bind mount mappano una directory arbitraria dell'host nel container.

Insidie e errori comuni

Esecuzione del processo principale come utente root invece di dichiarare un utente dedicato con USER.

Invalidazione prematura della cache Docker copiando l'intero sorgente prima di installare le dipendenze.

Uso del segnale SIGKILL forzato dovuto a entrypoint formattati come shell form invece di exec array JSON.

Memorizzazione di dati persistenti all'interno del layer scrivibile del container invece di montare volumi.

Persistenza di segreti, token o credenziali nei layer intermedi tramite ARG o ENV.

Snippet e comandi

# Multi-stage build per Node.js
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
USER node
EXPOSE 3000
CMD ["node", "dist/index.js"]

Bash

# Build e gestione lifecycle
docker build -t my-app:1.0.0 .
docker run -d --name app-instance -p 8080:3000 --rm my-app:1.0.0

# Pulizia orfani e cache
docker system prune -af --volumes

# Debug su container attivo
docker exec -it app-instance sh
docker logs --tail 100 -f app-instance

YAML

```version: '3.8'

services:

web:

build: .

ports:

  • "3000:3000"

environment:

  • NODE_ENV=development

volumes:

  • .:/app
  • /app/node_modules

```

Da ripassare

[ ] Meccanismo di orchestrazione overlay network e swarm routing mesh.

[ ] Gestione dei segnali Unix (PID 1 e tini init process nei container).

[ ] Configurazione di Docker Buildx e caching remoto per pipeline CI/CD.

[x] Differenza semantica tra bind mounts, named volumes e tmpfs.

[x] Ordine delle istruzioni nel Dockerfile per massimizzare il layer caching.

Jarvis Interviews
Jarvis