Ce qui se passe
nspawn est un outil qui gère des conteneurs systemd-nspawn — plus légers qu'un conteneur Docker,
et intégrés au système. Sa version 3.0.0 sert désormais l'API Docker Engine directement sur
l'hôte. Jusqu'ici (2.0.0), seules les machines qui montaient la socket Docker en voyaient une copie
en lecture seule ; maintenant, l'API est exposée sur l'hôte lui-même.
Comment ça marche
La socket de l'hôte est /run/nspawn/api.sock, ouverte par l'unité nspawn-api.socket. Les paquets la
livrent désactivée ; on l'active, et nspawn-api.service démarre à la première connexion :
sudo systemctl enable --now nspawn-api.socket
export DOCKER_HOST=unix:///run/nspawn/api.sock
docker run -d --name web -p 8080:80 nginx
docker exec -it web sh
docker cp web:/etc/nginx/nginx.conf .
docker rm -f webL'API répond dans les formes de la version 1.51, et des versions jusqu'à 1.24 que les clients
réclament. Elle couvre les conteneurs (create, start, stop, exec, attach, archive pour
docker cp…), les images (pull, remove, prune), les volumes et les réseaux. L'intérêt principal
est la compatibilité : un outil qui pilote des conteneurs par l'API Docker tourne sur nspawn sans y
toucher. L'exécuteur docker de GitLab Runner en est l'exemple direct :
[[runners]]
executor = "docker"
[runners.docker]
host = "unix:///run/nspawn/api.sock"
image = "alpine:latest"Pour les clients qui ne regardent que /run/docker.sock, un drop-in ajoute le lien symbolique.
Le point de sécurité à ne pas manquer
L'API applique les mêmes actions polkit que la ligne de commande : lire et attendre demandent
org.nspawn.inspect, les journaux et les changements demandent org.nspawn.manage. Et c'est là le
piège : un utilisateur qui détient org.nspawn.manage est root sur l'hôte, exactement comme un
membre du groupe docker — une machine lance des commandes en root et peut monter n'importe quel chemin
de l'hôte.
Conséquence pratique : un proxy ou un tableau de bord qui ne fait que lire doit monter la socket en
lecture seule (:ro). Dans ce mode, elle lit, suit les journaux et tue, mais refuse tout le reste
avec un 403.
Limites
docker buildne fonctionne pas contre la socket : c'estnspawn buildqui construit. Les builds,load,import,tag,push,commit, les renommages,swarmet les plugins répondent 501, non pris en charge.- Les versions 3.1.0 (règles
--device-cgroup-rulepour les périphériques qui vont et viennent) et 3.2.0 (nommage uniforme des machines et des images) sont déjà sorties. - Paquets pour Fedora 44+, Debian 13+ / Ubuntu 24.04+ et Arch, sur
apt.nspawn.orgetrpm.nspawn.org.
Source : blog nspawn, en anglais.