Dev Containers: La fine delle eterne configurazioni in locale

   

Ogni programmatore ha vissuto almeno una volta l'incubo di dover riconfigurare l'ambiente di lavoro di un progetto su una nuova macchina. Dopo ore di configurazione, la nuova macchina continua a non essere funzionante al 100%. Versioni diverse di Node.js, librerie mancanti, conflitti tra variabili d'ambiente: la gestione dell'ambiente di sviluppo è spesso un freno alla produttività.

La soluzione? I Development Containers (Dev Containers).

🔗 Ti piace Techelopment? Dai un'occhiata al sito per tutti i dettagli!

Cos'è un Dev Container?

I Dev Containers (Development Containers) sono un modo per definire e avviare un ambiente di sviluppo completo dentro un container Docker, così che tutti gli sviluppatori lavorino nello stesso ambiente, indipendentemente dal sistema operativo.

L'idea è: invece di installare manualmente linguaggi, SDK, librerie e strumenti sul tuo PC, descrivi tutto in una configurazione e Docker crea un ambiente identico ogni volta.

In termini semplici, un Dev Container è un ambiente di sviluppo isolato, completo e riproducibile, definito come codice.

Grazie alla tecnologia Docker, i Dev Containers ti permettono di incapsulare l'intero ecosistema necessario per lavorare su un progetto (linguaggi, runtime, strumenti di build, estensioni dell'editor) all'interno di un contenitore. Quando apri il tuo editor (come VS Code), questo si "connette" al container: non stai più scrivendo codice sul tuo sistema operativo locale, ma all'interno di un ambiente isolato che rispecchia esattamente ciò di cui il progetto ha bisogno.


Perché esistono?

Immagina un team che sviluppa in Python:

  • Tu hai Python 3.12
  • Un collega ha Python 3.10
  • Un altro usa Windows
  • Un altro usa Linux

Risultato: "sul mio computer funziona".

Con un Dev Container:

  • tutti usano la stessa versione di Python
  • le stesse dipendenze
  • gli stessi tool
  • la stessa configurazione

e il progetto si comporta nello stesso modo per tutti.


Dev Containers vs. Docker "puro": qual è la differenza?

