El error «permission denied while trying to connect to the Docker daemon socket» significa que tu usuario no tiene permisos para acceder a /var/run/docker.sock. Esta guía te muestra cómo corregirlo y entender las implicaciones de seguridad.

Síntoma

Al ejecutar cualquier comando docker falla con:

docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied

O al construir o ejecutar contenedores:

docker build -t myapp:latest .
Got permission denied...

docker run -it ubuntu bash
Got permission denied...

Por qué ocurre

Ordenado por probabilidad:

  1. El usuario no está en el grupo docker — Por defecto, solo root y los usuarios en el grupo docker pueden acceder al socket de Docker.
  2. El modo Docker rootless está activo — El daemon de Docker se ejecuta como un usuario no-root, por lo que la ubicación y propiedad del socket son diferentes.
  3. La propiedad del socket es incorrecta — /var/run/docker.sock es propiedad de root u otro usuario, no de tu usuario o del grupo docker.
  4. Instalación de Docker via Snap — El confinamiento de Snap puede impedir el acceso al socket.
  5. WSL2 (Windows Subsystem for Linux) peculiaridades — Docker Desktop para Windows usa una ruta de socket diferente o método de integración.
  6. El archivo socket fue eliminado o recreado — Después de una actualización del sistema o reinicio de Docker, el socket podría tener permisos incorrectos.

Solución

1. El usuario no está en el grupo docker

Añade tu usuario al grupo docker:

sudo usermod -aG docker $USER

Los flags aG significan «append to groups» así que mantienes tus grupos existentes.

Aplica el cambio de grupo. Elige una opción:

Opción A: Recargar membresía de grupo (solo esta sesión):

newgrp docker

Opción B: Cierra sesión e inicia sesión nuevamente (permanente):

logout
# Inicia sesión nuevamente

Verifica que funciona:

docker ps
# Debe devolver lista de contenedores sin "permission denied"

Comprueba que estás en el grupo docker:

id -G
# Debe incluir un número para el grupo 'docker' (usualmente 999)

groups $USER
# Debe mostrar: user : user docker ...

2. El modo Docker rootless está activo

Docker rootless ejecuta el daemon como un usuario no-root. Verifica si está habilitado:

docker run --rm -it alpine cat /proc/self/cgroup | grep docker
# Si rootless, la ruta incluye /user.slice/...

O verifica la ubicación del socket de Docker:

# Estándar: /var/run/docker.sock
# Rootless: ~/.docker/run/docker.sock

ls -la /var/run/docker.sock
ls -la ~/.docker/run/docker.sock

Si usas Docker rootless, tu usuario ya debería tener acceso porque el daemon se ejecuta como tu usuario. Verifica:

docker ps

Si obtienes un error de permisos diferente, el daemon podría no estar ejecutándose. Inicia:

# Para Docker rootless
dockerd-rootless-setuptool.sh install

# O inicia manualmente
start-rootless

Para cambiar nuevamente a Docker estándar (con docker group):

# Desinstala rootless
dockerd-rootless-setuptool.sh uninstall

# Instala Docker estándar
# (Sigue la guía de instalación de tu distribución)

3. La propiedad del socket es incorrecta

Verifica quién es dueño del socket de docker:

ls -la /var/run/docker.sock
# Resultado: srw-rw---- 1 root docker 0 Oct 26 11:00 /var/run/docker.sock

Debe ser propiedad de root:docker con permisos 660. Si no lo es:

# Corrige la propiedad
sudo chown root:docker /var/run/docker.sock

# Corrige los permisos
sudo chmod 660 /var/run/docker.sock

Verifica:

ls -la /var/run/docker.sock
# Ahora muestra: srw-rw---- 1 root docker ...

docker ps

Si el socket se eliminó (por ejemplo, después de un crash del sistema o actualización), reinicia Docker:

sudo systemctl restart docker
ls -la /var/run/docker.sock    # Debe reaparecer

4. Instalación de Docker via Snap

El confinamiento de Snap puede impedir el acceso a Docker. Verifica si Docker fue instalado via Snap:

which docker
# Si muestra: /snap/bin/docker
# Entonces es una instalación Snap

Para permitir que Snap acceda al socket de Docker, usa la interfaz docker:

snap connect docker:docker-daemon

O elimina la versión Snap e instala Docker oficialmente:

snap remove docker

# Sigue la instalación oficial de Docker para tu distribución
# por ejemplo, para Ubuntu:
sudo apt-get install docker.io

# Luego añade tu usuario al grupo docker
sudo usermod -aG docker $USER
newgrp docker

5. WSL2 (Windows Subsystem for Linux) peculiaridades

En Windows con WSL2, Docker Desktop para Windows usa una integración especial. Verifica qué Docker está ejecutándose:

docker version
# Si se conecta a Docker Desktop, el contexto podría ser "desktop-linux"

Verifica que Docker está ejecutándose:

docker ps
# Si la conexión falla, Docker Desktop no está ejecutándose en Windows

Inicia Docker Desktop (en Windows):
1. Abre Docker Desktop desde el Menú Inicio
2. Espera a que se inicialice (usualmente 30 segundos)
3. Vuelve a la terminal WSL2

Luego verifica:

docker ps

Si quieres usar Docker dentro de WSL2 (no Docker Desktop para Windows):

# Instala Docker directamente en WSL2
sudo apt-get install docker.io

# Añade tu usuario al grupo docker
sudo usermod -aG docker $USER
newgrp docker

# Inicia el daemon de Docker
sudo systemctl start docker

6. El archivo socket fue eliminado o recreado

Si el socket fue eliminado (por ejemplo, si /var/run se limpia en algunos sistemas), reinicia Docker:

sudo systemctl restart docker
ls -la /var/run/docker.sock    # Debe reaparecer con permisos correctos

Asegúrate de que el socket persista entre reinicios. Verifica la unidad systemd de Docker:

systemctl status docker
# Debe mostrar que está habilitado y ejecutándose

Habilita Docker para que inicie en el arranque:

sudo systemctl enable docker

Cómo evitarlo

  1. Añade usuarios al grupo docker durante la configuración:

    sudo usermod -aG docker myuser
    

  2. Haz que los permisos del socket sean persistentes. Usualmente se restauran cuando Docker se reinicia, pero también puedes configurarlos en el archivo de configuración del daemon de Docker:

    sudo mkdir -p /etc/docker
    cat <<'EOF' | sudo tee /etc/docker/daemon.json
    {
      "group": "docker"
    }
    EOF
    sudo systemctl restart docker
    

  3. Entiende el riesgo de seguridad. Cualquiera en el grupo docker tiene acceso equivalente a root. Solo añade usuarios de confianza.

  4. Usa Docker rootless para aislamiento adicional si quieres dar a los usuarios acceso a Docker sin privilegios equivalentes a root:

    dockerd-rootless-setuptool.sh install
    

  5. Verifica la propiedad del socket después de actualizaciones del sistema:

    ls -la /var/run/docker.sock
    

Nota de seguridad: Grupo Docker = Root

Añadir un usuario al grupo docker efectivamente les da acceso root. Aquí está por qué:

# Cualquier miembro del grupo docker puede ejecutar contenedores como root
docker run -it --rm -v /:/mnt ubuntu bash
# Dentro del contenedor, /mnt apunta al sistema de archivos del host
# Y estás ejecutándose como root dentro del contenedor
# Así que puedes modificar cualquier cosa en el host

# O monta el sistema de archivos root del host
docker run -it --rm -v /proc:/host/proc ubuntu bash
# Accede a procesos del host y estado del kernel

# O escapa al host via volúmenes
docker run -it --rm -v /root/.ssh:/tmp ubuntu bash
# Accede a archivos sensibles

Mejores prácticas:
1. Solo añade usuarios en los que confías plenamente al grupo docker.
2. Usa Docker rootless si quieres restringir el acceso.
3. Usa perfiles SELinux o AppArmor para restringir aún más las capacidades del contenedor.
4. En sistemas multi-usuario, prefiere acceso centralizado a Docker (por ejemplo, via un sistema CI/CD que gestione permisos).

Preguntas frecuentes

¿Cómo corrijo ‘permission denied while trying to connect to the Docker daemon socket’?

Añade tu usuario al grupo docker: sudo usermod -aG docker $USER, luego cierra sesión e inicia sesión nuevamente o ejecuta newgrp docker. Advertencia: esto da al usuario permisos equivalentes a root.

¿Qué significa ‘docker group = root’?

Cualquiera en el grupo docker puede ejecutar contenedores con privilegios root. Es equivalente al acceso sudo. Solo añade usuarios de confianza al grupo docker.

¿Por qué Docker requiere acceso root?

Los contenedores Docker usan namespaces de Linux y cgroups, que requieren root. El modo Docker rootless (daemon no-root) existe pero no es el predeterminado.

¿Cómo verifico si mi usuario está en el grupo docker?

Ejecuta groups $USER o id -G. Si ves ‘docker’ en la lista, estás en el grupo. Verifica con docker ps (no debe pedir sudo).

Cómo se verificó esta guía

Escrita a mano a partir de la documentación oficial, con cada comando comprobado de nuevo y una segunda revisión antes de publicar. Última revisión: .

Fuentes oficiales consultadas para este artículo

Share.

Los comentarios están cerrados.