A Siracusa, nel III secolo a.C., Archimede si immerse in una vasca da bagno, notò che l'acqua traboccava e capì il principio del galleggiamento. Leggenda vuole che sia uscito nudo per strada urlando "Eureka!".

Noi sviluppatori non urliamo "Eureka" in vasca da bagno. Lo urliamo alle tre di notte quando, dopo due giorni di errori incomprensibili, l'applicazione finalmente si avvia. E spesso, la "vasca" che ci salva la vita è un container Docker.

La Spinta Idrostatica del Software

Il Principio di Archimede afferma che un corpo immerso in un fluido riceve una spinta verso l'alto pari al peso del fluido spostato. In pratica, se la densità del corpo è strutturata bene, il corpo galleggia, indipendente da quanto sia profondo o turbolento l'oceano sotto di lui.

Nello sviluppo moderno, l'oceano turbolento è il sistema operativo del vostro computer (o del server). Tra versioni di Node.js incompatibili, variabili d'ambiente mancanti e librerie globali in conflitto, far girare un progetto vecchio sul vostro Mac nuovo è un incubo.

I Container sono l'applicazione pratica del galleggiamento: chiudiamo il nostro codice e le sue dipendenze in una "nave" stagna. La nave galleggia sul Kernel del sistema operativo host, ma non si allaga mai con i problemi locali.

Il Fango: L'Incompatibilità Globale

Qualche mese fa ho clonato il repository di un vecchio progetto React + Express universitario per fare una piccola modifica.

Non ho usato Docker. Ho semplicemente fatto npm install e npm start.

// Bad Code: Affogare nell'oceano delle dipendenze globali
$ npm start

Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:71:19)
    at Object.createHash (node:crypto:133:10)
    ...

Il progetto usava Node.js v14. Il mio Mac aveva installato Node.js v20. L'algoritmo di hashing di Webpack era deprecato nelle versioni nuove. Ho passato tre ore a disinstallare e reinstallare versioni di Node con NVM, rompendo nel processo altri due progetti moderni a cui stavo lavorando. Ero letteralmente andato a fondo.

L'Ingegneria: Costruire lo Scafo (Dockerfile)

L'ingegneria software seria non tollera il "funziona solo se hai esattamente il mio stesso computer". L'ingegneria richiede ambienti immutabili.

Ho cancellato tutto, ho fatto un bel respiro e ho scritto un Dockerfile. Ho creato una barca su misura che conteneva la vecchia e rassicurante versione di Node.js, isolandola dal mio Mac.

# Good Code: Il nostro scafo stagno
# Partiamo da un "fluido" isolato con la versione esatta che ci serve
FROM node:14-alpine

# Creiamo la cabina di pilotaggio
WORKDIR /app

# Imbarchiamo i file
COPY package*.json ./
RUN npm install

COPY . .

# Salpiamo
EXPOSE 3000
CMD ["npm", "start"]

Con un banale docker build e docker run, l'applicazione è partita al primo colpo, galleggiando felicemente nel suo container, totalmente all'oscuro del fatto che fuori ci fosse Node 20.

Il Takeaway

L'ecosistema del vostro computer locale è caotico e in continua mutazione. Se non isolate le vostre applicazioni, prima o poi verranno affondate da un aggiornamento di sistema o da una libreria globale sovrascritta.

Imparate a "containerizzare" i vostri progetti fin dal giorno zero. Non solo vi salverà la sanità mentale quando cambierete PC, ma sarete certi che la vostra app galleggerà esattamente allo stesso modo sia sul vostro localhost che sui server di produzione. Archimede ne sarebbe orgoglioso.