cat docker-container.md

N°047Riproducibilità e deployPseudocodice

funziona sulla mia macchina

Docker, i container e la fine di una scusa famosa

Docker, lanciato nel 2013, rese semplice e popolare l'uso dei container: pacchetti che racchiudono un programma insieme a tutto ciò che gli serve per funzionare, identicamente ovunque. Questo pezzo racconta come questa idea abbia trasformato il modo in cui il software viene distribuito ed eseguito, chiudendo una delle scuse più antiche del mestiere.

Anno
2013
Era
2010-2019
Linguaggio
Pseudocodice
Reperto
1 container

La frase più frustrante del mestiere

Chiunque abbia scritto software conosce la scena, e la frustrazione che porta con sé. Un programma funziona perfettamente sul computer di chi l'ha scritto. Poi viene spostato altrove — sul computer di un collega, su un server di produzione — e si rompe. Errori misteriosi, comportamenti diversi, crash inspiegabili. E lo sviluppatore, sconcertato, pronuncia la frase diventata un classico, quasi una battuta amara del settore: «funziona sulla mia macchina».

Dietro questa frustrazione c'è un problema reale e profondo. Un programma non vive nel vuoto: dipende da un intero ambiente attorno a sé. La versione esatta del linguaggio, le librerie esterne da cui dipende come racconta il reperto su left-pad, le impostazioni del sistema operativo, configurazioni di ogni tipo. Se anche un solo dettaglio di questo ambiente differisce tra il computer dove il software è stato scritto e quello dove deve girare, tutto può andare storto. E ricreare manualmente lo stesso ambiente identico ovunque era un'impresa fragile e dolorosa.

Per decenni questo è stato uno dei grandi attriti dello sviluppo software: la distanza tra «funziona qui» e «funziona ovunque». Distribuire un programma e farlo girare in modo affidabile in ambienti diversi richiedeva configurazioni complesse, documentazione meticolosa e molta pazienza, e falliva continuamente. Serviva un modo per impacchettare non solo il programma, ma tutto il suo mondo.

Impacchettare il programma e il suo mondo

La soluzione si chiama container, e Docker, lanciato nel 2013 da Solomon Hykes, la rese finalmente semplice e accessibile a tutti. L'idea è elegante: invece di spedire solo il programma e sperare che l'ambiente di destinazione sia giusto, si impacchetta il programma insieme a tutto ciò di cui ha bisogno per funzionare — le librerie, le dipendenze, le configurazioni, una versione minimale del sistema attorno — in un'unica unità sigillata e autosufficiente, il container.

Un container è come una scatola che contiene non solo l'oggetto, ma anche l'ambiente esatto in cui quell'oggetto deve vivere. Ovunque venga aperta, la scatola ricrea le stesse identiche condizioni. Il programma dentro il container non sa, e non gli importa, su quale computer si trovi: trova sempre attorno a sé lo stesso mondo familiare che gli è stato impacchettato insieme. «Funziona sulla mia macchina» diventa «funziona in qualsiasi macchina», perché la macchina, di fatto, viaggia con il programma.

I container non vanno confusi con le macchine virtuali, una tecnologia più vecchia e più pesante che simulava interi computer. I container sono molto più leggeri ed efficienti: condividono il nucleo del sistema operativo sottostante e isolano solo ciò che serve, sfruttando meccanismi del sistema Linux. Questo li rende rapidi da avviare e parsimoniosi di risorse, tanto che se ne possono eseguire molti contemporaneamente sulla stessa macchina. Docker non inventò da zero questa tecnologia, ma la rese così facile da usare da diffonderla ovunque, esattamente come Mosaic fece con il web.

Mattoni componibili per il software moderno

L'impatto dei container andò ben oltre la soluzione della scusa famosa. Impacchettando ogni pezzo di software in unità standard, autosufficienti e identiche ovunque, i container cambiarono il modo stesso di costruire e gestire applicazioni complesse. Divennero i mattoni componibili dell'informatica moderna, una nuova incarnazione di quel principio di composizione che questo archivio incontra fin dalla pipe di Unix.

Le applicazioni grandi cominciarono a essere costruite assemblando molti container, ciascuno con un compito specifico, che collaborano: uno per il database, uno per la logica, uno per l'interfaccia, e così via. Questi container possono essere spostati, replicati, aggiornati e orchestrati su grandi insiemi di computer con una flessibilità prima impensabile. È la base tecnica su cui si reggono i servizi cloud e le architetture distribuite che fanno funzionare gran parte di Internet oggi.

Perché custodirlo

Docker e i container meritano una teca perché risolvono un problema umile ma universale — far funzionare il software in modo affidabile e identico ovunque — e così facendo hanno trasformato la pratica quotidiana di chi costruisce e distribuisce programmi. È un reperto che parla non di una grande teoria, ma dell'artigianato concreto del software, di come si passa dal codice scritto sul proprio computer al servizio che funziona per milioni di persone.

C'è una lezione ricorrente che il reperto ribadisce con forza. La riproducibilità — la capacità di ottenere lo stesso risultato nelle stesse condizioni — è un valore fondamentale e troppo spesso sottovalutato nell'ingegneria. Gran parte dei problemi del software nasce da ambienti che differiscono in modi nascosti e imprevedibili. Impacchettare l'ambiente insieme al programma, rendendolo esplicito e portatile, elimina alla radice un'intera classe di sofferenze. È una vittoria della chiarezza sull'implicito.

Custodire `funziona sulla mia macchina` significa celebrare la fine, o almeno il forte ridimensionamento, di una delle frustrazioni più antiche del mestiere. Il reperto insegna che alcune delle innovazioni più preziose non sono quelle che fanno cose spettacolari e nuove, ma quelle che rendono affidabile e ripetibile ciò che prima era fragile e capriccioso. A volte il progresso più grande è semplicemente far sì che le cose funzionino, sempre, dappertutto, allo stesso modo.

Punti chiave

  • «Funziona sulla mia macchina» è la frustrazione classica: codice che gira dove è stato scritto e si rompe altrove.
  • Il problema è che un programma dipende da un intero ambiente: versioni, librerie, configurazioni, sistema.
  • Docker (2013, Solomon Hykes) rese semplici i container: pacchetti che racchiudono il programma e tutto ciò che gli serve.
  • Il container ricrea ovunque le stesse identiche condizioni: il mondo del programma viaggia con lui.
  • Più leggeri delle macchine virtuali, i container sono diventati i mattoni componibili del software moderno e del cloud.
  • Insegnano il valore della riproducibilità: rendere esplicito e portatile l'ambiente elimina una classe di problemi.

Fonti