Kann man GUI-Anwendungen in Docker-container?
Wie kann man GUI-Anwendungen in einer Docker container?
Gibt es irgendwelche Bilder, die vncserver
oder etwas, so dass Sie - zum Beispiel - hinzufügen einer zusätzlichen speedbump sandbox um sagen Firefox?
- Diese Frage scheint betreffen nur die Linux (basierend auf dem Alter und den Inhalt der Antworten) und nicht Windows. Wenn dem so ist, können wir Bearbeiten Sie den Titel, dies zu klären? Dank
- Verwandte: Wie man Xvfb-Anzeige sichtbar?
- Check HPC-Visualisierung Behälter User Guide für einige Ideen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie einfach installieren Sie ein vncserver zusammen mit Firefox 🙂
Schob ich ein Bild, vnc/firefox, hier:
docker pull creack/firefox-vnc
Wurde das Bild gemacht mit diesem Dockerfile:
Dadurch wird ein Docker-container läuft VNC mit Passwort
1234
:Für Docker-version 18 oder höher:
Für Docker version 1.3 oder höher:
Für Docker vor version 1.3:
docker inspect <container id>
oder einfachdocker ps
, dann verbinden Sie Ihre host-ip mit dem port, den Sie gerade gefunden.docker ps | grep -Po ':\K[0-9]*'
-t
imdocker run
zu Holen Sie sich ein Passwort. Ich bin mir nicht sicher, warum ein Passwort ist auch erforderlich, in diesem. Trotzdem, aktualisieren Sie bitte die Anweisungen durch Bearbeiten der ursprünglichen Anweisungen, statt Sie "BEARBEITEN" Abschnitte..xinitrc
statt.bashrc
:RUN echo "exec firefox" > ~/.xinitrc && chmod +x ~/.xinitrc
.x11vnc -create ...
öffnet sich eine neue Anzeige auf und versucht zu laufen .xinitrcXauthority wird ein Problem mit neueren Systemen. Ich kann entweder verwerfen Schutz mit xhost + vor dem laufen meine docker-Container, oder ich kann Sie übergeben in eine gut vorbereitete Xauthority-Datei. Typische Xauthority-Dateien werden Hostnamen bestimmten. Mit docker, jeder container kann eine andere host-name (set mit docker run-h), aber auch Einstellung der hostname des Containers identisch mit dem host-system nicht helfen in meinem Fall. xeyes (ich mag dieses Beispiel) einfach ignorieren würde den magic cookie und geben keine Anmeldeinformationen an den server. Daher erhalten wir eine Fehlermeldung "No protocol specified Cannot open display'
Den Xauthority-Datei kann auf eine Weise geschrieben werden, so dass der hostname egal.
Wir müssen die Authentifizierung Familie 'FamilyWild'. Ich bin mir nicht sicher, ob xauth ist eine richtige Befehlszeile für dieses, so ist hier ein Beispiel, das verbindet xauth und sed zu tun. Wir müssen die ersten 16 bits der nlist Ausgabe. Der Wert von FamilyWild ist 65535 oder 0xffff.
-v $XSOCK:$XSOCK -v $XAUTH:$XAUTH
verkürzt werden kann, um-v $XSOCK -v $XAUTH
Error: Can't open display: :0
Andockfenster v1.8.2-7 auf Fedora 22.:0
mit$DISPLAY
. Das bedeutet, dassxauth nlist $DISPLAY | ...
unddocker run -ti -e DISPLAY=$DISPLAY ...
. In der Regel die X-ANZEIGE ist:0
, aber nicht immer (und vor allem nicht, wenn Sie eine Verbindung über einen ssh-X).--net=host
/tmp/.docker.xauth
- Datei mit600
Berechtigungen. Dies führt zu xauth innen docker-container nicht in der Lage, die Datei zu Lesen. Sie können überprüfen Sie durch ausführenxauth list
innerhalb des docker-container. Ich habechmod 755 $XAUTH
nach derxauth nlist :0 | ...
Befehl, diese zu lösen.-e DISPLAY=$DISPLAY
), ersetzen Sie die letzten vier Zeilen mit:xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f /tmp/.docker.xauth nmerge - && docker run -it -v /tmp/.X11-unix:/tmp/.X11-unix -v /tmp/.docker.xauth:/tmp/.docker.xauth -e XAUTHORITY=/tmp/.docker.xauth -e DISPLAY=$DISPLAY xeyes
chmod
vorxauth nlist ...
Ich fand gerade diesen blog-Eintrag und teilen möchten es hier mit dir, weil ich denke, es ist der beste Weg, es zu tun und es ist so einfach.
http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/
VORTEILE:
+ keine x-server Sachen in den docker-container
+ keine vnc-client/- server erforderlich
+ kein ssh mit x-forwarding
+ viel kleiner docker-Container
NACHTEILE:
- mit x auf dem host (nicht gemeint für secure-sandboxing)
in Falle wird der link fail-irgendwann habe ich die wichtigste Teil hier:
dockerfile:
bauen das Bild:
und den Befehl ausführen:
natürlich können Sie dies auch tun, in den run-Befehl mit
sh -c "echo script-here"
HINWEIS: für audio-werfen Sie einen Blick auf: https://stackoverflow.com/a/28985715/2835523
apt-get -y install sudo
zu erstellen/etc/sudoers.d
Ordner.Mit docker Datenmengen ist es sehr einfach zu setzen xorg ' s unix-domain-socket in den container.
Beispielsweise mit einem Dockerfile wie diese:
Können Sie das folgende tun:
Dies ist natürlich im wesentlichen das gleiche wie X-forwarding. Es gewährt dem container vollen Zugriff auf den xserver auf dem host, so ist es nur zu empfehlen, wenn Sie Vertrauen, was drin ist.
Hinweis:, Wenn Sie um die Sicherheit besorgt sind, eine bessere Lösung wäre, beschränken sich die app mit obligatorisch- oder role-based-access control. Andockfenster erreicht, ziemlich gut isoliert, sondern es war konzipiert mit einem anderen Zweck im Auge. Verwenden AppArmor, SELinux, oder GrSecurity, die entworfen wurden, um Ihre Anliegen.
xhost +
auf dem host.xhost +local
notwendig ist. Es wäre besser, um die~/.Xauthority
Datei in den container, jedoch, so kann es zu authentifizieren.Can't open display: :0
. Irgendwelche Ideen?xhost +si:localuser:$USER
zu erlauben nur dem Benutzer das starten der container.xhost +local:
. Ohne den Doppelpunkt, der Befehl ist fehlgeschlagen auf Ubuntu 16.04Können Sie auch subuser: https://github.com/timthelion/subuser
Diese ermöglicht das packen viele gui-Anwendungen in docker. Firefox und emacs wurden bisher getestet. Mit firefox webGL funktioniert nicht obwohl. Chrom geht gar nicht.
EDIT: Sound funktioniert!
EDIT2: In der Zeit, da ich zuerst gepostet, subuser Fortgeschritten ist stark. Ich habe jetzt eine website subuser.org, und ein neues security-Modell für die Verbindung zum X11 über XPRA-bridging.
OSX
Jürgen Weigert hat die beste Antwort, die für mich gearbeitet auf Ubuntu, aber auf OSX, docker läuft in der VirtualBox und damit die Lösung funktioniert nicht ohne etwas mehr Arbeit.
Habe ich es mit diesen zusätzlichen Zutaten:
Ich würde schätzen, user-Kommentare zu verbessern, dass diese Antwort für OSX, ich bin nicht sicher, ob socket-forwarding für X sicher ist, aber mein Verwendungszweck ist für die Ausführung von docker-container vor Ort nur.
Auch, das Skript ist ein bisschen fragil, dass es nicht einfach um die IP-Adresse der Maschine, da es auf unsere lokalen wireless -, so ist es immer einige zufällige IP.
Dem BASH-script, das ich verwenden, um das starten der container:
Ich bin in der Lage zu bekommen xeyes und matplotlib arbeiten mit diesem Ansatz.
Windows 7+
Es ist ein bisschen leichter auf Windows 7+ mit MobaXterm:
run_docker.bash
:error: XDG_RUNTIME_DIR not set in the environment.
undError: cannot open display: VAIO:0.0
. Hast du die Begegnung so etwas wie das?Hier ist eine einfache Lösung, die verhindert, dass die Installation
X
servervnc
server odersshd
- daemon auf dem container. Was gewinnt es an Einfachheit verliert es in der Sicherheit und isolation.Es wird davon ausgegangen, dass Sie eine Verbindung zur host-Maschine über
ssh
mitX11
weiterleiten.In der
sshd
Konfiguration der host -, fügen Sie die ZeileSo, dass die weitergeleiteten X-server-port auf dem host geöffnet wird, auf alle Schnittstellen (nicht nur
lo
) und insbesondere auf die Docker virtuelle Schnittstelledocker0
.Den container, wenn Sie ausgeführt wird, muss Zugriff auf die
.Xauthority
- Datei, so dass es zum server herstellen können. Um dies zu tun, definieren wir eine nur-lese-Band zeigt auf das home-Verzeichnis auf dem host (vielleicht nicht eine kluge Idee!) und auch dieXAUTHORITY
variable entsprechend.Ist nicht genug, müssen auch wir passieren die DISPLAY-variable von dem host, aber ersetzen Sie den hostname durch die ip -:
Können wir einen alias definieren:
Und testen, wie diese:
.Xauthority
Datei selbst:-v $HOME/.Xauthority:/root/.Xauthority -e XAUTHORITY=/root/.Xauthority
.X11UseLocalhost
Sie können auch die zusätzliche option--net=host
für diedocker run
Befehl (gefunden hier).Sharing-host-display :0, wie bereits in einigen anderen Antworten, hat zwei Nachteile:
xev
oderxinput
möglich ist, und die Fernsteuerung von host-Anwendungen mitxdotool
.--ipc=host
).Unten ein Beispiel-Skript zum ausführen eines docker-image in Xephyr, das behebt diese Probleme.
--cap-drop ALL --security-opt no-new-privileges
. Auch die container-Benutzer ist nicht root.Das Skript erwartet, dass einige Argumente, zunächst eine host-window-manager für die Ausführung im Xephyr, der zweite ein docker-image, Optional Dritte
ein Bild-Befehl ausgeführt werden.
Zum ausführen einer desktop-Umgebung im Andockfenster ":" verwenden statt einer host-Fenster-manager.
Schließen Xephyr-Fenster beendet docker-container-Anwendungen. Die Kündigung der dockered Anwendungen schließt Xephyr Fenster.
Beispiele:
xephyrdocker "openbox --sm-disable" x11docker/lxde pcmanfm
xephyrdocker : x11docker/lxde
xephyrdocker xfwm4 --device /dev/snd jess/nes /games/zelda.rom
xephyrdocker Skript:
Diesem script bleibt bei x11docker wiki.
Eine erweiterte Skript ist x11docker, dass unterstützt auch features wie GPU-Beschleunigung, webcam und Drucker-sharing-und so weiter.
Dies ist keine leichte, aber eine schöne Lösung gibt, die den docker-feature-Parität mit voller desktop-Virtualisierung. Sowohl Xfce4 oder IceWM für Ubuntu und CentOS arbeiten, und die
noVNC
option sorgt für einen einfachen Zugriff über einen browser.https://github.com/ConSol/docker-headless-vnc-container
Läuft es
noVNC
sowietigerVNC
's vncserver. Dann ruft erstartx
für beliebigen Fenster-Manager. Darüber hinauslibnss_wrapper.so
wird verwendet, um emulieren Passwort-management für die Benutzer.xpra
im Andockfenster, das root-weniger X.xpra
am besten geeignet und IMO ist effizienter, als VNC.--device /dev/...
auf die Andockfenster und die set erforderlich--cap
Privilegien. Dass Niederlagen der Zweck der Eindämmung, aber Sie können passieren-Geräte. Mit einigen Optimierungen sollte es möglich sein, glaube ich, zu laufen GNOME/KDE unter VNC. Ich lief mehrere X im Andockfenster mit nvidia-Karten (kein VNC oder Xpra), so ist es sicherlich machbar.Die Lösung gegeben http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/ scheint eine einfache Möglichkeit zu starten von GUI-Anwendungen aus dem inneren der Behälter ( ich habe versucht firefox über ubuntu 14.04), aber ich fand, dass eine kleine zusätzliche änderung ist erforderlich, um die Lösung des Autors.
Insbesondere für den Betrieb der container, der Autor erwähnt hat:
Aber ich fand, dass (basierend auf einen bestimmten Kommentar auf der gleichen Seite), dass zwei zusätzliche Optionen
und
angegeben werden müssen, während der Ausführung der container für firefox, um richtig zu arbeiten:
Erstellt habe ich ein docker image mit den Informationen auf dieser Seite und diese zusätzliche Befunde: https://hub.docker.com/r/amanral/ubuntu-firefox/
/tmp/.X11-unix
- sockel überhaupt. Es funktioniert einfach mit der Montage.Xauthority
und--net=host
./tmp/.X11-unix
als Band nicht mehr funktioniert, als Andockfenster schweigend verweigert Volumen mounts aus den klebrigen Verzeichnisse.--network=host
tut. Es gibt die container-vollen Zugriff auf das host-Netzwerk-stack, das kann unerwünscht sein, je nachdem, was Sie zu tun versuchen. Wenn Sie gerade basteln mit Laufenden Container-GUIs auf dem desktop, dann sollte es keine Rolle.Während die Antwort von Jürgen Weigert im wesentlichen umfasst diese Lösung, es war nicht klar für mich zunächst, was wurde dort beschrieben. Also ich Stell meine auf Sie nehmen, falls jemand anderes Bedarf noch der Klärung.
First off, ist die entsprechende Dokumentation ist der X Sicherheits-manpage.
Zahlreichen online-Quellen empfehlen nur die Montage der X11-unix socket und die
~/.Xauthority
Datei in den container. Diese Lösungen arbeiten oft mit Glück, ohne wirklich zu verstehen, warum z.B. die container-Benutzer endet mit der gleichen UID wie der Benutzer, so gibt es keine Notwendigkeit für magic key Autorisierung.First off, die Xauthority-Datei hat den Modus 0600, so wird der container Benutzer werden nicht in der Lage, es zu Lesen, es sei denn, es hat die gleiche UID.
Selbst wenn Sie kopieren Sie die Datei in den container, und ändern Sie die Eigentumsrechte, gibt es noch ein weiteres problem. Wenn Sie
xauth list
auf dem host und container, mit dem gleichenXauthority
- Datei, sehen Sie verschiedene Einträge aufgelistet. Dies ist, weilxauth
filtert die Einträge je nachdem, wo Sie ausgeführt werden.Den X-client im container (d.h. GUI-app) identisch verhält
xauth
. In anderen Worten, Sie sehen nicht die magic cookie " für die X-session läuft auf dem desktop des Benutzers. Stattdessen sieht er die Einträge für alle "remote" X-sessions, die Sie geöffnet haben, die vorher (siehe unten).So, was Sie tun müssen, ist fügen Sie einen neuen Eintrag mit dem Hostnamen der container und der gleichen hex-Taste als host-cookie (d.h. die X-Sitzung auf Ihrem desktop ausgeführt werden), z.B.:
Der Haken ist, dass der cookie Hinzugefügt werden, mit
xauth add
im inneren des Behälters:Ansonsten
xauth
- tags, die er in einer Weise, die es nur gesehen, das außerhalb des Behälters.Das format für diesen Befehl lautet:
Wo
.
stellt dieMIT-MAGIC-COOKIE-1
Protokoll.Hinweis: Es gibt keine Notwendigkeit zu kopieren oder bind-mount
.Xauthority
in den container. Erstellen Sie einfach eine leere Datei, wie gezeigt, und fügen Sie der cookie.Jürgen Weigert's Antwort bekommt, um dieses mithilfe der
FamilyWild
Verbindung geben Sie zum erstellen einer neuen Behörde Datei auf dem host und kopieren Sie Sie in den container. Beachten Sie, dass es zunächst extrahiert die hex-key für die aktuelle X-Sitzung vom~/.Xauthority
mitxauth nlist
.Also die wesentlichen Schritte sind:
FamilyWild
- Anschluss Typ).Ich zugeben, dass ich nicht verstehe sehr gut, wie
FamilyWild
funktioniert oder wiexauth
oder X-clients filter-Einträge aus der Xauthority-Datei, je nachdem, wo Sie laufen. Weitere Informationen hierzu willkommen.Wenn Sie möchten, verteilen Sie Ihre Andockfenster app, müssen Sie ein start-script für den Betrieb der container, wird der hex-key für den Benutzer ist X-session und importiert es in den Behälter in einen der zwei Möglichkeiten, wie zuvor erläutert.
Es hilft auch zu verstehen, die mechanik des Autorisierungs-Prozess:
$DISPLAY
./tmp/.X11-unix
Verzeichnis montiert im container.Hinweis: Die X11-Unix-socket, der noch montiert werden muss in den container oder den container wird kein Weg an den X-server. Die meisten Distributionen deaktivieren Sie die TCP-Zugriff auf den X-server standardmäßig aus Gründen der Sicherheit.
Weitere Informationen, und um besser zu begreifen, wie der X-client/server-Beziehung funktioniert, ist es auch hilfreich, sich am Beispiel von SSH mit X-forwarding:
$DISPLAY
in der SSH-Sitzung zu zeigen, um seine eigene X-server.xauth
erstellen Sie ein neues cookie für den remote-host und fügt diese derXauthority
Dateien für die lokale und remote-Benutzer.Es ist eine andere Lösung, die von Herrn.Müll Sie GUI-apps in einem container ohne Verwendung von VNC, SSH und X11-forwarding. Es wird erwähnt hier zu.
Wenn Sie möchten, führen Sie eine GUI-Anwendung headless, dann Lesen Sie hier. Was Sie tun müssen, ist erstellen Sie einen virtuellen monitor mit
xvfb
oder andere ähnliche software. Dies ist sehr hilfreich, wenn Sie ausführen möchten, Selenium tests, zum Beispiel mit Browsern.Etwas, das nicht irgendwo erwähnt ist, dass einige software tatsächlich selbst nutzen, sand-Boxen mit Linux-Containern. So zum Beispiel Chrome wird nie normal laufen, wenn Sie nicht, verwenden Sie das entsprechende Kennzeichen
--privileged
bei der Ausführung der container.Ich bin spät zur party, aber für Mac-Benutzer, die nicht wollen, gehen Sie die XQuartz Weg, hier ist ein funktionierendes Beispiel, baut ein Fedora-Image, mit einer Desktop-Umgebung (xfce), mit
Xvfb
undVNC
. Es ist einfach und funktioniert:Auf einem Mac, können Sie einfach Zugriff auf die Screen-Sharing (Standard -) Anwendung, eine Verbindung zu
localhost:5901
.Dockerfile:
start-vnc.sh
Kontrolle der verlinkten readme für bauen und Befehle ausführen, wenn Sie wollen/brauchen.
Basierend auf Jürgen Weigert's Antwort, ich habe einige Verbesserungen:
Der einzige Unterschied ist, dass es erstellt ein Verzeichnis $XAUTH_DIR, die verwendet wird um $XAUTH-Datei und mount $XAUTH_DIR Verzeichnis anstelle von $XAUTH-Datei in docker-container.
Der Vorteil dieser Methode ist, dass Sie schreiben können, einen Befehl in /etc/rc.lokale, die zu erstellen einen leeren Ordner mit dem Namen $XAUTH_DIR in /tmp, und ändern Sie den Modus auf 777.
Wenn das system neu starten, bevor Benutzer-login, docker bereitstellen, die $XAUTH_DIR Verzeichnis automatisch, wenn der container die Neustart-Politik ist "immer". Nach dem user-login, können Sie schreiben einen Befehl in ~/.welches Profil ist zu erstellen $XAUTH-Datei, dann wird der container automatisch das $XAUTH-Datei.
Afterall, der container wird automatisch die Xauthority-Datei jedes mal das system neu starten und Benutzer-login.
Für 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, das Bild hat die gleiche Umsetzung wie der host.
Können Sie das Andockfenster user (hier: root) Zugriff auf das X11-display:
Die anderen Lösungen funktionieren sollte, aber hier ist eine Lösung für
docker-compose
.Um diesen Fehler zu beheben, muss man $DISPLAY und .X11-unix zu docker, sowie erteilen Sie dem Benutzer, der gestartet Andockfenster Zugang zu xhost.
Innerhalb
docker-compose.yml
Datei:Im terminal oder einem Skript:
xhost +si:localuser:$USER
xhost +local:docker
export DISPLAY=$DISPLAY
docker-compose up
OSX (10.13.6, high sierra)
Ähnlich @Nick's Antwort, aber seine Lösung nicht für mich arbeiten.
Installieren Sie zuerst schockiert von dem tun
brew install socat
, und installieren Sie XQuartz (https://www.xquartz.org/)Dann befolgt diese Schritte hier (http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/) in den Kommentaren:
War ich auch in der Lage zu starten CLion von meinem debian docker-container zu.
Andockfenster mit BRÜCKE-Netzwerk.
für Ubuntu 16.04 mit display-manager lightdm:
können Sie mehr private Berechtigungen
Noch eine andere Lösung, wenn Sie bereits gebaut Bild:
aufrufen Andockfenster w/o-sudo
(Wie kann man das Andockfenster: Got permission denied Problem)
teilen die gleichen USER & home & passwd zwischen host und container teilen
(Tipp: verwenden Sie die Benutzer-id statt user-name)
den dev-Ordner für Treiber-abhängigen libs auch zu funktionieren
plus X11-forward.
können Sie Fragen, was ist der Punkt zu verwenden docker, wenn so viele Dinge sind die gleichen? gut, ein Grund, warum ich denken kann, ist, zu überwinden, die Paket-Abhängigkeiten gelten Hölle (https://en.wikipedia.org/wiki/Dependency_hell).
Also diese Art der Nutzung ist eher geeignet für Entwickler, denke ich.