Container e CI/CD con Docker - init.d
EN

Container e CI/CD con Docker

Deploy ripetibili, rollback in un comando.

Portare un’applicazione in produzione non dovrebbe essere un rito artigianale diverso ogni volta. Con Docker e una pipeline CI/CD il rilascio diventa un processo ripetibile e verificabile: la stessa immagine dal laptop dello sviluppatore allo staging e alla produzione, aggiornamenti tracciati e un rollback pronto quando qualcosa non torna. È l’infrastruttura che rende concreto il nostro claim: scriviamo il codice e lo teniamo in produzione.

Panoramica

Containerizziamo applicazioni nuove ed esistenti con Docker e Docker Compose, poi automatizziamo build, test e deploy con GitLab CI o GitHub Actions. L’obiettivo è semplice: ogni rilascio parte da un artefatto identico e prevedibile, promosso attraverso ambienti separati - sviluppo, staging, produzione - senza passaggi manuali dimenticati per strada.

La containerizzazione per noi non è un fine ma un mezzo: serve a eliminare le differenze tra ambienti, a rendere i rilasci reversibili e a togliere il deploy dalle mani (e dalla memoria) di una singola persona. Per questo non partiamo mai dalla tecnologia: partiamo dal tuo flusso di rilascio attuale, da dove si inceppa e da cosa succede quando un aggiornamento va storto.

Niente configurazioni che vivono solo nella testa di qualcuno: Dockerfile, file Compose e pipeline sono scritti, versionati nel tuo repository e ricreabili da zero. E niente sovradimensionamento: se bastano Compose e un buon registry privato, non ti proponiamo un cluster.

Problemi tipici che risolviamo

  • Il deploy lo sa fare solo una persona, a mano via SSH → lo trasformiamo in una pipeline automatica che chiunque nel team può lanciare e leggere.
  • “Sul mio computer funziona” ma in produzione no → costruiamo immagini Docker identiche in ogni ambiente, dallo sviluppo alla produzione.
  • Un rilascio rompe il sito e non c’è via di ritorno → versioniamo ogni immagine e prepariamo un rollback eseguibile in un comando.
  • Gli aggiornamenti si provano direttamente in produzione → allestiamo uno staging fedele dove testarli prima che tocchino gli utenti.
  • Ogni sviluppatore ha un ambiente locale diverso → definiamo con Docker Compose uno stack unico che si ricrea in pochi minuti.
  • Segreti e credenziali sparsi tra file di configurazione e chat → li spostiamo in variabili protette della pipeline, fuori dal codice.
  • Build lente che bloccano i merge → introduciamo cache, build multi-stage e step paralleli per accorciare i tempi di attesa.

Cosa include

  • Containerizzazione: analisi dell’app esistente, Dockerfile puliti e multi-stage, gestione di variabili d’ambiente, volumi e segreti.
  • Docker Compose: definizione dei servizi (app, database, cache, reverse proxy) per ambienti locali e di staging coerenti con la produzione.
  • Registry privati: pubblicazione delle immagini su GitLab Registry, GitHub Packages o registry self-hosted, con tag versionati e pulizia periodica.
  • Pipeline CI/CD: build automatica, test, lint, creazione dell’immagine e deploy al merge, con approvazioni manuali dove un rilascio richiede un controllo umano.
  • Deploy e rollback: rilasci automatizzati con ritorno rapido alla versione precedente quando qualcosa va storto.
  • Ambienti di staging: un ambiente che somiglia alla produzione per provare aggiornamenti e migrazioni prima che tocchino gli utenti.
  • Passaggio di consegne: documentazione del flusso e una sessione con il tuo team per renderlo autonomo su build e rilasci quotidiani.

Stack e tecnologie

Lavoriamo con Docker e Docker Compose per il runtime dei container e con GitLab CI e GitHub Actions per le pipeline. Per l’orchestrazione restiamo leggeri: Compose su un singolo host oppure Docker Swarm quando serve un minimo di scalabilità; Kubernetes solo quando il carico lo giustifica davvero, mai per moda. I container girano su server Linux - prevalentemente Debian e Ubuntu, su richiesta AlmaLinux o Rocky Linux - dietro Nginx come reverse proxy, con MySQL/MariaDB o PostgreSQL per i dati e Redis per cache e code. Sul cloud lavoriamo soprattutto con Google Cloud, in alternativa AWS e DigitalOcean; Azure, Hetzner e OVH su richiesta. Dove l’infrastruttura è abbastanza articolata da giustificarlo la descriviamo con Terraform; altrimenti restano configurazioni versionate e documentate, più semplici da mantenere.

