
Contexte : Linux sur macOS, un défi de longue date
Historiquement, macOS repose sur le noyau XNU, qui ne prend pas nativement en charge les primitives de conteneurisation (cgroups, namespaces) comme le fait Linux. Les développeurs intéressés par les environnements conteneurisés sous macOS ont dû recourir à des machines virtuelles (QEMU, VirtualBox, Docker Desktop, Colima ou Lima) pour faire tourner des conteneurs Linux dans une VM. Bien que ces solutions fonctionnent, elles introduisent une couche de virtualisation supplémentaire, avec un impact sur les performances, l’UX (montage de volumes, accès au réseau…) et parfois des limitations (disks, CPU partagés).
Apple, discrètement, semble vouloir changer la donne.
Container exécute des images OCI standard, mais n'utilise pas une seule VM Linux partagée. Au lieu de cela, il crée une petite machine virtuelle Linux pour chaque conteneur que vous démarrez. Cela semble lourd au premier abord, mais les VM sont légères et démarrent rapidement. Chacune est isolée, ce qui, selon Apple, améliore à la fois la sécurité et la confidentialité. Les développeurs peuvent exécuter localement des charges de travail conteneurisées grâce à la prise en charge native de macOS et sans avoir besoin d'installer des plateformes de conteneurs tierces.
Les conteneurs, pour mémoire, sont des paquets compacts qui contiennent une application et tout ce dont elle a besoin pour fonctionner. Les développeurs les utilisent pour garantir la cohérence entre le développement, les tests et la production. Ils sont largement utilisés dans les pipelines de CI et les environnements de serveur, car ils peuvent être déplacés d'une machine à l'autre sans interruption.
L'approche d'Apple avec Container reprend cette idée, mais remplace le modèle de VM partagée par des machines virtuelles minimales séparées. Elle s'appuie fortement sur les technologies Apple telles que le framework de virtualisation pour le lancement de machines virtuelles Linux, vmnet pour la mise en réseau, XPC pour la communication entre les processus et launchd pour le contrôle des services. L'outil prend même en charge Keychain pour le stockage des informations d'identification et utilise la journalisation macOS pour les diagnostics.
En quoi est-il différent de Docker ?
Alors que Docker s'appuie sur les primitives de conteneurisation intégrées à Linux (comme les espaces de noms et les cgroups), Container d'Apple utilise le cadre Virtulization.framework pour exécuter des conteneurs dans des micro-VM entièrement séparés. Cela signifie des limites de sécurité plus fortes, mais avec un surcoût de démarrage supplémentaire par rapport aux conteneurs Linux natifs.
Docker utilise une architecture basée sur des démons avec des systèmes de fichiers en couches et une configuration réseau complexe. Le conteneur d'Apple se concentre sur des composants plus simples et composables. Il n'y a pas de démon central, pas d'analyse de fichiers Docker ni de systèmes de fichiers superposés. Tout est géré à l'aide des API Swift et des commandes shell de la CLI.
Une approche native de la conteneurisation Linux
Contrairement aux approches traditionnelles qui reposent souvent sur une seule machine virtuelle Linux partagée, "Container" d'Apple propose une méthode plus intégrée et sécurisée. Chaque conteneur est exécuté dans une machine virtuelle Linux légère et dédiée, ce qui garantit une meilleure isolation et une sécurité accrue. Cette architecture minimise la surface d'attaque et simplifie la maintenance en utilisant un système de fichiers minimal.
L'outil tire parti des frameworks existants de macOS, offrant une intégration transparente avec l'écosystème Apple. Il permet aux développeurs de gérer les charges de travail conteneurisées localement avec un support natif, éliminant le besoin d'installer des plateformes de conteneurisation tierces. Des fonctionnalités telles que l'intégration du trousseau pour le stockage des informations d'identification et l'utilisation des journaux macOS pour le diagnostic soulignent cette approche native.
Ce qu’a lancé Apple sur GitHub
Tout commence avec un dépôt GitHub publié par Apple, nommé simplement Container. L’objectif est simple mais ambitieux : permettre l’exécution de conteneurs Linux « natifs » sur macOS, sans recours à une VM complète. Le code est écrit en Swift, spécialement optimisé pour les puces Apple Silicon.
Composants majeurs :
- container : outil en Swift pour créer et exécuter des conteneurs Linux sous macOS.
- container-builder-shim : interface entre le système hôte (Swift) et BuildKit, pour construire des images conteneurs.
- Émulation légère de conteneurs OCI (Docker) avec appui sur des services internes comme containerd, runc/buildkit adaptés.
Le dépôt Apple rejoint un effort déjà amorcé par la communauté open source (organisation macOScontainers), qui visait à forker containerd/buildkit/runc pour supporter macOS (à travers des projets comme darwin containers, rund, etc.)
Optimisation et avantages
Le nouveau framework de conteneurisation d'Apple est optimisé pour les puces Apple Silicon, promettant des performances améliorées et des temps de démarrage de sous-seconde pour chaque conteneur. Cette efficacité est cruciale pour les développeurs qui jonglent avec plusieurs environnements de développement. Chaque machine virtuelle légère reçoit une adresse IP dédiée, ce qui facilite la gestion des réseaux au sein des environnements conteneurisés.
L'outil de ligne de commande des conteneurs permet aux utilisateurs de créer des images, de démarrer des conteneurs et d'interagir avec les registres OCI. Il fonctionne avec un service d'arrière-plan appelé container-apiserver. Lorsque vous exécutez le démarrage du système de conteneurs, cet agent lance et gère tous les processus de support. Il s'agit notamment de container-core-images pour le stockage des images et de container-network-vmnet pour la gestion des fonctions réseau. Chaque conteneur en cours d'exécution obtient sa propre instance de container-runtime-linux, qui gère la communication avec la VM.
En termes de sécurité et de confidentialité, la création d'une machine virtuelle Linux distincte pour chaque conteneur est un avantage majeur. Cela améliore l'isolation des processus et offre un contrôle plus précis sur le partage de fichiers. Pour les entreprises et les développeurs soucieux de la sécurité, cette caractéristique est particulièrement attrayante.
Comme chaque conteneur possède sa propre VM, cette configuration permet une meilleure isolation. Cela signifie également que vous n'avez pas à surexposer les ressources de l'hôte lorsque vous montez des fichiers. Vous pouvez monter uniquement ce qui est nécessaire dans le conteneur, en évitant les configurations de partage de fichiers fourre-tout que certains autres outils requièrent.
Limitations et perspectives d'avenir
Si un conteneur...
La fin de cet article est réservée aux abonnés. Soutenez le Club Developpez.com en prenant un abonnement pour que nous puissions continuer à vous proposer des publications.