Cómo solucionar el error “Docker permission denied” en Ubuntu

Cómo solucionar el error “Docker permission denied” en Ubuntu

El error de permiso denegado de Docker suele producirse cuando tu cuenta de usuario no tiene acceso al socket del daemon de Docker o a los archivos y directorios necesarios.

Docker utiliza estas restricciones para evitar accesos no autorizados, pero pueden interrumpir tu flujo de trabajo cuando configuras entornos de desarrollo en Ubuntu.

Para arreglar el error “Docker permission denied”, sigue estas seis soluciones probadas:

  1. Modificar la pertenencia a un grupo de usuarios: añade tu cuenta de usuario al grupo docker para poder ejecutar comandos Docker sin sudo.
  2. Ajustar la propiedad de archivos y directorios: actualiza la propiedad de los archivos de configuración y los volúmenes montados para garantizar que el motor Docker pueda leer y escribir datos.
  3. Inspeccionar los permisos de los sockets: comprueba los niveles de permiso del socket Docker Unix para confirmar que el canal de comunicación no está restringido.
  4. Actualizar los derechos de ejecución de scripts: asegúrate de que los comandos Dockerfile y los scripts ENTRYPOINT tienen permisos de ejecución para evitar fallos en el arranque del contenedor.
  5. Configurar el acceso al hardware: permite que los contenedores accedan a dispositivos específicos, como dispositivos USB o GPU, para resolver problemas de permisos relacionados con el hardware.
  6. Actualizar el daemon Docker: reinicia el servicio Docker y tu sesión de usuario para aplicar todos los cambios de permisos y grupos.

Requisitos previos

Antes de solucionar el error “Docker permission denied” asegúrate de que tu sistema Linux cumple los requisitos para cambiar la configuración administrativa.

  • Acceso administrativo: necesitas privilegios sudo o root para modificar los grupos de usuarios y los permisos de archivos.
  • Verificación del grupo de usuarios: comprueba tu pertenencia a grupos ejecutando el comando groups $USER.

Aunque estas instrucciones se centran en Ubuntu, también se aplican a la mayoría de las distribuciones basadas en Debian.

1. Añade tu usuario al grupo Docker

La causa más común del error de permiso denegado es que tu cuenta de usuario no forma parte del grupo docker.

Por defecto, el daemon Docker se ejecuta como un servicio propiedad de root. Solo los usuarios del grupo docker pueden comunicarse con él sin usar sudo.

Para solucionar este problema, añade tu usuario actual al grupo docker:

sudo usermod -aG docker $USER

Este comando actualiza tu cuenta de usuario añadiendo (-a) al grupo especificado (-G). Como resultado, tu usuario obtiene permiso para acceder al socket del daemon Docker y ejecutar comandos Docker directamente.

Para aplicar la nueva pertenencia a un grupo, cierra la sesión y vuelve a iniciarla.

Después de volver a conectarte, confirma que el cambio ha surtido efecto:

id -nG

La salida debe incluir docker en la lista de grupos.

Si quieres hacer la prueba inmediatamente sin cerrar la sesión, ejecútala:

newgrp docker

Este comando aplica el cambio de grupo solo a la sesión de terminal actual.

2. Arregla problemas de permisos de archivos y directorios

Si añadir tu usuario al grupo no resuelve el problema, es posible que el error se deba a permisos incorrectos en los archivos de configuración o en los volúmenes montados.

Docker necesita acceso de lectura y escritura a tus archivos de configuración, especialmente config.json.

En primer lugar, comprueba los permisos de tu directorio local de configuración de Docker:

ls -l ~/.docker/

Si la salida muestra que los archivos son propiedad de root en lugar de tu usuario, cambia la propiedad con el comando chown:

sudo chown -R "$USER":"$USER" "$HOME/.docker"

Este comando cambia recursivamente la propiedad del directorio .docker a tu usuario actual.

A continuación, soluciona los problemas de permisos relacionados con los volúmenes montados. Cuando montas un directorio host en un contenedor, el usuario del contenedor necesita permiso para leer o escribir en ese directorio.

Por ejemplo, si ejecutas un contenedor con un volumen montado:

docker run -v ~/data:/app/data ubuntu

Asegúrate de que el directorio ~/data del host tiene los permisos correctos. Puedes conceder acceso de lectura y escritura al usuario (u) con el siguiente comando chmod:

chmod u+rw ~/data

Esto garantiza que el usuario propietario del directorio tiene permisos suficientes para gestionar los datos dentro del volumen montado.

3. Comprueba los permisos de socket Docker

El daemon Docker se comunica a través de un socket Unix ubicado en /var/run/docker.sock. Si este socket tiene permisos incorrectos, el cliente Docker no puede enviar comandos al daemon.

Comprueba los permisos actuales del socket:

ls -l /var/run/docker.sock

Deberías ver una salida similar a la siguiente:

srw-rw---- 1 root docker 0 Dic 18 10:00 /var/run/docker.sock

