Qué é o modo rootless de docker?

Pois o modo rootless permite executar docker sen permisos de administrador. Con isto redúcense as vulnerabilidades que poidamos ter por algún erro nun contenedor en tempo de execución. Reducindo unha posible escalada de privilexios.

Por qué?

Pois a seguridade é importante, polo que aos poucos é bo incrementala nos nosos equipos.

Cómo funciona?

Os contenedores en modo rootless executaranse dentro do namespace do usuario. Polo que se este usuario non é administrador, tanto o daemon como os contenedores correrán sen privilexios de root.

Prerrequisitos

Para poder facer esta instalación precisaremos:

  • Os comandos newuidmap e newgidmap, que veñen ao instalar uidmap.
  • /etc/subuid e /etc/subgid deben conter alomenos 65.536 UIDs e GIDs subordinados para o usuario. Por exemplo
    $id -u
    1001
    $whoami
    testuser
    $grep ^$(whoami): /etc/subuid
    testuser:231072:65536
    $grep ^$(whoami): /etc/subgid
    testuser:231072:65536
    

    Neste exemplo o primer díxito 231072 sería o UID e o GID principais do usuario e o segundo díxito 65536 sería o rango ou cantidade de subordinados asignados.

  • dbus-user-session no meu caso este paquete xa estaba instalado na distro.
  • fuse-overlayfs recomendado pero non obrigatorio.
  • slirp4netns cunha versión superior á v0.4.0

No caso de Debian temos que dar este paso, para outras distros pódese ver na documentación da web: Engadir esta liña kernel.unprivileged_userns_clone=1 en /etc/sysctl.conf (ou /etc/sysctl.d) e executar sudo sysctl --system.

Instalación

Se xa estivese instalado e o demo estivese en execución, teríamos que deshabilitalo. $ sudo systemctl disable --now docker.service docker.socket

Se non estivese instalado executamos sudo apt get install docker docker-compose

E instalamos o modo rootless, o script de instalación obtémolo e executámolo, sen sudo, con curl -fsSL https://get.docker.com/rootless | sh
Nota: se nos dá un erro porque xa está correndo e nos pide que forcemos a instalación, podemos volver a correr $ sudo systemctl disable --now docker.service docker.socket e pode que reiniciar o equipo.

Uso

Nota: No caso de que noso usuario non esté no grupo de docker, teremos que engadilo. Co seguinte comando usermod -aG docker user_name

Para executar o servizo farémolo con systemctl --user start docker Para executalo no inicio do sistema precisaremos executar systemctl --user enable docker e sudo loginctl enable-linger $(whoami)

Notas adicionais

Ao tentar levantar un contenedor na Raspbian con docker en modo rootless, lanzábame o seguinte erro, cousa que non me ocorreu en Debian:

$ docker-compose up
ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.

A solución a isto foi prober ao sistema, tal e como indica o erro, a variable de entorno DOCKER_HOST. Co seguinte comando export DOCKER_HOST=unix://$XDG_RUNTIME_DIR/docker.sock
Despois diso o contenedor levantou sen problemas.

Fontes