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.