Esta salida muestra que root posee el socket y el grupo docker tiene acceso de lectura y escritura. Si ves esta salida y tu usuario pertenece al grupo docker, la configuración del socket es correcta.

Si el grupo no es docker o los permisos difieren, no los cambies manualmente ejecutando chmod 666 /var/run/docker.sock, especialmente en entornos de producción.

Este comando crea un grave riesgo de seguridad al dar a todos los usuarios del sistema acceso al daemon Docker, lo que efectivamente otorga control a nivel de raíz sobre el host.

En su lugar, confía en la pertenencia a un grupo añadiendo tu usuario al grupo docker. El demonio Docker establece automáticamente los permisos de socket correctos al iniciarse.

4. Corrige los permisos de los scripts Dockerfile o ENTRYPOINT

Un error “Docker permission denied” también puede ocurrir dentro de un contenedor cuando el script de entrada carece de permisos de ejecución.

Este problema suele aparecer cuando se mueven scripts desde un sistema de archivos que no es Linux, como Windows, al contexto de compilación de Docker. En estos casos, el bit ejecutable puede perderse.

Cuando esto ocurre, el contenedor falla al arrancar porque no puede ejecutar el script definido en la instrucción ENTRYPOINT o CMD.

Para solucionar el problema, añade una instrucción RUN después de la línea COPY en tu Dockerfile. Esto concede permisos de ejecución al script.

RUN chmod +x /usr/local/bin/entrypoint.sh

Esto garantiza que el script siga siendo ejecutable independientemente de tus permisos en la máquina anfitriona. A menudo necesitarás este paso cuando construyas imágenes personalizadas que dependan de scripts de inicio.

5. Concede acceso de dispositivo a contenedores Docker

Si un contenedor necesita interactuar con dispositivos de hardware, como una unidad USB, una webcam o una GPU, puede que veas un error de permiso denegado para una ruta de dispositivo como /dev/ttyUSB0.

Por defecto, los contenedores se ejecutan de forma aislada y no pueden acceder a los dispositivos host. Para permitir el acceso, pasa explícitamente el dispositivo cuando inicies el contenedor utilizando el indicador –device:

docker run --device=/dev/ttyUSB0 my-image

Si el contenedor necesita permisos más amplios pero no acceso total al dispositivo, concede capacidades específicas de Linux con el indicador –cap-add:

docker run --cap-add=SYS_ADMIN mi-imagen

Este enfoque sigue el principio del menor privilegio: conceder sólo las capacidades que el contenedor necesita realmente. Entre las funciones comunes se incluyen NET_ADMIN para la configuración de la red y SYS_PTRACE para la depuración.

Cuando los dispositivos o capacidades específicos no son suficientes, puedes utilizar el indicador –privileged:

docker run --privileged mi-imagen

Esta opción proporciona al contenedor acceso completo a todos los dispositivos host y desactiva la mayoría de las funciones de aislamiento de seguridad.

Los contenedores iniciados en este modo pueden obtener control a nivel de raíz sobre el sistema anfitrión. Utiliza –privileged sólo en entornos de desarrollo locales de confianza o cuando no existan alternativas más seguras.

Para cargas de trabajo de producción, opta siempre por –device para hardware específico o–cap-add para capacidades específicas.

6. Reinicia Docker y prueba tu configuración

Después de aplicar los cambios en los grupos de usuarios o las correcciones de permisos, reinicia el servicio Docker para que el daemon reconozca la configuración actualizada.

Reinicia Docker con systemctl:

sudo systemctl restart docker

Una vez reiniciado el servicio, verifica la corrección ejecutando el contenedor hello-world estándar sin utilizar sudo:

docker run hello-world

Si la imagen se descarga y ejecuta correctamente y muestra un mensaje de bienvenida, habrás resuelto el problema de los permisos.

Si el error persiste, reinicia todo el sistema para asegurarte de que todas las pertenencias a grupos y los cambios de sesión surtan efecto:

sudo reboot

¿Qué deberías aprender después en Docker?

Ahora que tu instalación de Docker funciona sin errores de permisos, estás listo para trabajar con contenedores con confianza y seguridad.

Solucionar los problemas de entorno es un primer paso esencial en tu camino de aprendizaje de Docker. Esto te permite centrarte en crear e implantar aplicaciones en lugar de solucionar problemas de configuración.

Como siguiente paso, profundiza en los conceptos básicos de Docker. Profundiza en la gestión de imágenes, los ciclos de vida de los contenedores, Docker Compose, la persistencia de datos y las redes de contenedores.

Todo el contenido de los tutoriales en este sitio web está sujeto a los rigurosos estándares y valores editoriales de Hostinger.

Author
El autor

Diego Boada

Diego es comunicador social, especialista en publicidad digital que trabaja constantemente en mejorar sus conocimientos de marketing digital, enfocándose en contenido y SEO. Idiomas, series, libros y cursos en internet son sus hobbies principales, además de los deportes. Este es su perfil de LinkedIn.