Resolución de problemas de Docker con errores de permisos

Ejecutar aplicaciones con Docker como rutina diaria puede convertirse en una pesadilla cuando te encuentras con un error como el de permiso denegado de Docker al intentar conectar. Pero no te preocupes, este artículo te ayudará a volver a funcionar en poco tiempo.

En este tutorial, aprenderás muchas formas de resolver el temido mensaje de error de permiso denegado de Docker.

Prerrequisitos

Este tutorial comprende demostraciones prácticas. Para seguir adelante, asegúrate de tener lo siguiente en su lugar:

  • Las demostraciones en este tutorial se ejecutan en Ubuntu 20.04, pero otras distribuciones de Linux también funcionarán.
  • El motor de Docker, con la versión del tutorial siendo la 20.10.8, build 3967b7d.

Ejecución de Comandos de Docker con Permisos Elevados

Muchos factores podrían llevar a un error de permiso denegado al conectar con Docker. Uno de esos factores es que puedes estar ejecutando comandos de Docker sin anteponer el comando sudo. El comando sudo es el que te otorga derechos administrativos elevados junto con privilegios de seguridad al ejecutar comandos.

A continuación, puedes ver el temido error de permiso denegado al intentar ejecutar un comando docker.

Running into a permission denied error

Abre tu terminal y añade sudo al comando docker a continuación para ejecutar la imagen Docker hello-world. Dado que estás ejecutando un comando elevado, deberás ingresar tu contraseña para proceder.

sudo docker run hello-world

Verás una salida similar a la que se muestra a continuación, lo que indica que Docker está instalado correctamente.

Running Elevated (sudo) Docker Commands

Reiniciando el Motor de Docker

Si ejecutar comandos de Docker con privilegios elevados no soluciona el error de permiso denegado, verifica que tu Motor de Docker esté en funcionamiento. Al igual que al ejecutar un comando docker sin el comando sudo, un Motor de Docker detenido provoca el error de permiso denegado. ¿Cómo solucionas el error? Reiniciando tu motor de Docker.

Ejecuta el comando systemctl a continuación para confirmar el estado del Motor de Docker (status docker) y si está en ejecución.

sudo systemctl status docker

A continuación, puedes ver que el Motor de Docker está en ejecución por el estado devuelto que muestra unctivo (en ejecución).

Displaying Docker Engine status

Si el Motor de Docker no está activo, ejecuta el comando systemctl a continuación para iniciar el Motor de Docker (start docker).

sudo systemctl start docker

Ahora, ejecuta el comando hello-world de Docker como lo hiciste en la sección “Ejecutar comandos de Docker con permisos elevados” para verificar que el error se haya resuelto.

sudo docker run hello-world

Agregando una cuenta de usuario a un grupo con acceso de usuario no root

Has confirmado que tu motor Docker está funcionando, ¿pero sigues obteniendo un error de permiso denegado de Docker? Si es así, necesitas agregar tu cuenta de usuario a un grupo con acceso de usuario no root. ¿Por qué? Porque cualquier comando de Docker que ejecutes en una máquina Linux que no esté en el grupo de usuario desencadena un error de permiso denegado.

  1. Ejecuta el comando groupadd a continuación para crear un nuevo grupo llamado docker. Ingresa tu contraseña para continuar ejecutando el comando.
sudo groupadd docker

Si el grupo docker existe en el grupo de usuario, verás una salida como la siguiente.

Creating a New Group Named ‘docker’

2. Luego, ejecuta el comando usermod a continuación, donde las opciones -aG indican al comando que agregue tu cuenta de usuario (programador) al grupo (docker). Este comando hace que tu cuenta de usuario tenga acceso no root.

sudo usermod -aG docker programmer

3. Ejecuta el comando newgrp a continuación para cambiar el ID de grupo real actual al grupo docker.

Ejecuta este comando cada vez que desees ejecutar Docker como usuario no root.

sudo newgrp docker 

4. Finalmente, vuelve a ejecutar la imagen Docker de hello-world para confirmar que ya no ves el error. Si, en este punto, sigues recibiendo un error, entonces considera dar más acceso al archivo docker.sock. El archivo docker.sock es el socket UNIX, una forma de comunicar información de proceso entre el usuario y el sistema, al que el demonio de Docker escucha como punto de entrada de la API de Docker.

