992 votos

¿Cómo puedo usar Docker sin sudo?

En las páginas de documentación de Docker, todos los comandos de ejemplo se muestran sin sudo, como este:

docker ps

En Ubuntu, el ejecutable se llama docker.io. Tampoco funciona sin sudo:

sudo docker.io ps

¿Cómo puedo configurar Docker para que no necesite agregar sudo delante de cada comando de Docker?

2 votos

No olvides activar ufw ;)

2 votos

En Ubuntu 14.04 también se encuentra el binario 'docker'. Translated to: En Ubuntu 14.04 también se encuentra el binario 'docker'.

0 votos

@anatolytechtonik También utilicé 'docker' en lugar de 'docker.io' en Ubuntu 14.04 LTS

1350voto

Ayush Goyal Puntos 141

Buena noticia: la nueva versión de Docker 19.03 (actualmente experimental) podrá ejecutarse sin privilegios de root, evitando los problemas que pueden surgir al usar un usuario root. Ya no habrá necesidad de lidiar con permisos elevados, root, y cualquier cosa que pueda abrir tu máquina cuando no querías.

Video sobre esto de [DockerCon 2019] Reforzando el daemon de Docker con el modo sin privilegios de root

Algunas advertencias sobre el modo de Docker sin privilegios de root

Los ingenieros de Docker dicen que el modo sin privilegios no puede considerarse como un reemplazo para todas las funciones del motor de Docker. Algunas limitaciones del modo sin privilegios incluyen:

  • los controles de recursos de cgroups, los perfiles de seguridad de apparmor, checkpoint/restore, redes superpuestas, etc. no funcionan en el modo sin privilegios.
  • Exponer puertos desde los contenedores actualmente requiere un proceso helper de socat manual.
  • Solo los sistemas basados en Ubuntu admiten sistemas de archivos superpuestos en modo sin privilegios de root.
  • El modo sin privilegios solo se proporciona actualmente para compilaciones nocturnas que pueden no ser tan estables como estás acostumbrado.

A partir de Docker 19.3 esto es obsoleto (y más peligroso de lo necesario):

El manual de Docker tiene esto que decir al respecto:

Proporcionar acceso sin root

El daemon de Docker siempre se ejecuta como usuario root, y desde la versión 0.5.2 de Docker, el daemon de Docker se enlaza a un socket Unix en lugar de a un puerto TCP. Por defecto, ese socket Unix es propiedad del usuario root, y por lo tanto, por defecto, puedes acceder a él con sudo.

A partir de la versión 0.5.3, si tú (o tu instalador de Docker) crean un grupo Unix llamado docker y añaden usuarios a él, entonces el daemon de Docker hará que la propiedad del socket Unix sea de lectura/escritura por el grupo docker al iniciarse el daemon. El daemon de Docker siempre debe ejecutarse como usuario root, pero si ejecutas el cliente de Docker como un usuario en el grupo docker entonces no necesitas añadir sudo a todos los comandos del cliente. A partir de la versión 0.9.0, puedes especificar que un grupo distinto a docker debe ser dueño del socket Unix con la opción -G.

Advertencia: El grupo docker (o el grupo especificado con -G) es equivalente a root; ver detalles de la superficie de ataque del daemon de Docker y este blogpost sobre Por qué no permitimos que usuarios sin root ejecuten Docker en CentOS, Fedora o RHEL (gracias michael-n).

En la reciente versión del modo sin privilegios experimental en GitHub, los ingenieros mencionan que el modo sin privilegios permite ejecutar dockerd como un usuario no privilegiado, utilizando user_namespaces(7), mount_namespaces(7), network_namespaces(7).

Los usuarios deben ejecutar dockerd-rootless.sh en lugar de dockerd.

$ dockerd-rootless.sh --experimental

Dado que el modo sin privilegios es experimental, los usuarios siempre deben ejecutar dockerd-rootless.sh con --experimental.


Importante leer: pasos posteriores a la instalación para Linux (también enlaza a detalles de la superficie de ataque del daemon de Docker).

Administrar Docker como un usuario no root

El daemon de Docker se enlaza a un socket Unix en lugar de a un puerto TCP. Por defecto, este socket Unix es propiedad del usuario root y otros usuarios solo pueden acceder a él usando sudo. El daemon de Docker siempre se ejecuta como usuario root.

Si no quieres utilizar sudo cuando uses el comando de Docker, crea un grupo Unix llamado docker y añade usuarios a él. Cuando el daemon de Docker se inicia, hace que la propiedad del socket Unix sea de lectura/escritura por el grupo docker.


  • Añadir el grupo docker si no existe:

     sudo groupadd docker
  • Añadir el usuario conectado "$USER" al grupo docker. Cambia el nombre de usuario para que coincida con tu usuario preferido si no deseas utilizar tu usuario actual:

     sudo gpasswd -a $USER docker
  • Haz newgrp docker o cierra sesión/abre sesión para activar los cambios en los grupos.

  • Puedes usar

     docker run hello-world

    para comprobar si puedes ejecutar Docker sin sudo.

