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?
Die Lösung auf http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/ scheint tatsächlich ein einfacher Weg zu sein, um GUI-Anwendungen von innerhalb der Container zu starten (Ich habe es mit Firefox über Ubuntu 14.04 ausprobiert), aber ich habe festgestellt, dass eine kleine zusätzliche Änderung an der Lösung des Autors erforderlich ist.
Speziell für das Ausführen des Containers hat der Autor erwähnt:
docker run -ti --rm \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
firefox
Ich habe jedoch festgestellt (basierend auf einem bestimmten Kommentar auf derselben Seite), dass zwei zusätzliche Optionen
-v $HOME/.Xauthority:$HOME/.Xauthority
und
-net=host
angegeben werden müssen, während der Container für Firefox ordnungsgemäß ausgeführt wird:
docker run -ti --rm \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v $HOME/.Xauthority:$HOME/.Xauthority \
-net=host \
firefox
Ich habe ein Docker-Image mit den Informationen auf dieser Seite und diesen zusätzlichen Erkenntnissen erstellt: https://hub.docker.com/r/amanral/ubuntu-firefox/
Die anderen Lösungen sollten funktionieren, aber hier ist eine Lösung für docker-compose
.
Um diesen Fehler zu beheben, müssen Sie $DISPLAY und .X11-unix an Docker übergeben sowie dem Benutzer, der Docker gestartet hat, Zugriff auf xhost gewähren.
Innerhalb der docker-compose.yml
Datei:
version: '2'
services:
node:
build: .
container_name: node
environment:
- DISPLAY
volumes:
- /tmp/.X11-unix:/tmp/.X11-unix
Im Terminal oder Skript:
xhost +si:localuser:$USER
xhost +local:docker
export DISPLAY=$DISPLAY
docker-compose up
Wenn Sie eine GUI-Anwendung headless ausführen möchten, lesen Sie hier. Was Sie tun müssen, ist einen virtuellen Monitor mit xvfb
oder einer ähnlichen Software zu erstellen. Dies ist sehr hilfreich, wenn Sie beispielsweise Selenium-Tests mit Browsern ausführen möchten.
Etwas, das nirgendwo erwähnt wird, ist, dass einige Software tatsächlich selbst Sandboxing mit Linux-Containern verwenden. Zum Beispiel wird Chrome niemals normal ausgeführt, wenn Sie den entsprechenden Flag --privileged
nicht beim Ausführen des Containers verwenden.
Ich komme zu spät zur Party, aber für Mac-Benutzer, die nicht den XQuartz-Pfad einschlagen möchten, hier ist ein funktionierendes Beispiel, das ein Fedora-Image mit einer Desktop-Umgebung (xfce) mit Xvfb
und VNC
erstellt. Es ist einfach und funktioniert:
Auf einem Mac können Sie einfach über die Anwendung Screen Sharing (Standard) darauf zugreifen, indem Sie sich mit localhost:5901
verbinden.
Dockerfile:
FROM fedora
USER root
# Setze das Root-Passwort, damit ich es für die Zukunft kenne
RUN echo "root:password123" | chpasswd
# Installiere Java, Open SSL, etc.
RUN dnf update -y --setopt=deltarpm=false \
&& dnf install -y --setopt=deltarpm=false \
openssl.x86_64 \
java-1.8.0-openjdk.x86_64 \
xorg-x11-server-Xvfb \
x11vnc \
firefox \
@xfce-desktop-environment \
&& dnf clean all
# Erstelle Benutzer für Entwickler (Passwort: password123, uid: 11111)
RUN useradd -u 11111 -g users -d /home/developer -s /bin/bash -p $(echo password123 | openssl passwd -1 -stdin) developer
# Kopiere das Startskript in das Home-Verzeichnis des Entwicklers
COPY start-vnc.sh /home/developer/start-vnc.sh
RUN chmod 700 /home/developer/start-vnc.sh
RUN chown developer.users /home/developer/start-vnc.sh
# VNC, SSH freigeben
EXPOSE 5901 22
# VNC-Passwort einrichten und DisplayEnvVar so einstellen, dass es auf Display1Screen0 zeigt
USER developer
ENV DISPLAY :1.0
RUN mkdir ~/.x11vnc
RUN x11vnc -storepasswd letmein ~/.x11vnc/passwd
WORKDIR /home/developer
CMD ["/home/developer/start-vnc.sh"]
start-vnc.sh
#!/bin/sh
Xvfb :1 -screen 0 1024x768x24 &
sleep 5
x11vnc -noxdamage -many -display :1 -rfbport 5901 -rfbauth ~/.x11vnc/passwd -bg
sleep 2
xfce4-session &
bash
# while true; do sleep 1000; done
Überprüfen Sie das verlinkte readme für Build- und Ausführungsbefehle, wenn Sie es möchten/benötigen.
Es gibt eine andere Lösung von lord.garbage, um GUI-Apps in einem Container auszuführen, ohne VNC, SSH und X11-Weiterleitung zu verwenden. Es wird auch hier erwähnt.
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.