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?

290voto

creack Punkte 115860

Sie können einfach einen VNC-Server zusammen mit Firefox installieren :)

Ich habe ein Bild namens vnc/firefox hier gepusht: docker pull creack/firefox-vnc

Das Bild wurde mit diesem Dockerfile erstellt:

# Firefox über VNC
#
# VERSION               0.1
# DOCKER-VERSION        0.2

VON    ubuntu:12.04
# Stellen Sie sicher, dass das Paketrepositorium aktuell ist
FÜHREN    Sie     echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
FÜHREN    Sie     apt-get update aus

# Installieren Sie vnc, xvfb, um einen 'falschen' Bildschirm zu erstellen, und Firefox
FÜHREN    Sie     apt-get install -y x11vnc xvfb firefox aus
FÜHREN    Sie     mkdir ~/.vnc aus
# Ein Passwort einrichten
FÜHREN    Sie     x11vnc -storepasswd 1234 ~/.vnc/passwd aus
# Firefox automatisch starten (könnte nicht der beste Weg sein, aber es funktioniert)
FÜHREN    Sie     bash -c 'echo "firefox" >> /.bashrc' aus

Dadurch wird ein Docker-Container erstellt, der VNC mit dem Passwort 1234 ausführt:

Für Docker-Version 18 oder neuer:

docker run -p 5900:5900 -e HOME=/ creack/firefox-vnc x11vnc -forever -usepw -create

Für Docker-Version 1.3 oder neuer:

docker run -p 5900 -e HOME=/ creack/firefox-vnc x11vnc -forever -usepw -create

Für Docker vor Version 1.3:

docker run -p 5900 creack/firefox-vnc x11vnc -forever -usepw -create

220voto

Jürgen Weigert Punkte 2520

Xauthority wird zu einem Problem bei neueren Systemen. Ich kann entweder alle Schutzmaßnahmen mit xhost + verwerfen, bevor ich meine Docker-Container ausführe, oder ich kann eine gut vorbereitete Xauthority-Datei übergeben. Typische Xauthority-Dateien sind hostspezifisch. Mit Docker kann jeder Container einen anderen Hostnamen haben (mit docker run -h festgelegt), aber auch das Setzen des Hostnamens des Containers identisch mit dem Hostsystem hat in meinem Fall nicht geholfen. xeyes (ich mag dieses Beispiel) würde einfach den magischen Cookie ignorieren und keine Anmeldeinformationen an den Server senden. Daher erhalten wir die Fehlermeldung 'Kein Protokoll angegeben - Anzeige kann nicht geöffnet werden'

Die Xauthority-Datei kann so geschrieben werden, dass der Hostname keine Rolle spielt. Wir müssen die Authentifizierungsfamilie auf 'FamilyWild' setzen. Ich bin mir nicht sicher, ob xauth einen geeigneten Befehlszeilenbefehl dafür hat, also hier ein Beispiel, das xauth und sed kombiniert, um dies zu tun. Wir müssen die ersten 16 Bits des nlist-Ausgangs ändern. Der Wert von FamilyWild beträgt 65535 oder 0xffff.

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=/tmp/.docker.xauth
xauth nlist :0 | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -
docker run -ti -v $XSOCK:$XSOCK -v $XAUTH:$XAUTH -e XAUTHORITY=$XAUTH xeyes

87voto

A. Binzxxxxxx Punkte 2733

Ich habe gerade diesen Blogbeitrag gefunden und möchte ihn hier mit Ihnen teilen, weil ich denke, dass dies der beste Weg ist und es so einfach ist.

http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/

PROS:
+ kein x-Server-Kram im Docker-Container
+ kein VNC-Client/-Server erforderlich
+ kein SSH mit X-Weiterleitung
+ viel kleinere Docker-Container

CONS:
- Verwendung von X auf dem Host (nicht für sicheres Sandboxen gedacht)

Falls der Link eines Tages nicht funktionieren sollte, habe ich den wichtigsten Teil hier eingefügt:
dockerfile:

FROM ubuntu:14.04

RUN apt-get update && apt-get install -y firefox

# Ersetzen Sie 1000 durch Ihre Benutzer-/Gruppen-ID
RUN export uid=1000 gid=1000 && \
    mkdir -p /home/developer && \
    echo "developer:x:${uid}:${gid}:Developer,,,:/home/developer:/bin/bash" >> /etc/passwd && \
    echo "developer:x:${uid}:" >> /etc/group && \
    echo "developer ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/developer && \
    chmod 0440 /etc/sudoers.d/developer && \
    chown ${uid}:${gid} -R /home/developer

USER developer
ENV HOME /home/developer
CMD /usr/bin/firefox

Das Bild erstellen:

docker build -t firefox .

Und der Ausführungsbefehl:

docker run -ti --rm \
   -e DISPLAY=$DISPLAY \
   -v /tmp/.X11-unix:/tmp/.X11-unix \
   firefox

