513 Stimmen

Können Sie GUI-Anwendungen in einem Linux-Docker-Container ausführen?

Wie können Sie GUI-Anwendungen in einem Linux Docker-Container ausführen?

Gibt es Abbilder, die vncserver oder ähnliches einrichten, so dass Sie - zum Beispiel - eine zusätzliche Sicherheitsbarriere um beispielsweise Firefox hinzufügen können?

3voto

TingQian LI Punkte 620

Noch eine Antwort, falls Sie das Bild bereits erstellt haben:

  1. Docker ohne sudo aufrufen (Wie man Docker repariert: Berechtigungsverweigerungsproblem)

  2. Den gleichen BENUTZER & das gleiche Home-Verzeichnis & Passwort zwischen Host und Container teilen (Tipps: Verwenden Sie die Benutzer-ID anstelle des Benutzernamens)

  3. Das Entwicklungsverzeichnis für treiberabhängige Bibliotheken sollte gut funktionieren

  4. und X11-Weiterleitung hinzufügen.

    docker run --name=CONTAINER_NAME --network=host --privileged \
      -v /dev:/dev \
      -v `echo ~`:/home/${USER} \
      -p 8080:80 \
      --user=`id -u ${USER}` \
      --env="DISPLAY" \
      --volume="/etc/group:/etc/group:ro" \
      --volume="/etc/passwd:/etc/passwd:ro" \
      --volume="/etc/shadow:/etc/shadow:ro" \
      --volume="/etc/sudoers.d:/etc/sudoers.d:ro" \
      --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
      -it REPO:TAG /bin/bash

Sie könnten fragen, wozu man Docker verwendet, wenn so viele Dinge gleich sind? Nun, ein Grund, den ich mir vorstellen kann, ist, das Paketabhängigkeitschaos zu überwinden (https://en.wikipedia.org/wiki/Dependency_hell).

Daher denke ich, dass diese Art der Verwendung eher für Entwickler geeignet ist.

2voto

fcwu/docker-ubuntu-vnc-desktop (Ubuntu 18.04, 20.04)

https://github.com/fcwu/docker-ubuntu-vnc-desktop bietet eine praktische Konfiguration. Diese Konfiguration ist nicht minimiert. Es wäre gut, sie zu minimieren. Aber ich habe einfach keine Zeit, und diese funktioniert jedes Mal, wenn ich sie ausprobiere, also neige ich dazu, sie einfach zu verwenden. Auf der positiven Seite, da sie nicht minimiert ist, neigt sie dazu, komplexere Programme zu testen, um sicherzustellen, dass sie tatsächlich durch die unendlich vielen Fallstricke von Docker funktionieren. Außerdem würden Setups bei jedem Gast-/Host-Update zusammenbrechen, und eine Minimierung würde wahrscheinlich nur für eine begrenzte Zeit funktionieren, bis Sie dieses Projekt erneut minimieren müssten.

Um es zu starten, führen Sie einfach aus:

sudo docker run --name ubvnc -p 6080:80 -p 5900:5900 dorowu/ubuntu-desktop-lxde-vnc:focal

Dann auf dem Host entweder:

Bildbeschreibung eingeben

Zum Beenden beenden Sie einfach docker in der Konsole. Und um die Maschine neu zu starten:

sudo docker start ubvnc

und dann erneut mit VNC verbinden. Dann zum Beenden der Maschine:

sudo docker stop ubvnc

Sie müssen ein paar Sekunden warten, bis der VNC-Server auf dem Gast gestartet ist, bevor Sie eine Verbindung herstellen können.

Chromium innerhalb des Gasts startet nicht über das Menü. Wenn Sie versuchen, es über die Befehlszeile zu starten, erklärt es warum:

Als Root ohne --no-sandbox ausführen wird nicht unterstützt. Siehe https://crbug.com/638180.

Führen Sie es daher einfach von der Befehlszeile aus mit:

chromium-browser --no-sandbox

Firefox kümmert sich jedoch nicht darum.

TODO: kein Audio. --device /dev/snd hat nicht geholfen:

EDIT: sie haben einen Abschnitt hinzugefügt: https://github.com/fcwu/docker-ubuntu-vnc-desktop/tree/e4922ce92f945fc482994b7a0fd95ca5de7295b3#sound-preview-version-and-linux-only

Siehe auch:

Getestet auf:

  • Ubuntu 19.04 Host, fcwu/docker-ubuntu-vnc-desktop, Abbild-ID: 70516b87e92d.
  • Ubuntu 21.10 Host, dorowu/ubuntu-desktop-lxde-vnc:focal (Ubuntu 20.04)

1voto

dabizharoman Punkte 43

Docker mit BRIDGE-Netzwerk. für Ubuntu 16.04 mit Display-Manager lightdm:

cd /etc/lightdm/lightdm.conf.d
sudo nano user.conf

[Seat:*]
xserver-allow-tcp=true
xserver-command=X -listen tcp

Sie können strengere Berechtigungen verwenden

xhost +

docker run --volume="$HOME/.Xauthority:/root/.Xauthority:rw" --env="DISPLAY=$HOST_IP_IN_BRIDGE_NETWORK:0" --net=bridge $container_name

0voto

bedrin Punkte 4303

Es gibt viele gute Antworten hier, wie man eine GUI-App in einem Docker-Container mit dem auf dem Host-Rechner laufenden X-Server verbindet, oder wie man einen virtuellen X-Server ausführt und sich über VNC mit dem Container verbindet, um darauf zuzugreifen.

Es gibt jedoch eine weitere Lösung (die ziemlich nützlich ist für beispielsweise Kiosks oder Heimkinos) - Sie können einen X-Server innerhalb des Docker-Containers ausführen und das Videoausgang zum Monitor anschließen, der an Ihren Host-Rechner angeschlossen ist.

Zuerst erstellen wir ein Docker-Volume, um den X11-Socket zu speichern:

docker volume create --name xsocket

Jetzt können wir ein Image mit dem X-Server erstellen:

FROM ubuntu

RUN apt-get update && \
    DEBIAN_FRONTEND='noninteractive' apt-get install -y xorg

CMD /usr/bin/X :0 -nolisten tcp vt1

Lassen Sie uns das bauen, starten und den X11-Socket im xsocket Docker-Volume speichern:

docker build . -t docker-x-server:latest
docker run --privileged -v xsocket:/tmp/.X11-unix -d docker-x-server:latest

Jetzt können wir eine GUI-Anwendung in einem anderen Docker-Container ausführen (juchu!) und sie auf unseren X-Server über das xsocket-Volume verweisen:

docker run --rm -it -e DISPLAY=:0 -v xsocket:/tmp/.X11-unix:ro stefanscherer/xeyes

Wenn Sie Eingaben benötigen (wie Tastatur), installieren Sie das Paket xserver-xorg-input-evdev und fügen Sie -v /run/udev/data:/run/udev/data hinzu, da standardmäßig kein udev in Containern vorhanden ist.

Sie können sogar die --privileged-Flagge entfernen, indem Sie die SYS_TTY_CONFIG-Berechtigung gewähren und einige Geräte in den Container binden:

docker run --name docker-x-server --device=/dev/input --device=/dev/console --device=/dev/dri --device=/dev/fb0 --device=/dev/tty --device=/dev/tty1 --device=/dev/vga_arbiter --device=/dev/snd  --device=/dev/psaux --cap-add=SYS_TTY_CONFIG  -v xsocket:/tmp/.X11-unix  -d  docker-x-server:latest

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X