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?

5voto

allenyllee Punkte 739

Basierend auf der Antwort von Jürgen Weigert habe ich einige Verbesserungen:

docker build -t xeyes - << __EOF__
FROM debian
RUN apt-get update
RUN apt-get install -qqy x11-apps
ENV DISPLAY :0
CMD xeyes
__EOF__
XSOCK=/tmp/.X11-unix
XAUTH_DIR=/tmp/.docker.xauth
XAUTH=$XAUTH_DIR/.xauth
mkdir -p $XAUTH_DIR && touch $XAUTH
xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -
docker run -ti -v $XSOCK:$XSOCK -v $XAUTH_DIR:$XAUTH_DIR -e XAUTHORITY=$XAUTH xeyes

Der einzige Unterschied besteht darin, dass ein Verzeichnis $XAUTH_DIR erstellt wird, in dem sich die Datei $XAUTH befindet, und stattdessen das Verzeichnis $XAUTH_DIR anstelle der Datei $XAUTH in den Docker-Container eingehängt wird.

Der Vorteil dieser Methode besteht darin, dass Sie einen Befehl in /etc/rc.local schreiben können, der ein leeres Verzeichnis mit dem Namen $XAUTH_DIR in /tmp erstellt und seinen Modus auf 777 ändert.

tr '\n' '\000' < /etc/rc.local | sudo tee /etc/rc.local >/dev/null
sudo sed -i 's|\x00XAUTH_DIR=.*\x00\x00|\x00|' /etc/rc.local >/dev/null
tr '\000' '\n' < /etc/rc.local | sudo tee /etc/rc.local >/dev/null
sudo sed -i 's|^exit 0.*$|XAUTH_DIR=/tmp/.docker.xauth; rm -rf $XAUTH_DIR; install -m 777 -d $XAUTH_DIR\n\nexit 0|' /etc/rc.local

Beim Neustart des Systems, vor der Benutzeranmeldung, wird Docker automatisch das Verzeichnis $XAUTH_DIR einhängen, wenn die Wiederherstellungspolitik des Containers "immer" ist. Nach der Benutzeranmeldung können Sie einen Befehl in ~/.profile schreiben, um die Datei $XAUTH zu erstellen, dann wird der Container automatisch diese $XAUTH-Datei verwenden.

tr '\n' '\000' < ~/.profile | sudo tee ~/.profile >/dev/null
sed -i 's|\x00XAUTH_DIR=.*-\x00|\x00|' ~/.profile
tr '\000' '\n' < ~/.profile | sudo tee ~/.profile >/dev/null
echo "XAUTH_DIR=/tmp/.docker.xauth; XAUTH=\$XAUTH_DIR/.xauth; touch \$XAUTH; xauth nlist \$DISPLAY | sed -e 's/^..../ffff/' | xauth -f \$XAUTH nmerge -" >> ~/.profile

Letztendlich wird der Container jedes Mal automatisch die Xauthority-Datei erhalten, wenn das System neu gestartet und der Benutzer angemeldet wird.

5voto

tsveti_iko Punkte 4970

Ich konnte einen Video-Stream von einer USB-Kamera unter Verwendung von opencv in docker ausführen, indem ich die folgenden Schritte befolgte:

  1. Erlauben Sie docker den Zugriff auf den X-Server

    xhost +local:docker
  2. Erstellen Sie den X11 Unix-Socket und die X-Authentifizierungsdatei

    XSOCK=/tmp/.X11-unix
    XAUTH=/tmp/.docker.xauth
  3. Fügen Sie ordnungsgemäße Berechtigungen hinzu

    xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -
  4. Setzen Sie die Qt-Rendering-Geschwindigkeit auf "native", damit es nicht den X11-Rendering-Mechanismus umgeht

    export QT_GRAPHICSSYSTEM=native
  5. Sagen Sie Qt, dass es nicht MIT-SHM (Shared Memory) verwenden soll - so sollte es auch sicherer sein in Bezug auf die Sicherheit

    export QT_X11_NO_MITSHM=1
  6. Aktualisieren Sie den Docker-Befehl

    docker run -it \
               -e DISPLAY=$DISPLAY \
               -e XAUTHORITY=$XAUTH \
               -v $XSOCK:$XSOCK \
               -v $XAUTH:$XAUTH \
               --runtime=nvidia \
               --device=/dev/video0:/dev/video0 \
               nvcr.io/nvidia/pytorch:19.10-py3

Hinweis: Wenn Sie das Projekt beenden, setzen Sie die Zugriffskontrollen auf ihren Standardwert zurück - xhost -local:docker

Weitere Details: Verwendung von GUIs mit Docker

Quelle: Echtzeit- und Videoverarbeitung-Objekterkennung unter Verwendung von Tensorflow, OpenCV und Docker

4voto

wedesoft Punkte 2463

Sie können dem Docker-Benutzer (hier: root) Zugriff auf das X11-Display gewähren:

XSOCK=/tmp/.X11-unix
xhost +SI:localuser:root 
docker run -t -i --rm -v $XSOCK:$XSOCK:ro -e DISPLAY=unix$(DISPLAY) image 
xhost -SI:localuser:root

4voto

Matt McCormick Punkte 314

Für das OpenGL-Rendering mit dem Nvidia-Treiber verwenden Sie das folgende Bild:

https://github.com/thewtex/docker-opengl-nvidia

Für andere OpenGL-Implementierungen stellen Sie sicher, dass das Bild die gleiche Implementierung wie der Host hat.

3voto

nommer Punkte 2430

OSX (10.13.6, high sierra)

Ähnlich wie die Antwort von @Nick, aber seine Lösung hat bei mir nicht funktioniert.

Installieren Sie zuerst socat mit brew install socat und installieren Sie XQuartz (https://www.xquartz.org/)

Befolgen Sie dann diese Schritte hier (http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/) im Kommentarbereich:

1. In einem Mac-Terminal habe ich gestartet:

socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"

2. Und in einem anderen Mac-Terminal habe ich ausgeführt:

docker run -ti --rm \
-e DISPLAY=$(ipconfig getifaddr en0):0 \
-v /tmp/.X11-unix:/tmp/.X11-unix \
firefox

I konnte auch CLion aus meinem Debian-Docker-Container starten.

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