Natürlich können Sie dies auch im Ausführungsbefehl mit sh -c "echo script-here" tun

TIPP: Für Audio schauen Sie sich an: https://stackoverflow.com/a/28985715/2835523

60voto

Aryeh Leib Taurog Punkte 5036

Mit Docker-Datenvolumen lässt sich sehr einfach der Unix-Domänen-Socket von xorg innerhalb des Containers freigeben.

Zum Beispiel mit einem Dockerfile wie diesem:

FROM Debian
RUN apt-get update
RUN apt-get install -qqy x11-apps
ENV DISPLAY :0
CMD xeyes

Könnten Sie folgendes tun:

$ docker build -t xeyes - < Dockerfile
$ XSOCK=/tmp/.X11-unix/X0
$ docker run -v $XSOCK:$XSOCK xeyes

Dies ist natürlich im Wesentlichen dasselbe wie X-Forwarding. Es gewährt dem Container vollen Zugriff auf den X-Server auf dem Host, daher wird es nur empfohlen, wenn Sie dem, was sich darin befindet, vertrauen.

Hinweis: Wenn Sie sich um die Sicherheit sorgen, wäre eine bessere Lösung, die Anwendung mit zwingendem oder rollenbasiertem Zugriffskontrolle einzuschränken. Docker bietet ziemlich gute Isolierung, wurde jedoch mit einem anderen Zweck entwickelt. Verwenden Sie AppArmor, SELinux oder GrSecurity, die entwickelt wurden, um Ihre Bedenken anzusprechen.

28voto

Nick Punkte 2204

OSX

Jürgen Weigert hat die beste Antwort, die für mich auf Ubuntu funktioniert hat. Auf OSX läuft Docker jedoch innerhalb von VirtualBox, sodass die Lösung ohne zusätzliche Arbeit nicht funktioniert.

Ich habe es mit diesen zusätzlichen Zutaten zum Laufen gebracht:

  1. Xquartz (OSX enthält X11-Server nicht mehr)
  2. Socket-Weiterleitung mit socat (brew install socat)
  3. BASH-Skript zum Starten des Containers

Ich würde Benutzerkommentare zur Verbesserung dieser Antwort für OSX begrüßen. Ich bin mir nicht sicher, ob die Socket-Weiterleitung für X sicher ist, aber ich beabsichtige sie nur lokal für das Ausführen des Docker-Containers zu verwenden.

Außerdem ist das Skript ein wenig fragil, da es nicht einfach ist, die IP-Adresse des Geräts abzurufen, da es in unserem lokalen Funknetz ist und daher immer eine zufällige IP ist.

Das BASH-Skript, das ich zum Starten des Containers verwende:

#!/usr/bin/env bash

CONTAINER=py3:2016-03-23-rc3
COMMAND=/bin/bash
NIC=en0

# Greifen Sie auf die IP-Adresse dieses Geräts zu
IPADDR=$(ifconfig $NIC | grep "inet " | awk '{print $2}')

DISP_NUM=$(jot -r 1 100 200)  # zufällige Anzeigenummer zwischen 100 und 200

PORT_NUM=$((6000 + DISP_NUM)) # damit mehrere Instanzen des Containers sich nicht gegenseitig stören

socat TCP-LISTEN:${PORT_NUM},reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\" 2>&1 > /dev/null &

XSOCK=/tmp/.X11-unix
XAUTH=/tmp/.docker.xauth.$USER.$$
touch $XAUTH
xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -

docker run \
    -it \
    --rm \
    --user=$USER \
    --workdir="/Users/$USER" \
    -v "/Users/$USER:/home/$USER:rw" \
    -v $XSOCK:$XSOCK:rw \
    -v $XAUTH:$XAUTH:rw \
    -e DISPLAY=$IPADDR:$DISP_NUM \
    -e XAUTHORITY=$XAUTH \
    $CONTAINER \
    $COMMAND

rm -f $XAUTH
kill %1       # beenden Sie den oben gestarteten socat-Job

Mit diesem Ansatz kann ich xeyes und matplotlib zum Laufen bringen.

Windows 7+

Auf Windows 7+ ist es mit MobaXterm etwas einfacher:

  1. Installieren Sie MobaXterm für Windows
  2. Starten Sie MobaXterm
  3. Konfigurieren Sie den X-Server: Einstellungen -> X11 (Registerkarte) -> setzen Sie X11 Remote Access auf full
  4. Verwenden Sie dieses BASH-Skript zum Starten des Containers

run_docker.bash:

#!/usr/bin/env bash

CONTAINER=py3:2016-03-23-rc3
COMMAND=/bin/bash
DISPLAY="$(hostname):0"
USER=$(whoami)

docker run \
    -it \
    --rm \
    --user=$USER \
    --workdir="/home/$USER" \
    -v "/c/Users/$USER:/home/$USER:rw" \
    -e DISPLAY \
    $CONTAINER \
    $COMMAND

xeyes läuft auf dem PC

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