Yes — ça explique pas mal de bizarreries.
Ce que je vois
-
Deux démons Docker tournent en parallèle :
-
Rootful (system-wide) :
dockerd
PID 16593, socket /run/docker.sock (affiché parss
). -
Rootless (pour l’utilisateur
mathben
) :rootlesskit … dockerd
+ son containerd et des shims pointant vers /run/user/1001/docker/containerd/containerd.sock.
→ Les containers actifs (IDs que tu as montrés) appartiennent à ce démon rootless.
-
-
Donc tu as deux “univers” Docker en même temps. Selon le socket auquel le CLI parle, tu vois… ou pas… les mêmes conteneurs. Ça peut rendre le diagnostic confus, et compliquer le réseau/les ports.
-
Le warning au démarrage :
Error (Unable to complete atomic operation, key modified) deleting object [endpoint_count ...], retrying...
est bénin (race condition connue au chargement du store réseau).
Pourquoi c’est important
-
Le rootless utilise
slirp4netns
et un port-driver userland ; c’est indépendant de nftables et peut se comporter différemment (débit / NAT / publis de ports). -
Le rootful publie les ports via netfilter/nftables (ce qu’on a durci).
-
Avoir les deux peut créer des attentes contradictoires (ex: tu ajustes le firewall de l’hôte mais tes conteneurs tournent en rootless et n’en dépendent pas).
Que faire (choisir UNE voie)
-
Si tu veux un hôte serveur “classique” → garde le rootful et désactive le rootless :
# voir si un socket rootless existe sudo -u mathben systemctl --user status docker docker.socket containerd # désactiver/arrêter rootless pour mathben sudo -u mathben systemctl --user disable --now docker.service docker.socket containerd.service # au besoin tuer le runtime userland pkill -u mathben rootlesskit || true pkill -u mathben dockerd || true pkill -u mathben containerd || true # vérifier ps -ef | egrep '[d]ockerd|containerd' | egrep -v '/run/user/1001' || true
-
Si tu préfères le rootless (moins de privilèges) → arrête le rootful :
systemctl disable --now docker.service docker.socket systemctl mask docker.service docker.socket # le CLI devra parler au socket user export DOCKER_HOST=unix:///run/user/1001/docker.sock # pour tes sessions
Recommandation pour un serveur prod : une seule pile (plutôt rootful, plus prévisible côté réseau).
Sanity-checks utiles
-
Voir vers quel démon parle ton CLI :
echo "DOCKER_HOST=${DOCKER_HOST:-<default /run/docker.sock>}" docker info | sed -n '1,20p' sudo -u mathben DOCKER_HOST=unix:///run/user/1001/docker.sock docker ps -a --format 'rootless: {{.ID}} {{.Names}}' docker -H unix:///run/docker.sock ps -a --format 'rootful: {{.ID}} {{.Names}}'
-
Confirmer qu’il ne reste qu’un dockerd/containerd après ton choix :
ss -lx | egrep 'docker\.sock|containerd\.sock' || true ps -ef | egrep '[d]ockerd|containerd' || true
Si tu me dis lequel tu veux conserver (rootful vs rootless), je te donne la séquence complète pour basculer proprement tes stacks (compose) et éviter toute confusion côté journaux et réseau.