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?
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
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
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
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.
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:
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.
Auf Windows 7+ ist es mit MobaXterm etwas einfacher:
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
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.