Durante il keynote della conferenza WWDC25, Apple ha sorpreso la comunità degli sviluppatori annunciando Containerization, un nuovo pacchetto Swift open source pensato per portare l’esecuzione di container Linux in modo nativo su macOS. A differenza delle soluzioni tradizionali basate su Docker Desktop o ambienti virtualizzati monolitici, Containerization sfrutta un approccio più granulare e integrato, introducendo un paradigma tutto nuovo per l’esecuzione containerizzata su Mac basati su Apple Silicon.
Con l’aumento della diffusione dei container nel ciclo di vita dello sviluppo software, la possibilità di riprodurre ambienti Linux su macOS in modo leggero e isolato è diventata un requisito fondamentale per molti sviluppatori backend, DevOps e ingegneri CI/CD.
Apple affronta il problema eliminando il tradizionale modello di host VM più container runtime, che tipicamente introduce un overhead significativo in termini di risorse e manutenzione. Con Containerization, ogni container è isolato in una macchina virtuale leggera, costruita su misura per offrire:
Il cuore di Containerization è scritto in Swift, il linguaggio di programmazione moderno e sicuro sviluppato da Apple. Questo non solo consente un’integrazione profonda con l’ecosistema macOS, ma permette anche di sfruttare appieno le prestazioni e le capacità dei Mac con chip Apple Silicon. Il sistema si basa a sua volta sul Virtualization.framework, una tecnologia nativa che consente la creazione e la gestione di macchine virtuali leggere direttamente sul sistema operativo.
A differenza delle soluzioni tradizionali che avviano un’unica pesante macchina virtuale per ospitare più container, Containerization esegue ogni container Linux all’interno della propria macchina virtuale isolata, riducendo il rischio di interferenze tra ambienti e migliorando l’affidabilità e la sicurezza. Grazie all’utilizzo di un kernel Linux ottimizzato e a un file system minimale, i container si avviano in tempi rapidissimi, spesso inferiori al secondo.
Un componente fondamentale di questo approccio è vminitd, un sistema di init leggerissimo scritto anch’esso in Swift. Questo piccolo daemon è il primo processo a partire all’interno della macchina virtuale e funge da intermediario tra il sistema host e il container, esponendo un’API gRPC tramite vsock. In questo modo, il processo esterno può configurare l’ambiente di runtime, gestire input/output, ricevere segnali e interagire direttamente con i processi containerizzati.
Containerization è conforme con lo standard OCI, ovvero Open Container Initiative. Questo significa che supporta le specifiche aperte e condivise per i formati d’immagine dei container e per i runtime, garantendo compatibilità con l’ecosistema container esistente (come Docker e containerd). Essere OCI-compliant assicura che le immagini create o utilizzate da Containerization possano essere eseguite anche in altri ambienti containerizzati, e viceversa, promuovendo l’interoperabilità e riducendo il rischio di lock-in tecnologico.
Mentre Docker Desktop su macOS utilizza HyperKit (basato su Hypervisor.framework) per creare una macchina virtuale centrale che ospita container gestiti con Docker Engine e containerd, Containerization opera a un livello più basso e integrato, creando una macchina virtuale separata per ogni container.
Questa scelta assicura una serie di vantaggi chiave:
All’atto pratico, Containerization potrebbe diventare la base per nuove implementazioni future, anche da parte di Docker.
Per usare Containerization, sono necessari un sistema Mac con chip Apple Silicon (M1, M2, M3…), macOS 15 con Xcode 26 Beta oppure macOS 26 Beta 1, competenze di base per l’uso di make, Swift e shell scripting.
Per iniziare, è necessario clonare il repository GitHub di Apple con il seguente comando:
git clone https://github.com/apple/containerization.git
cd containerization
È quindi possibile proseguire con l’installazione di Swiftly, Swift e Static Linux SDK:
make cross-prep
Il comando scarica e configura automaticamente gli strumenti necessari per la compilazione multipiattaforma. Se si utilizzasse un terminale personalizzato, potrebbe risultare necessario procedere con lo spostamento del caricamento di env.sh
da .zprofile
a .zshrc
. È sufficiente aggiungere la riga seguente (sostituendo
con il nome utente corretto):
. "/Users/
Dopo aver chiuso e riaperto il terminale, si può verificare che sia tutto correttamente impostato usando il comando seguente:
which swift
Si dovrebbe ottenere una risposta simile alla seguente: /Users/
Una volta completata la preparazione, si può avviare la compilazione. Il comando riportato di seguito costruisce il progetto e genera il tool cctl
, i moduli Swift e il componente vminitd
:
make all
Da ultimo, si può finalmente testare il funzionamento del sistema ed eventualmente scaricare un kernel Linux, il tutto seguendo le indicazioni riportate a questo indirizzo.
Uno dei modi migliori per familiarizzare con Containerization è utilizzare il tool cctl
, incluso nel progetto. Questo strumento fornisce un’interfaccia a riga di comando per esplorare le API e provare funzioni chiave come:
Per container registries (o registry di container) si intendono dei repository centralizzati (online o locali) in cui vengono archiviate, gestite e distribuite le immagini di container, come ad esempio immagini di Docker o immagini conformi allo standard OCI.
Qui si trovano tanti esempi di utilizzo. Tuttavia, il comando seguente scarica l’immagine Ubuntu dal registry, avvia una macchina virtuale e stampa il messaggio all’interno del container:
./cctl run --image ubuntu:latest -- echo "Hello from Linux container"