Un esempio d’intervento

Una software house rilasciava un gestionale Laravel con git pull via SSH e una checklist manuale su un documento condiviso: migrazioni lanciate a mano, cache da svuotare, e ogni tanto un passaggio saltato che generava errori in produzione. Abbiamo containerizzato l’applicazione con Dockerfile multi-stage, definito lo stack in Docker Compose (app, MariaDB, Redis, Nginx) e costruito una pipeline GitLab CI: test e build a ogni push, deploy automatico in staging, promozione in produzione con approvazione manuale. Migrazioni e svuotamento della cache sono diventati step della pipeline, non voci di una checklist. Oggi il team rilascia più volte a settimana e, quando un aggiornamento non convince, torna alla versione precedente in pochi minuti.

A chi si rivolge

  • Team di sviluppo che vogliono uscire dal deploy manuale via FTP o SSH.
  • Agenzie e software house che gestiscono più progetti e vogliono un flusso di rilascio uniforme.
  • PMI e SaaS con un’applicazione in crescita che non possono più permettersi rilasci fragili.
  • Chi ha un’app esistente da containerizzare senza riscriverla da capo.

Come lavoriamo

Partiamo da un audit dell’applicazione e del flusso di rilascio attuale, poi containerizziamo un servizio alla volta e costruiamo la pipeline in modo incrementale: il tuo team continua a rilasciare mentre il nuovo flusso prende forma. Ogni configurazione è documentata e versionata nel tuo repository: Dockerfile, file Compose e definizioni della pipeline restano tuoi, leggibili e senza lock-in. Un solo referente segue il progetto dall’inizio alla fine e ti lascia report comprensibili anche da chi non fa il sistemista di mestiere.

Fatturiamo a consuntivo sul listino orario oppure con pacchetti ore senza scadenza; la copertura standard è lun-ven 10:00-18:00 , con priorità e tempi descritti nella pagina sui tempi di risposta. Il preventivo è sempre gratuito, con risposta in giornata lavorativa.

Domande frequenti

Potete containerizzare un'applicazione senza riscriverla?

Sì. Partiamo dall'app così com'è, scriviamo Dockerfile e file Compose puliti e la portiamo in container senza toccarne l'architettura. Se un refactor avesse davvero senso, lo proponiamo a parte con costi e benefici chiari.

Quali piattaforme CI/CD supportate?

Principalmente GitLab CI e GitHub Actions. Costruiamo pipeline che eseguono build, test e deploy in automatico, con step di approvazione manuale dove un rilascio richiede un controllo umano.

Cosa succede se un deploy rompe la produzione?

Ogni rilascio è un'immagine versionata: torniamo in fretta alla versione precedente funzionante. Prima ancora, gli aggiornamenti passano da uno staging che somiglia alla produzione, così i problemi emergono lì e non davanti agli utenti.

Mi serve per forza Kubernetes?

Di solito no. Per la maggior parte dei progetti bastano Docker Compose su un singolo host o Docker Swarm per una scalabilità leggera. Orchestrazione più pesante solo quando il carico lo richiede davvero.

Quanto costa containerizzare un'applicazione e costruire la pipeline?

La tariffa oraria è unica: 75 €/ora, oppure con pacchetti ore senza scadenza: 5 ore a 350 €, 10 a 660 €, 20 a 1.200 €. Il preventivo è gratuito, con risposta in giornata lavorativa.

Ci assistete anche dopo la messa in produzione?

Sì. La copertura standard è dal lunedì al venerdì, 10:00-18:00, con triage per priorità: un blocco in produzione (P1) viene preso in carico entro un'ora lavorativa. Fuori orario garantiamo l’intervento solo per le emergenze P1 dei clienti con un piano di reperibilità attivo.

Intervenite anche di notte o nel weekend?

Con garanzia solo per i clienti che hanno un piano di reperibilità attivo, e solo per vere emergenze P1: produzione ferma, perdita di dati, incidente di sicurezza. La reperibilità è un canone mensile a posti limitati, attivabile sui sistemi che gestiamo noi e, dopo una valutazione caso per caso, anche su altri: prezzi e regole sono nella pagina Reperibilità. Senza piano la copertura è lun-ven 10:00-18:00 e l’intervento fuori orario è best effort: può capitare, ma non è garantito né esigibile. Gli interventi notturni o festivi pianificati con almeno 20 giorni di anticipo restano possibili per tutti, alla tariffa maggiorata.

Serve una mano sulla tua infrastruttura?

Raccontaci il problema: rispondiamo con una proposta chiara e un preventivo.

Contattaci →