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é par ss).

    • 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)

  1. 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
    
                      
  2. 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.