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?

13voto

Anshuman Manral Punkte 609

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/

9voto

Void Punkte 553

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

7voto

Pithikos Punkte 16676

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.

6voto

Vince Punkte 955

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.

6voto

niutech Punkte 27051

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.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