Ejecuta el comando chmod a continuación para otorgar a todos los usuarios acceso de lectura/escritura (666) al archivo /var/run/docker.sock. Ahora vuelve a ejecutar la imagen Docker de hello-world para ver si se resuelve el error.

sudo chmod 666 /var/run/docker.sock

Edición del Archivo de Unidad de Servicio Docker

Si ejecutar Docker como usuario no root no es suficiente para solucionar el error, intenta editar el archivo de unidad de servicio SystemD de Docker, un sistema de control de servicios. El archivo de servicio Docker contiene parámetros sensibles que pueden alterar el comportamiento del demonio de Docker. Puedes modificar el comportamiento predeterminado del archivo de unidad Docker agregando un comando adicional para cambiar el comportamiento predeterminado del servicio.

1. Ejecuta el siguiente comando para abrir el archivo de unidad de servicio Docker en tu editor de texto favorito. Para este ejemplo, el archivo de servicio Docker se abre en el editor de texto nano.

sudo nano /usr/lib/systemd/system/docker.service

2. Localice el área con el encabezado [Servicio] dentro del archivo de unidad del servicio Docker, como se muestra a continuación. Copie/pegue los comandos a continuación en el archivo de unidad del servicio Docker y guarde los cambios.

A continuación, el comando SupplementaryGroups establece los grupos Unix suplementarios donde se ejecutan los procesos. Al mismo tiempo, el comando ExecStartPost limpia las operaciones que se ejecutan incluso si el servicio no se inicia correctamente.

SupplementaryGroups=docker    
ExecStartPost=/bin/chmod 666 /var/run/docker.sock
Editing the Docker Service Unit File

3. Ahora, ejecute los comandos a continuación para reiniciar y habilitar el servicio Docker. Hacerlo le permite iniciar el servicio Docker de nuevo para evitar errores cuando ejecute comandos Docker.

# Recarga todos los archivos de unidad de Docker y recrea todo el árbol de dependencias.
sudo systemctl daemon-reload
# Reinicia el servicio Docker
sudo systemctl start docker
# Habilita Docker para ejecutarse en su computadora.
sudo systemctl enable docker

4. Finalmente, vuelva a ejecutar la imagen Docker hello-world y vea si aún recibe el error de permiso denegado.

Ejecución de Docker en Modo de Privilegio

Por último, pero no menos importante, en la lista de soluciones al error de permiso denegado de Docker está ejecutar Docker en modo privilegiado. Hacerlo otorga a un contenedor Docker acceso de root al sistema.

Ejecutar Docker en modo privilegiado es arriesgado y vulnerable a ataques de hackers. Así que tenga precaución y solo ejecute Docker en modo privilegiado cuando sepa exactamente lo que está haciendo.

1. Ejecute el comando a continuación para listar todos los contenedores Docker en su sistema y obtener el ID del contenedor que desea ejecutar.

sudo docker ls -a
Listing all Docker Containers in the System

2. A continuación, ejecute el comando docker inspect a continuación para verificar si el contenedor que desea ejecutar ya está en modo privilegiado (--format='{{.HostConfig.Privileged}}'). Reemplace CONTAINER_ID a continuación con el ID del contenedor real que tomó nota en el paso uno.

docker inspect --format='{{.HostConfig.Privileged}}' CONTAINER_ID

Si el contenedor está en modo privilegiado, el comando devuelve un valor true en la consola. Pero si el comando devuelve un valor falso, como se muestra a continuación, continúe con el siguiente paso.

Checking if a Container is in Privileged Mode

3. Por último, ejecute el comando docker a continuación para run el contenedor Docker en modo privilegiado (--privileged hello-world).

sudo docker run --privileged hello-world

Conclusión

A lo largo de este tutorial, ha aprendido muchas formas de resolver el error de permiso denegado de Docker, desde la ejecución de comandos elevados hasta la ejecución de Docker en modo privilegiado.

Ahora sabe cómo deshacerse de un error al construir aplicaciones Docker-powered; ¿quizás también quiera mantener sus imágenes de Docker limpias en todo momento?

Source:
https://adamtheautomator.com/docker-permission-denied/