Docker für GUI-basierte Umgebungen?
Problem
Habe ich eine Reihe von client-Geräte, die einen Teil eines enterprise web-Anwendung. Jede Maschine läuft die identische software, die ein PyQT-basierten web-client, der eine Verbindung zu einem server. Diese client-software wird regelmäßig aktualisiert und ich würde gerne einige-Konfiguration/- provisioning-tool, das es erlaubt, die gleiche Umgebung, auf jedem Rechner, und daher bieten einfache Bereitstellung und Konfiguration der software auf jedem der Client-Computer.
Das problem ist, dass ich versucht habe zu verwenden, Chef, aber es dauert viel Mühe, um tatsächlich pflegen Küchenchef Kenntnisse und Fähigkeiten (wir haben keine dedizierte Ops-guy) und außerdem ein Koch-Rezept kann fehlschlagen, wenn einige Drittanbieter-repository ist nicht mehr verfügbar (dies ist einer der wichtigsten stopper).
Möchte ich versuchen Andockfenster das problem zu lösen, aber ich weiß noch nicht wenn es ist auch möglich, Bilder/Container, die es ermöglichen, für einige GUI-basierte software zu bedienen.
Frage
Ist es möglich, Docker, um eine Entwicklung/Produktion-Umgebung für eine GUI-basierte Anwendung (PyQt/QT)? Wenn ja, was wären die ersten Schritte zu nähern?
InformationsquelleAutor der Frage skanatek | 2014-06-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Derzeit wird diese Frage nicht beantwortet, aber es wird sehr hoch bewertet bei Google. Die anderen Antworten sind meist richtig, aber mit Einschränkungen, ich habe die harte Tour gelernt, und ich möchte, um andere zu retten ärger.
Die Antwort von Nasser Alshammari ist die einfachste (und Schnellste) Methode zum ausführen von GTK-Anwendungen innerhalb eines Docker-container - montieren Sie die Buchse für den X-server als Andockfenster Volumen und sagen Andockfenster verwenden, statt.
(Würde ich auch empfehlen, die übergabe der
-u <username-within-container>
- flag, da das ausführen von X11-Anwendungen als root funktioniert nicht immer, und wird im Allgemeinen nicht empfohlen, besonders beim austauschen von sessions).Dieser Arbeit wird für Anwendungen wie
xterm
sowie GTK-basierten Anwendungen. Zum Beispiel, wenn Sie versuchen, diese mit Firefox (das ist GTK-basiert), wird es funktionieren (beachten Sie, dass wenn Sie bereits mit Firefox auf dem host, es öffnet sich ein neues Fenster, in dem host, anstatt öffnen Sie eine neue Instanz von Firefox innerhalb des Containers).JedochIhre Antwort fragt nach PyQT und speziell. Es stellt sich heraus, dass die Qt unterstützt nicht die gemeinsame Nutzung von X-sessions auf diese Weise (oder zumindest nicht unterstützt).
Wenn Sie versuchen, eine QT-basierte Anwendung, die auf diese Weise, werden Sie wahrscheinlich erhalten eine Fehlermeldung wie die folgende:
Ich sage "vermutlich", weil ich nicht getestet habe ist dieser Ansatz ausreichend mit Qt-Anwendungen, um sicher zu sein, oder Gruben sich in den Qt-Quellcode genug, um herauszufinden, warum das nicht unterstützt. YMMV, und vielleicht hast du Glück, aber wenn Sie schauen, um laufen eine Qt-basierte Anwendung, die in einem Docker-container, die Sie haben können, zu gehen die "old-fashioned" - Ansatz und entweder
Laufen sshd in den Behälter, schalten Sie die X11-Weiterleitung, und schließen Sie dann den container mit
ssh -X
(sicherer) oderssh -Y
(weniger sicher ist, verwendet nur wenn Sie voll Vertrauen in die Container-Anwendung).Run VNC im container, und schließen Sie es aus dem host mit einem VNC-client.
Zwischen diesen beiden Optionen würde ich empfehlen den ersten, aber sehen, was funktioniert am besten für Ihre situation.
InformationsquelleAutor der Antwort chimeracoder
Gibt es viele Lösungen, um GUI-Anwendungen laufen in einem docker-container. Sie können die Verwendung von SSH oder VNC zum Beispiel. Aber fügen Sie etwas overhead und Verzögerung. Der beste Weg, dass fand ich einfach in der Datei der X-server in der host-Computer als ein volume auf den container. Wie diese:
Dann alle deine GUI-apps laufen von container.
Hoffe, Das hilft!
InformationsquelleAutor der Antwort nasser alshammari
Habe ich es geschafft, zu laufen xeyes in einem container und finden Sie das "Fenster" in ein X-server läuft außerhalb des Containers. Hier ist, wie:
Ich verwendet, Xephyr, die zum ausführen eines verschachtelten X-Server. Dies ist nicht notwendig, aber die meisten linux-desktops erlauben nicht die Ausführung von remote-apps, die Ihnen durch default (hier's, wie zu "beheben", das auf ubuntu).
Installieren Xephyr:
Laufen Xephyr:
Erzeugt einen neuen 800x600 Fenster, das wirkt wie ein X-server.
Finden Sie eine "externe" Adresse Ihrer Maschine. Dies ist, wo der X-server ausgeführt wird:
Nicht verwenden, 127.0.0.1! Sie können jede der anderen. Ich verwende 172.17.42.1.
Erstellen Sie ein Dockerfile mit folgendem Inhalt:
Bauen:
Und führen Sie es:
Hinweis, dass ich die Einstellung der Umgebungsvariable DISPLAY, wo ich es sehen will.
Können Sie verwenden die gleiche Technik, die zum umleiten der Anzeige in jede X-server.
InformationsquelleAutor der Antwort ivant
Können Sie subuser Paket GUI-Anwendungen. Es hat auch eine gute Unterstützung für die Aktualisierung von Anwendungen. Sie können Ihre Dockerfiles in ein git-repo einmal, und dann einfach laufen
subuser update all
auf jedem client neu zu erstellen die Bilder, wenn Sie geändert werden müssen.InformationsquelleAutor der Antwort timthelion
Kürzlich habe ich versucht zu laufen PyQt5 Anwendung im Andockfenster. Was ich gelernt habe, ist, dass Sie können nicht führen Sie die Anwendung als root (die Sie haben, um normale Benutzer). Wenn Sie spielen wollen-audio/video Anwendung, die Sie laufen docker-container mit der Gruppe "audio" und Halterung, sound-device. So laufen meine Anwendung verwende ich diese:
Verbringe ich einige Zeit, bis ich herausgefunden habe, welche Pakete ich brauche, um zu meinen container zu laufen PyQt-Anwendung, in der es so erstellte ich einige Dockerfiles (mit einfachen demo-app), um es einfacher für die anderen:
Python 3 + PyQt5: https://github.com/fadawar/docker-pyqt5
Python 3 + PyQt5 + QML + QtMultimedia: https://github.com/fadawar/docker-pyqt5-qml-qtmultimedia
InformationsquelleAutor der Antwort fadawar