È comune pensare che, se stai già usando Docker per i tuoi container di produzione, tu stia già facendo "Dev Containers". In realtà, c'è una differenza sostanziale di scopo e integrazione:

  • Docker (il motore): Si concentra sull'esecuzione dell'applicazione in un ambiente isolato, ottimizzato per il deployment, la scalabilità e la sicurezza in produzione. Quando usi Docker "puro" per lo sviluppo, spesso devi gestire manualmente il mapping dei volumi, il port forwarding e, soprattutto, hai una separazione netta tra il tuo editor di codice (sull'host) e l'ambiente di esecuzione (nel container).
  • Dev Containers (l'ambiente di sviluppo): È uno strato di integrazione profonda sopra Docker. Mentre Docker ti dà solo il "motore", il Dev Container ti dà l'intera "officina".
    • Integrazione con l'IDE: Il Dev Container configura automaticamente l'editor (VS Code) affinché "viva" dentro il container. Questo significa che l'autocompletamento, il debugger, i terminali e le estensioni dell'editor girano direttamente nell'ambiente dove risiedono le librerie del progetto.
    • Configurazione "Batteries-included": Oltre a definire il linguaggio e le dipendenze, il file devcontainer.json automatizza l'installazione di plugin dell'editor, la configurazione dei tool di formattazione (linting) e persino la personalizzazione delle impostazioni utente dell'IDE.
    • Esperienza utente: Con Docker puro, devi spesso uscire dal terminale o configurare script complessi per far parlare il tuo PC con il container. Con i Dev Containers, l'esperienza è trasparente: non senti la differenza tra lavorare in locale e lavorare in un container, tranne per il fatto che il tuo ambiente è finalmente coerente e isolato.
In sintesi: Docker è la tecnologia che rende possibile l'isolamento; i Dev Containers sono l'implementazione che rende quell'isolamento produttivo, ergonomico e standardizzato per lo sviluppatore.

  • Docker normale: serve a eseguire applicazioni
  • Dev Container: serve a creare un ambiente di sviluppo


Perché ogni sviluppatore dovrebbe usarli?

1. Zero "Configurazione Iniziale" (Onboarding immediato)

Immagina di far entrare un nuovo sviluppatore nel team. Invece di passare due giorni a installare dipendenze, database e strumenti vari, gli basta clonare la repository e premere "Reopen in Container". In pochi minuti, l'ambiente è pronto e identico a quello di tutti gli altri.

2. Consistenza Totale

Il Dev Container elimina la variabile "configurazione locale". Ogni membro del team utilizza le stesse versioni di linguaggi e tool. Se funziona nel container, funzionerà in produzione.

3. Isolamento del Sistema (Pulizia)

Non hai più bisogno di installare dieci versioni diverse di Python o Node.js sulla tua macchina. Il tuo sistema operativo rimane pulito: se il progetto ti serve, il container è attivo; se non ti serve più, lo elimini senza lasciare residui o conflitti di librerie.

4. Configurazione come Codice

Con i file devcontainer.json, la configurazione dell'ambiente vive all'interno della repository. Puoi versionare, condividere e aggiornare l'ambiente di sviluppo esattamente come fai con il codice sorgente.


Comprendere l'utilizzo di un Dev Container

Come iniziare

Per iniziare, ti basta avere:

  1. Docker installato.
  2. VS Code (o un editor compatibile).
  3. L'estensione "Dev Containers" di Microsoft.

Una volta configurato, aggiungi una cartella .devcontainer nel tuo progetto con un file devcontainer.json. Potrai definire l'immagine Docker da usare e quali estensioni dell'editor devono essere installate automaticamente all'interno dell'ambiente.

Come funziona

Di solito trovi una cartella:

.devcontainer/
├── devcontainer.json
├── Dockerfile

devcontainer.json

Descrive come avviare l'ambiente:

{
  "name": "My App",
  "build": {
    "dockerfile": "Dockerfile"
  }
}

Dockerfile

Definisce il container:

FROM python:3.12

RUN pip install poetry

Quando apri il progetto in un editor compatibile (ad esempio Visual Studio Code), il container viene costruito e il tuo editor si collega automaticamente all'interno di esso.

Cosa vedi come sviluppatore?

Dal tuo punto di vista:

  1. Apri il repository.
  2. Clicchi "Reopen in Container".
  3. Aspetti che Docker costruisca l'ambiente.
  4. Lavori normalmente.

Terminale, debugger, estensioni e strumenti girano nel container.


A livello di filesystem come vengono gestiti i repo clonati su cui lavorare (es. in VS Code)?

La risposta dipende da dove si trova il repository rispetto al container.

Caso più comune: repo sul filesystem host

Quando apri una cartella locale con VS Code e scegli "Reopen in Container", il repository rimane sul tuo computer.

Ad esempio:

Mac/Linux:
~/projects/my-app

Windows:
C:\projects\my-app

Docker monta quella cartella nel container tramite un bind mount.

Schema:

Host
└── ~/projects/my-app
      │
      ▼
Container
└── /workspaces/my-app

Se nel terminale del container esegui:

pwd

potresti vedere:

/workspaces/my-app

ma i file sono fisicamente ancora sul tuo disco.

Conseguenze

Se modifichi:

/workspaces/my-app/src/index.js

stai in realtà modificando:

~/projects/my-app/src/index.js

sull'host.

Per questo:

  • Git vede normalmente le modifiche
  • puoi usare strumenti Git sia dentro che fuori dal container
  • eliminare il container non elimina il repository

Caso Codespaces o Remote Containers remoti

Con GitHub Codespaces la situazione è diversa.

Il repository viene clonato direttamente su una VM remota:

VM remota
└── /workspaces/my-app

VS Code si collega da remoto.

Qui i file non sono sul tuo PC ma sul server che ospita il Codespace.

Dove vive il filesystem del container?

Oltre al mount del repository, il container ha il suo filesystem interno:

/
├── usr/
├── bin/
├── etc/
└── workspaces/

Tutto ciò che installi nel container:

apt install curl

finisce nel layer Docker del container.

Se il container viene ricreato:

docker rm ...

quelle modifiche possono andare perse, a meno che non siano descritte nel Dockerfile.

Per questo si tende a mettere le installazioni nel:

RUN apt-get install ...

anziché installarle manualmente.


Vantaggi e Svantaggi

Vantaggi Descrizione
Onboarding rapidissimo Un nuovo sviluppatore può partire in pochi minuti:
git clone ...
Apri il Dev Container e sei pronto.
Ambiente riproducibile Se il container funziona oggi, funzionerà anche tra mesi.
Nessun "inquinamento" del PC Non devi installare decine di tool sul sistema host.
Compatibilità multipiattaforma Windows, macOS e Linux utilizzano lo stesso ambiente di sviluppo.
CI/CD più coerente Puoi usare immagini Docker simili a quelle della pipeline di integrazione e distribuzione continua.


Svantaggi Descrizione
Richiede Docker Docker deve essere installato e funzionante.
Consuma risorse RAM e CPU vengono utilizzate dal container.
Build iniziale lenta La prima creazione del container può richiedere diversi minuti.
Debug di alcuni servizi Per applicazioni che interagiscono con hardware locale o interfacce grafiche (GUI), il debug può essere più complesso.


Conclusione

I Dev Containers non sono solo un'aggiunta tecnologica; sono un cambio di paradigma. Trasformano l'ambiente di sviluppo da un "problema da risolvere ogni volta" a una risorsa standardizzata e affidabile.

Se vuoi aumentare la velocità del tuo team e ridurre drasticamente i bug causati da configurazioni errate, integrare i Dev Containers nel tuo flusso di lavoro è il passo più logico da compiere oggi.

Stai già utilizzando i Dev Containers nel tuo flusso di lavoro quotidiano o preferisci mantenere i tuoi ambienti di sviluppo direttamente sull'host?


Riferimenti




Follow me #techelopment

Official site: www.techelopment.it
facebook: Techelopment
instagram: @techelopment
X: techelopment
Bluesky: @techelopment
telegram: @techelopment_channel
whatsapp: Techelopment
youtube: @techelopment