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?
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?
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.
Ich konnte einen Video-Stream von einer USB-Kamera unter Verwendung von opencv
in docker
ausführen, indem ich die folgenden Schritte befolgte:
Erlauben Sie docker den Zugriff auf den X-Server
xhost +local:docker
Erstellen Sie den X11 Unix-Socket und die X-Authentifizierungsdatei
XSOCK=/tmp/.X11-unix
XAUTH=/tmp/.docker.xauth
Fügen Sie ordnungsgemäße Berechtigungen hinzu
xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -
Setzen Sie die Qt-Rendering-Geschwindigkeit auf "native", damit es nicht den X11-Rendering-Mechanismus umgeht
export QT_GRAPHICSSYSTEM=native
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
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
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.
Ä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 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.