🏛️ Da VM a Container — Docker & CI/CD per l'Ente

Programma del corso

Da VM a Container: Docker e Pipeline CI/CD per i servizi dell'Ente

16 mezze giornate da 4 ore (64 ore totali) — ~50% teoria guidata, ~50% laboratorio pratico.

Obiettivo

Non migrare "un servizio": costruire il modello con cui l'Ente migrerĂ  tutti i servizi.

Al termine del corso il partecipante avrĂ  prodotto:

  1. Un esempio end-to-end funzionante e documentato: l'applicazione Pratiche (gestione pratiche dell'Ente) containerizzata, con pipeline CI/CD completa dal commit al deploy in produzione.
  2. Le linee guida architetturali standard per containerizzare qualunque servizio dell'Ente.
  3. La matrice dei ruoli (RACI) tra sviluppatori, sistemisti, referenti ICT e fornitori, replicabile su tutti i servizi.
  4. Un blueprint di repository riusabile come punto di partenza per ogni nuovo servizio o migrazione.

Il filo conduttore: l'app "Pratiche"

Tutti i laboratori lavorano sulla stessa applicazione, che cresce modulo dopo modulo:

un portale di gestione pratiche (frontend web + API Python/Flask + PostgreSQL + Redis).

Ogni modulo ha una cartella lab/start (punto di partenza garantito, anche per chi è rimasto

indietro) e lab/final (soluzione completa e funzionante).

Struttura in tre blocchi

Blocco A — Fondamenta Docker (Moduli 1–6)

Dal "funziona sulla mia VM" al "funziona ovunque".

#ModuloContenuti chiaveLab
1Perché i container. Setup dell'ambienteVM vs container; architettura Docker; installazione e verifica ambiente; run, ps, logs, execInstallare Docker; primo container; servire la home del portale Pratiche con Nginx
2Immagini e DockerfileLayer e cache; Dockerfile; build e tag; ciclo build→run→testContainerizzare l'API Pratiche (Flask)
3Dockerfile avanzato e hardeningMulti-stage; utente non-root; .dockerignore; HEALTHCHECK; pinning versioni; dimensioni immagineOttimizzare l'immagine API: piĂą piccola, piĂą sicura
4Reti e persistenzaBridge network; DNS interno; volumi vs bind mount; backup dei datiCollegare API e PostgreSQL; dati che sopravvivono al container
5Docker Composecompose.yaml; servizi, dipendenze, ordine di avvio; comandi essenzialiStack completo: web (Nginx) + API + DB con un solo comando
6Compose per ambienti realiHealthcheck; variabili e .env; profili; override dev/prod; cache RedisStesso stack, due configurazioni: sviluppo e produzione

Blocco B — La filiera automatizzata (Moduli 7–12)

Dalla macchina del singolo alla pipeline dell'Ente.

#ModuloContenuti chiaveLab
7Registry e versionamento immaginiRegistry privato; naming convention dell'Ente; semver e tag; retentionPush delle immagini Pratiche sul registry con le convenzioni dell'Ente
8Git e Pipeline as CodeBranching model; anatomia di .gitlab-ci.yml; runner; artefattiPrima pipeline: lint + build automatici a ogni push
9Pipeline di build e testTest automatici (pytest); stage e dipendenze; build & push su tagPipeline che testa, builda e pubblica l'immagine versionata
10QualitĂ  e sicurezza in pipelineLint (ruff, hadolint); scansione vulnerabilitĂ  (Trivy); SBOM; policy di bloccoAggiungere i "cancelli di qualitĂ " alla pipeline Pratiche
11Deploy automatico in stagingEnvironments; deploy via SSH + compose pull/up; smoke test post-deployLa pipeline porta Pratiche in staging da sola
12Rilascio in produzione e rollbackApprovazione manuale; release versionate; backup pre-deploy; rollback in un comandoRilascio controllato in "produzione" e rollback simulato

Blocco C — Il modello per l'Ente (Moduli 13–16)

Da un caso riuscito a uno standard replicabile.

#ModuloContenuti chiaveLab
13OsservabilitĂ  ed esercizioLog strutturati; endpoint di health; metriche Prometheus; dashboard Grafana; runbookMonitorare Pratiche: dashboard e alert di base
14Migrare un servizio legacy da VMMetodologia: assessment → containerizzazione → convivenza → cutover; casi tipici (cron, file, config)Migrare il servizio legacy "Albo Avvisi" da VM a container
15Architettura standard e matrice dei ruoliIl blueprint di repository; linee guida architetturali; RACI dev/sistemisti/fornitori; governance e handoverApplicare il blueprint all'Albo Avvisi; compilare la RACI
16Progetto finale end-to-endPercorso completo in autonomia: nuovo servizio dal blueprint fino al deployVerifica finale: da git init alla "produzione" con checklist di conformitĂ 

Perché proprio 16 mezze giornate

  1. Un incremento verificabile per modulo. Ogni mezza giornata chiude con l'app Pratiche in uno stato funzionante e dimostrabile. 4 ore = 1 concetto portante + 1 laboratorio completo: meno tempo costringerebbe a tagliare la pratica, piĂą tempo diluirebbe.
  2. La mezza giornata è sostenibile per un ICT operativo. I partecipanti mantengono i servizi dell'Ente: mezza giornata di corso lascia mezza giornata di esercizio, e il calendario può distribuirsi su 4–8 settimane senza fermare l'operatività.
  3. Metà corso è laboratorio. L'obiettivo non è "sapere Docker" ma saper ripetere il percorso su altri servizi: servono ore di pratica reale, con progetti di partenza (start) che permettono a tutti di riallinearsi a ogni modulo.
  4. I tre blocchi rispecchiano i tre obiettivi. 6 moduli per la competenza tecnica individuale (Docker), 6 per la filiera condivisa (CI/CD), 4 per il modello organizzativo (migrazione, architettura standard, ruoli, verifica finale). Togliere moduli al blocco C significherebbe ottenere tecnici capaci ma nessun modello replicabile — l'esatto contrario dell'obiettivo.
  5. Il modulo 16 è la prova del modello. L'ultima mezza giornata non introduce nulla di nuovo: il partecipante rifà tutto da solo partendo dal blueprint. Se ci riesce in 4 ore, il modello è davvero replicabile — ed è la stessa prova che si chiederà ai fornitori.

Prerequisiti dei partecipanti

infrastruttura (Dockerfile, compose, pipeline), non applicativo.

Materiali