FAQ: Fragen und Antworten zum Containerwerkzeug Distrobox
Mit dem Linux-Werkzeug Distrobox starten Sie komplette Distributionen in Containern. Dazu reichen ein paar Befehle, aber im Alltag können Fragen auftauchen.
(Bild: Bild erstellt mit KI in Bing Image Creator durch heise online / dmk)
- Tim SchĂĽrmann
Mit dem Linux-Werkzeug Distrobox machen Sie aus Ihrem System ein Linux-Multitalent, führen verschiedene Distributionen in Containern aus und sind nicht mehr auf den hauseigenen Paketmanager festgelegt. Das praktische Tool haben wir bereits vorgestellt. Um loszulegen reichen bereits wenige Befehle, durch die Isolation der Container können im Arbeitsalltag aber Fragezeichen auftauchen. Wir geben Antworten auf die häufigsten Fragen.
Container klonen
Ich habe in einem Ubuntu-Container mehrere Pakete installiert. Wie kann ich von ihm ein Duplikat fĂĽr Tests erstellen?
Möchten Sie den Container "ubuntu-ct" klonen, stoppen Sie ihn zunächst via distrobox stop ubuntu-ct. Der folgende Befehl erstellt dann einen Klon unter dem Namen "ubuntu-klon":
distrobox create --clone ubuntu-ct -n ubuntu-klon
Weitere Image-Quellen anzapfen
Die verfĂĽgbaren Images reichen mir nicht aus. Kann ich auch Images aus anderen Quellen verwenden?
Ja, Distrobox kann beliebige Quellen anzapfen, solange diese sogenannten Registries den Standards der Open Container Initiative (OCI) folgen. Dazu gehören unter anderem der Docker Hub und Quay.io von Red Hat. Sie müssen dann lediglich dem Create-Befehl die URL zum passenden Image übergeben. Das folgende Kommando holt exemplarisch Arch Linux aus dem Docker Hub:
distrobox create -i docker.io/library/archlinux -n dockerarch
Behalten Sie dabei im Hinterkopf, dass die Images teilweise nicht für den Betrieb unter Distrobox gedacht sind. Das trifft häufig auf Container zu, die ausschließlich eine Datenbank, einen Webserver oder einen anderen Server-Dienst enthalten.
Videos by heise
Fremde Architekturen
Kann ich auf meinem Intel-System auch eine Distribution fĂĽr den Raspberry Pi starten?
Ja, das funktioniert, wenn auch nur mit angezogener Handbremse: Distributionen für eine andere Prozessorarchitektur startet Distrobox über den Emulator Qemu. Da der wiederum einen kompletten Prozessor in Software nachbildet, läuft der Container langsamer.
Im Hintergrund verrät Distrobox dem Linux-Kernel über die sogenannte Binfmt-Schnittstelle, wie er mit Qemu die Programme im Container ausführen muss. Auf dem Host-System benötigen Sie daher neben den passenden Qemu-Emulatoren auch noch eventuell vorausgesetzte Binfmt-Pakete. Welche Pakete Sie im Einzelnen installieren müssen, hängt von Ihrer Distribution ab: Während unter openSUSE qemu und qemu-linux-user ausreichen, müssen Sie unter Debian, Ubuntu und deren Derivaten qemu-system, qemu-user-static und binfmt-support installieren.
In jedem Fall können Sie anschließend mit Distrobox einen Container erzeugen, der nicht für Ihren Prozessor gedacht ist – wie etwa Fedora 41 für ARM64-Rechner:
distrobox create -i fedora:41-aarch64 -n fedora-arm64
Die dabei angezeigte Warnung zur falschen Image-Plattform dĂĽrfen Sie ignorieren. Wenn kein Image fĂĽr ARM64 bereitsteht und Sie Docker oder Podman verwenden, reichen Sie mit dem Parameter -a die Option "--platform=..." an die Container-Manager durch:
distrobox create -a "--platform=linux/arm64" -i debian -n debian-arm64
Container-Dienst vorgeben
Wie zwinge ich Distrobox dazu, im Hintergrund Docker statt Podman zu nutzen?
Sind mehrere Container-Manager verfĂĽgbar, greift Distrobox bevorzugt zu Podman. Ăśber die Umgebungsvariable DBX_CONTAINER_MANAGER schreiben Sie explizit einen der drei unterstĂĽtzten Container-Dienste vor. Im Folgenden wĂĽrde Distrobox die Container mit docker hochfahren; Alternativen sind podman und lilipod:
export DBX_CONTAINER_MANAGER="docker"
Container abschotten
Die Anwendungen in meinem Container sehen sämtliche laufenden Prozesse des Host-Systems und könnten sie beispielsweise böswillig beenden. Wie verhindere ich das?
Beim Erstellen eines neuen Containers können Sie den Zugriff auf die Prozesse des Host-Systems sowie einige weitere Ressourcen gezielt unterbinden. Dazu müssen Sie distrobox create den oder die passenden Parameter übergeben (siehe Tabelle "Parameter für Zugriffsrechte"). Beispielsweise versteckt der folgende Befehl alle Prozesse vor den Programmen im Container ubuntu-noproc:
distrobox create --unshare-process -i ubuntu -n ubuntu-noproc
Die einmal gewählten Einschränkungen kann Distrobox nachträglich nicht mehr ändern. Wenn Sie den Container klonen, müssen Sie die Parameter zudem erneut angeben, andernfalls ignoriert das Duplikat die Einschränkungen. Aber Obacht: Keineswegs stecken die Restriktionen einen Container in ein Hochsicherheitsgefängnis. So kann der Container etwa weiterhin auf Ihr Homeverzeichnis zugreifen.
| Distrobox-Parameter für Zugriffsbeschränkungen | |
| Parameter | Bedeutung |
--unshare-devsys
|
Die Gerätedateien und das Sysfs des Host-Systems landen nicht im Container. |
--unshare-groups
|
Distrobox reicht nicht die zusätzlichen Gruppen des Nutzers in den Container durch. |
--unshare-ipc
|
Das Host-System teilt nicht die Inter-Prozess-Kommunikation (IPC) mit dem Container. |
--unshare-netns
|
Der Container erhält eine eigene Netzwerkumgebung und nutzt insbesondere nicht die IP-Adresse des Host-Systems. |
--unshare-process
|
Der Container sieht nicht mehr die Prozesse des Host-Systems. |
--unshare-all
|
Distrobox aktiviert alle obigen --unshare-Parameter.
|
Hostnamen ändern
Alle meine Container nutzen den gleichen Hostnamen. Wie kann ich jedem einen individuellen verpassen?
Standardmäßig verwendet jeder Container den Rechnernamen des Host-Systems. Distrobox reicht zudem die zugehörige Konfigurationsdatei /etc/hostname in den Container durch. Wenn Sie dem Container über den Parameter --unshare-netns eine eigene Netzwerkumgebung spendieren, baut Distrobox den Hostnamen aus dem Containernamen und dem Namen des Host-Systems zusammen, wie etwa ubuntu-ct.marvin.
Sie können jedem Container aber auch einen eigenen Hostnamen verpassen. Dazu übergeben Sie beim Erstellen den Parameter --hostname.
distrobox create --hostname "rupert" -i ubuntu -n ubuntu-rupert
Der neu erzeugte Container verwendet dann "rupert" als Hostname.
Ordner und Volumes einhängen
Ich habe Google Chrome unter /opt installiert. Wie kann ich im Container auf dieses Verzeichnis zugreifen?
Aus Sicherheitsgründen dürfen Container nur auf ausgewählte Verzeichnisse des Host-Systems zugreifen. Beliebige weitere Verzeichnisse können Sie beim Anlegen eines Containers über den Parameter --volume in den Container einhängen:
distrobox create --volume /opt/google/chrome:/opt/chrome:rw -i ubuntu -n ubuntu-vol
Hier blendet Distrobox das Verzeichnis /opt/google/chrome im Container unter /opt/chrome ein, wobei das Gastsystem im Container lesend und schreibend (rw) auf die Verzeichnisinhalte zugreifen darf. Die Schreibweise mit den Doppelpunkten folgt den Vorgaben von Docker: Hinter --volume steht der Pfad auf dem Host-System, nach dem Doppelpunkt der Ordner im Container und optional hinter einem weiteren Doppelpunkt die Zugriffsrechte. Anstelle des Pfads auf dem Host-System können Sie auch ein Docker-Volume angeben. Möchten Sie mehrere Verzeichnisse einhängen, braucht jedes seinen --volume-Parameter.
Mehrere Container gleichzeitig erstellen
Ich wĂĽrde gerne mehrere Container mit unterschiedlichen Programmierumgebungen einrichten. Muss ich dazu jeden Container einzeln einrichten und hochfahren?
Nein, das geht einfacher: Zunächst beschreiben Sie in einem sogenannten Manifest (distrobox.ini) die Ausstattung der Container, die dann der Befehl distrobox assemble allesamt in Betrieb nimmt und bei Bedarf auch wieder geschlossen herunterfährt. Den Aufbau der Textdatei beschreibt die Distrobox-Dokumentation.
Anhand von distrobox.ini erstellt distrobox assemble create die darin beschriebenen Container. Ein distrobox assemble rm zerstört sie später allesamt wieder.
Bin ich schon drin?
Wie erkenne ich, ob ich mich gerade in einem Container befinde?
Abhängig vom Host-System ändert sich in einem Container der Kommandozeilenprompt. Dieser beginnt dann mit dem Emoji einer kleinen Kiste, gefolgt vom Namen des Containers. Wenn das nicht passiert oder Sie ganz sichergehen möchten, hilft der Shell-Befehl echo $CONTAINER_ID weiter. Innerhalb eines Containers liefert er dessen Namen, andernfalls erhalten Sie eine leere Zeile. Mit der Umgebungsvariable $CONTAINER_ID können auch Shell-Skripte recht elegant ermitteln, ob und wenn ja, in welchem Container sie gerade laufen. Ergänzend existiert noch die Variable $container, in der Distrobox den Namen des Container-Dienstes wie podman ablegt. Auch diese Variable gibt es nur innerhalb des Containers.
Portweiterleitung einrichten
In meinem Container habe ich einen Webserver gestartet. Wie erreiche ich ihn aus dem Netzwerk? Muss ich dazu eine Portweiterleitung einrichten?
Im Container laufende Dienste verhalten sich automatisch so, als hätten Sie sie direkt auf dem Host-System gestartet. Unter dessen IP-Adresse erreichen folglich alle Netzwerk-Clients den Webserver, sofern eine Firewall das nicht unterbindet. Da der Container das Netzwerk des Host-Systems mitnutzt, müssen Sie keine Ports in den Container durchreichen oder weiterleiten.
Anders sieht die Sache aus, wenn der Container über den Parameter --unshare-netns in eine eigene Netzwerkumgebung eingesperrt ist. Dann müssen Sie eine Portweiterleitung einrichten. Distrobox selbst bietet dafür keine eigene Option, reicht aber beim Erstellen des Containers über den Schalter -a den benötigten Parameter an die im Hintergrund eingespannten Container-Dienste weiter:
distrobox create --unshare-netns -a "-p 8080:8000" -i ubuntu -n ubuntu-nonet
Mit "-p 8080:8000" landen alle Anfragen, die an Port 8080 des Host-Systems aufschlagen, direkt im Container an Port 8000. Wenn der Host die IP-Adresse 192.168.1.101 besitzt, lauscht der Webserver anschließend unter http://192.168.1.101:8080. Weitere Ports ergänzen Sie nach dem gleichen Schema in den Anführungszeichen: So richtet -a "-p 8080:8000 -p 443:9000" zusätzlich eine Weiterleitung für alle Anfragen an Port 443 an Port 9000 im Container ein.
Distributionen aktualisieren
Wie halte ich die Distributionen in den Containern automatisch auf dem aktuellen Stand?
Sämtliche Container auf einen Schlag aktualisiert der Befehl distrobox upgrade --all. Den müssen Sie lediglich regelmäßig anwerfen, etwa per Cron oder einem Systemd-Timer. Für Letzteres brauchen Sie passende Units. Beispiele für zwei einfache Systemd-Units stellen wir zum Download bereit. Der Timer distrobox-upgrade.timer startet dann mithilfe der Service-Unit distrobox-upgrade.service ein Upgrade eine Stunde nach dem Bootvorgang des Host-Systems sowie anschließend einmal pro Tag. Kopieren Sie beide Units nach ~/.config/systemd/user/ und schalten Sie sie mit folgendem Befehl scharf:
systemctl --user enable --now distrobox-upgrade.timer
Container mit Root-Rechten
Ich möchte in meinem Container per tcpdump den Netzwerkverkehr aufzeichnen. Selbst wenn ich das Werkzeug mit sudo aufrufe, erhalte ich nur eine Fehlermeldung. Angeblich fehlen mir die notwendigen Rechte. Wie kann das sein?
Sofern das von uns empfohlene Podman als Container-Manager dient, startet Distrobox den Container unter Ihrem Benutzerkonto. Innerhalb des Containers können Sie zwar Programme mit sudo und somit Systemverwalterrechten aufrufen, die Anwendung läuft aber weiterhin unter Ihrem Benutzerkonto – und dem ist es üblicherweise verboten, an der Netzwerkschnittstelle zu lauschen beziehungsweise die entsprechende Socket-Aktion auszuführen. Dieses Verhalten ist aus Sicherheitsgründen gewollt. Sollten Sie die in den Wind schlagen und unbedingt Programme mit umfassenden Rechten ausführen wollen, ergänzen Sie beim Erstellen und beim Entern des Containers den Parameter --root. Im Container mit sudo gestartete Programme laufen dann wie der Container mit Root-Rechten und dürfen unter anderem ungehemmt den Netzwerkverkehr mitschneiden, aber auch alles andere tun, was Root darf.
Backups erstellen
Ich habe mir in einem Container eine Entwicklungsumgebung eingerichtet, die ich jetzt gerne sichern und auf meinen Laptop ĂĽbertragen wĂĽrde. Geht das?
Distrobox selbst kann keine Backups anfertigen oder auf andere Systeme transferieren. Das gelingt nur mit den unter der Haube genutzten Container-Managern. Obacht: Das im folgende beschriebene Verfahren sichert nur den Container selbst. Alle anderen Daten, wie etwa die Dokumente und Konfigurationsdateien aus Ihrem Heimatverzeichnis, mĂĽssen Sie separat sichern.
Um den Container ubuntu-ct zu sichern, stoppen Sie ihn zunächst mit distrobox stop ubuntu-ct. Anschließend erzeugen Sie aus dem Container ein Image
podman container commit -p ubuntu-ct ubuntu-image
Läuft er unter Docker, ersetzen Sie podman durch docker. Der Befehl erstellt aus dem Container ein Image mit Namen ubuntu-image. Dann exportieren Sie das Image in eine Datei:
podman save -o ubuntu-image.tar ubuntu-image:latest
Der Befehl schreibt das Image dann in das Tar-Archiv ubuntu-image.tar.
Um den Container wieder herzustellen, importieren Sie es mit load als Image und erzeugen damit einen neuen Container:
podman load -i ubuntu-image.tar
distrobox create -i ubuntu-image:latest -n ubuntu-ct
Diese Befehlskombi taugt auch zum Erstellen von Container-Blaupausen, falls Sie mehrere gleichartige Dienste starten wollen.
(kasi)