Docker ohne root-Rechte

Als größter Vorteil von Podman im Vergleich zu Docker wird üblicherweise die Funktion bewertet, Container ohne root-Rechte auszuführen. Übersehen wird, dass Docker seit Version 19.03 ebenfalls für den rootless-Einsatz geeignet ist; das Feature galt in dieser Version aber als experimentell und war mit erheblichen Einschränkungen verbunden. Deutlich besser sieht das in der aktuellen Version 20.10 aus: der Betrieb von Docker-Containern ohne root-Rechte ist nun eine reguläre Funktion. Bemerkenswert ist, dass die Installation von Docker innerhalb eines Benutzeraccounts erfolgt und ebenfalls ohne root-Rechte gelingt!

Installation

Für meine Tests habe ich Oracle Linux 8 verwendet. Die folgende Installationsanleitung sollte unverändert auch unter RHEL 8, unter anderen RHEL-Klones sowie unter anderen Distributionen funktionieren. (Die offizielle rootless-Docker-Anleitung listet einige distributionsspezifische Voraussetzungen auf und empfiehlt Ubuntu als Basisdistribution.)

Mit dem Script rootless wird Docker lokal in einem Benutzeraccount installiert. Eine systemweite Docker-Installation ist nicht erforderlich! Das folgende Kommando ist in einem normalen Benutzeraccount ohne root-Rechte und ohne sudo auszuführen!

curl -fsSL https://get.docker.com/rootless | sh

  # Installing stable version 20.10.1
  ...
  PATH=/home/kofler/bin:/home/kofler/.local/bin:/home/kofler/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
  /home/kofler/bin/dockerd-rootless-setuptool.sh install
  Creating /home/kofler/.config/systemd/user/docker.service
  starting systemd service docker.service

  + systemctl --user start docker.service
  + sleep 3
  + systemctl --user --no-pager --full status docker.service
    docker.service - Docker Application Container Engine (Rootless)
    ...
  + DOCKER_HOST=unix:///run/user/1000/docker.sock
  + /home/kofler/bin/docker version
    Client: Docker Engine - Community
      Version:           20.10.1
    Server: Docker Engine - Community
       Engine:
         Version:          20.10.1
         ...
       containerd:
         Version:          v1.4.3
         ...
  + systemctl --user enable docker.service

  Installed docker.service successfully.
  To control docker.service, run: `systemctl --user (start|stop|restart) docker.service`
  To run docker.service on system startup, run: `sudo loginctl enable-linger kofler`

  Make sure the following environment variables are set (or add them to ~/.bashrc):

  export PATH=/home/kofler/bin:$PATH
  export DOCKER_HOST=unix:///run/user/1000/docker.sock

Unter Oracle Linux ist PATH bereits korrekt voreingestellt. Die Definition der DOCKER_HOST-Variable ist aber vor dem ersten Start von docker erforderlich und muss für später auch in .bashrc eingetragen werden (oder in .zshrc, falls Sie die ZSH verwenden).

export DOCKER_HOST=unix:///run/user/1000/docker.sock
echo "export DOCKER_HOST=unix:///run/user/1000/docker.sock" >> .bashrc

Ein kurzer Test beweist, dass alles funktioniert:

docker run hello-world
  Unable to find image 'hello-world:latest' locally
  latest: Pulling from library/hello-world

  Hello from Docker!
  This message shows that your installation appears to be working correctly.
  ...

Die von Docker angelegten Images, Container usw. landen im Verzeichnis .local/share/docker.

Hinweis: Um es nochmals klarzustellen: Zur Verwendung von Docker im rootless-Modus ist keine Docker-Installation auf Systemebene erforderlich. Prinzipiell macht es aber nichts, wenn eine derartige Installation bereits vorliegt — dann gibt es eben zwei Docker-Installationen, eine lokale für den rootless-Modus und eine systemweite für die Anwendung von Docker durch andere Benutzer bzw. root.

docker-compose

Um auch docker-compose lokal zu installieren, führen Sie die folgenden Kommando aus, wobei Sie 1.27.4 durch die gerade aktuelle Version ersetzen (siehe hier):

cd
curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" \
  -o bin/docker-compose
chmod +x bin/docker-compose

Fazit

Bei meinen Tests haben docker und docker-compose überraschend problemlos rootless funktioniert. Unter anderem habe ich mit docker-compose mein aus LaTeX und Pandoc bestehendes Satzsystem getestet. Es besteht aus drei Container, die parallel ausgeführt werden und sich darum kümmern, meine Markdown-Texte und PNG-Bilder in eine (fast) druckfertige PDF-Datei umzuwandeln.

Beachten Sie aber, dass es nach wie vor Einschränkungen gibt. Diese kommen insbesondere dann zum Tragen, wenn Docker Änderungen an der Netzwerkkonfiguration durchführen möchte, die root-Rechte erfordern.

Quellen

5 Gedanken zu „Docker ohne root-Rechte“

    1. Ich arbeite auf vielen Distributionen und fallweise auch unter macOS und Windows. Docker steht überall zur Verfügung. Deswegen ziehe ich Docker vor. Aber wer nur unter Fedora oder RHEL+Klone arbeitet, für den ist Podman vermutlich der einfachere Weg …

        1. In der Tat, die Podman-Unterstützung wird offenbar immer besser. Wobei Podman unter Windows noch immer wenig elegant ist (letztlich muss ich in einer VM oder mittels WSL zuerst eine Linux-Distribution installieren, Podman läuft dort).

  1. Docker ist schon interessant. Würde es gerne auf einem dedizierten Server, welchen ich mieten würde, einsetzen. Allerdings hadere ich – trotz rootless – mit der Sicherheit, da ich nicht weiß wie ich meine eigenen Images dann darauf abstimme und erstelle.

    Dahin gehend würde ich mich über eine ausführliche Anleitung freuen.

    Die öffentliche Docker-Doku hilft mir da nicht wirklich!
    Auch YouTube ist hier nicht „klar“ genug.

Kommentare sind geschlossen.