0 votos

@Chechus "Necesitas cerrar la sesión y volver a iniciarla para que este cambio tenga efecto" ¿ha estado allí por más de un año?

0 votos

@Rinzwind ¿Podrías considerar algunas implicaciones de seguridad que esto pueda tener para el sistema anfitrión y mencionarlas en la respuesta?

2 votos

¿No es esa la arquitectura más insegura para producción? Debo estar perdiéndome algo

338voto

Martijn Puntos 1531

Para ejecutar el comando docker sin sudo, necesitas agregar a tu usuario (quien tenga privilegios de root) al grupo de docker. Para esto, ejecuta el siguiente comando:

 sudo usermod -aG docker $USER

Ahora, haz que el usuario cierre sesión y vuelva a iniciar sesión. Esta solución está bien explicada aquí con el proceso de instalación adecuado.

30 votos

Después de agregar al usuario al grupo, ejecutar el siguiente comando: sg nombre_grupo -c "bash"

8 votos

¡No necesitas reiniciar el sistema operativo para que este cambio tenga efecto! ¡Eso afectará a todos los contenedores en ejecución! Simplemente haz que el usuario que acabas de añadir cierre sesión e inicie de nuevo.

2 votos

Esto es en efecto lo que la documentación oficial de Docker recomienda hacer para poder ejecutar Docker con usuarios sin privilegios:

118voto

Christian Hujer Puntos 116

El mecanismo por el cual agregar un usuario al grupo docker otorga permiso para ejecutar docker es tener acceso al socket de docker en /var/run/docker.sock. Si el sistema de archivos que contiene /var/run ha sido montado con ACLs habilitados, esto también se puede lograr a través de ACLs.

sudo setfacl -m user:$USER:rw /var/run/docker.sock

Solo estoy incluyendo esto por completitud.

En general, recomiendo evitar ACLs siempre que haya una buena alternativa basada en grupos disponible: es mejor si los privilegios en un sistema pueden entenderse simplemente mirando las membresías de grupos. Tener que escanear el sistema de archivos en busca de entradas de ACL para comprender los privilegios del sistema es una carga adicional para las auditorías de seguridad.

Advertencia 1: Esto tiene la misma equivalencia de root que agregar $USER al grupo docker. Todavía puedes iniciar un contenedor de manera que tenga acceso root al sistema de archivos del host.

Advertencia 2: Los ACLs son significativamente más difíciles de auditar en términos de seguridad que la seguridad basada en grupos. Probablemente evita ACLs si es posible cuando puedes usar grupos en su lugar, al menos en entornos relevantes para auditorías.

8 votos

Funcionó en 16.04

1 votos

Una forma mucho mejor en mi opinión. El grupo docker es equivalente a root y eso siempre es una señal de peligro. Y no veo ninguna desventaja en hacerse cargo de este archivo.

0 votos

¿Podrías describir qué comandos deben ejecutarse para "obtener acceso al socket de Docker en /var/run/docker.sock"?

13voto

gummiflummi Puntos 131

Después de crear el grupo docker y agregar mi usuario a él con

sudo groupadd docker
sudo usermod -aG docker $USER

... aún tuve que dar los permisos adecuados al socket /var/run/docker.sock y al directorio /var/run/docker para que funcionara:

sudo chown root:docker /var/run/docker.sock
sudo chown -R root:docker /var/run/docker

Cierra sesión y vuelve a iniciar sesión (con ese usuario) y podrás ejecutar comandos de docker sin sudo:

docker run hello-world

PD: Esto se corrigió en Ubuntu 21.10 y solo es necesario para versiones de Ubuntu anteriores a esa.

5voto

ostrokach Puntos 166

Los contenedores de Docker deben ser ejecutados por un superusuario. Puedes añadirte al grupo docker (por ejemplo, ejecutando sudo usermod -aG docker $USER), pero esto hace que sea fácil para cualquier persona con acceso a la cuenta $USER obtener acceso de root a la máquina (por ejemplo, montando un volumen root en un contenedor privilegiado).

Una forma más consciente de la seguridad de ejecutar contenedores de Docker como un usuario no root sería utilizar Podman. Según su página web:

Podman es un motor de contenedores sin daemon para desarrollar, administrar y ejecutar contenedores OCI en tu sistema Linux. Los contenedores pueden ser ejecutados como root o en modo sin root. Simplemente: alias docker=podman.

Otra alternativa es Singularity, que se despliega más comúnmente en entornos de HPC.

0 votos

Por favor provea información sobre por qué los contenedores de Docker deben ser ejecutados como un usuario root.

1 votos

@GaTechThomas Ver docs.docker.com/engine/install/linux-postinstall/…. "El proceso de Docker se vincula a un socket de Unix en lugar de un puerto TCP. Por defecto, ese socket de Unix es propiedad del usuario root y otros usuarios solo pueden acceder a él usando sudo. El proceso de Docker siempre se ejecuta como usuario root." Mi conocimiento no va más allá de esto.

1 votos

Muy útil, gracias.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X