Docker ha trasformato la distribuzione del software, ma l'utilizzo dei contenitori in produzione richiede disciplina. Le immagini di grandi dimensioni aumentano i costi di archiviazione e i tempi di distribuzione, mentre le vulnerabilità possono esporre il tuo ambiente ad attacchi. Questa guida presenta le migliori pratiche che garantiscono immagini leggere, sicure e con possibilità di versione.
Buone pratiche essenziali
- Build in più fasi, compila il codice in una fase e copia solo gli artefatti finali.
- Immagini di base minimaliste, preferisci
alpineodistrolessper ridurre la superficie di attacco. - Non includere mai le credenziali,
.envfile, chiavi o token non devono mai essere copiati nell'immagine. - Esegui come utente non root, crea un utente dedicato e configura il contenitore per utilizzarlo.
- Versione senza
latest, utilizza tag semantici (v1.2.3) per tracciabilità e rollback.
Esempio snello di Dockerfile multi-fase (Node.js), 9 righe
FROM node:20-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . RUN npm run build # gera artefatos estáticos FROM gcr.io/distroless/nodejs20 WORKDIR /app COPY /app/dist ./dist COPY /app/node_modules ./node_modules USER nonroot EXPOSE 3000 CMD ["dist/index.js"]
Lista di controllo per la sicurezza delle immagini
- Scansiona le vulnerabilità con Trivy, Clair o Snyk.
- Controlla i livelli non necessari (
docker history). - Definisci utente non root in Dockerfile.
- Rimuovi file temporanei (
npm cache clean --force). - Firma l'immagine utilizzando Docker Content Trust per garantirne l'integrità.
Strategia di versione
| Etichetta | Quando utilizzare |
|---|---|
v1.2.3 | Rilascio stabile, compatibile con semver. |
v1.2.3-rc.1 | Rilascio del candidato per il test. |
v1.2.3-sha.<commit> | Compilazione automatizzata per CI, tracciabile. |
Integrazione CI/CD semplificata (azioni GitHub), 7 righe
name: Build & Push Docker Image on: push: branches: [main] jobs: docker: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Build image run: docker build -t myapp:$ . - name: Login to Docker Hub uses: docker/login-action@v2 with: username: $ password: $ - name: Push image run: docker push myapp:$
Conclusione
Applicando queste pratiche si ottengono immagini più piccole, più sicure e facilmente modificabili, riducendo i costi operativi e mitigando il rischio di vulnerabilità in produzione.
Quali strategie Docker avete già adottato? Condividi nei commenti!
Leggi anche
- Kubernetes in produzione: quello che nessuno ti dice prima della migrazione
- CI/CD moderno: l'arte di implementare con sicurezza
- Operatori Cloudflare in produzione: cosa cambia dopo hello world
- D1 nella produzione: prestazioni, limiti e cosa non si adatta da solo
- Oggetti durevoli in produzione: come sarà la bolletta e i limiti che sorprendono
- Implementazione di flag di funzionalità e implementazioni graduali nella produzione
