Greifen Sie auf die Webbenutzeroberfläche zu, die in einem Docker-Container ausgeführt wird, der auf einem Remote-Host ausgeführt wird

886
FGreg

Ich habe eine Amazon EC2-Instanz, auf der CentOS 7 mit Docker ausgeführt wird. Ich verwende Docker-Container in einem benutzerdefinierten Docker-Netzwerk.

Ich versuche, von einem dieser Docker-Container auf eine Web-Benutzeroberfläche zuzugreifen. Der folgende Befehl funktioniert, wenn ich versuche, dies auf meinem Mac auszuführen:

xhost + $my_ip docker run -d --rm --name firefox --network myNetwork -e DISPLAY=$my_ip:0 -v /tmp/.X11-unix:/tmp/.X11-unix jess/firefox 

Wenn ich aber einfach die einfache Lösung probiere und mache

ssh -Y remote-host docker run -d --rm --name firefox --network myNetwork -e DISPLAY=$my_ip:0 -v /tmp/.X11-unix:/tmp/.X11-unix jess/firefox 

Es funktioniert nicht; höchstwahrscheinlich, weil remote-hostkein Zugriff auf $my_ip.

Dieser Artikel brachte mich weiter https://dzone.com/articles/docker-x11-client-via-ssh, indem er erklärte, dass ssh bei Verwendung der X11-Weiterleitung mit ssh tatsächlich einen 'Proxy' auf dem Remote-Computer startet, der aufhört die Loopback-Schnittstelle der Remote-Maschine.

So kann ich Firefox mithilfe dieser Docker-Datei tatsächlich in einem Container auf einem Remote-Host ausführen:

FROM centos RUN yum install -y firefox dbus && \ dbus-uuidgen > /var/lib/dbus/machine-id  ENTRYPOINT [ "/usr/bin/firefox" ] 

und diesen Andockbefehl nach dem Ausführen ssh -Y remote-host:

docker run --network host --env="DISPLAY" --volume="$HOME/.Xauthority:/root/.Xauthority:rw" firefox 

Yay! Aber nicht ganz. Wenn ich von ändern --network hostzu --network myNetworkihm nicht mehr funktioniert. Wie bereits erwähnt, hört ssh auf der Loopback-Schnittstelle der Hostmaschine, auf die der Docker-Container keinen Zugriff mehr hat.

Es scheint also, dass der einzige Weg, wie ich dies erreichen kann, darin besteht, wenn ich herausfinde, wie ssh beim Einrichten der X11-Weiterleitung an ein anderes Interface als Loopback bindet. Ist das möglich?

0
Ich frage mich, ob ich GatewayPorts auf der Serverseite "sshd_config" auf "yes" setzen würde, wenn das funktionieren würde. FGreg vor 7 Jahren 0

1 Antwort auf die Frage

1
FGreg

Ich habe einen anderen Weg gefunden, um mein Endziel zu erreichen, auf die Web-Benutzeroberfläche eines Docker-Containers zuzugreifen. Ich habe am Ende einen SOCKS v5-Proxy über SSH eingerichtet. Dies ist eigentlich nur für Entwicklungs- und Debugging-Zwecke gedacht und sollte nicht in einer Produktionssituation verwendet werden. Ich übernehme keine Verantwortung für die Sicherheitsauswirkungen der Ausführung von sshd als root in einem Docker-Container. Stellen Sie sicher, dass Sie die Konsequenzen verstehen.

Die Schritte, die ich unternommen habe, sind unten aufgeführt. In diesem Beispiel ist zu berücksichtigen, dass centosec2mein EC2-Server CentOS ausführt. Dies myappcontainerist der Name des Containers, auf dem die Anwendung ausgeführt wird, die die Web-Benutzeroberfläche hostet, auf die ich zugreifen möchte, und my-netder Name des Overlay-Netzwerks, myappcontainerauf dem ausgeführt wird.

Bedarf:

  • Browser, der für die Verbindung über einen SOCKS v5-Proxy konfiguriert werden kann. Ich empfehle Firefox mit dem Add-On FoxyProxy, da dies das Ein- und Ausschalten des Proxys sehr einfach macht.
  • Andockbild, das ausgeführt werden kann sshd. Ich habe https://hub.docker.com/r/macropin/sshd/ verwendet.

Schritte:

  1. Portweiterleitung eines Ports von Ihrem Laptop zum Server. In diesem Beispiel ist 8888 der Port, auf dem der SOCKS-Proxy ausgeführt wird, aus der Perspektive Ihres Laptops und 9696 der weitergeleitete Port auf dem Server.

    [user@laptop ~]$ ssh -L 8888:localhost:9696 centosec2 -N

  2. Öffnen Sie in einer anderen Shell eine reguläre SSH-Sitzung auf dem Server und starten Sie den sshdContainer. Stellen Sie sicher, dass der sshdContainer in demselben Netzwerk ausgeführt wird wie der Container, auf dem die Web-Benutzeroberfläche ausgeführt wird.

    [Benutzer @ Laptop ~] $ ssh centosec2 [user @ centosec2 ~] $ docker run --rm -d -p 2222: 22 --netze mein-net -v .ssh / id_rsa.pub: /root/.ssh/authorized_keys macropin / sshd 
  3. Wenn der sshdContainer sshdgestartet ist, verwenden Sie dieselbe Shell für ssh in den Container und starten Sie einen SOCKS-Proxy an dem Port, der an Ihren Laptop weitergeleitet wird. -D 9696weist ssh an, einen SOCKS-Server an Port 9696 zu starten.

    [user@centosec2 ~]$ ssh -D 9696 -p 2222 root@localhost -N

  4. Ihr Laptop kann jetzt über den SOCKS-Proxy auf Port 8888 auf das Docker-Netzwerk zugreifen. Konfigurieren Sie Ihren Browser so, dass er über einen SOCKS v5-Proxy eine Verbindung zum Internet herstellt localhost:8888. Sie sollten dann in der Lage sein, mit dem Hostnamen des Docker-Containers zur Web-Benutzeroberfläche zu navigierenhttp://myappcontainer:8080

Es ist eine Menge Reifen, durch die man springen kann, aber es war der einfachste Weg, um herauszufinden, wie ich das erreichen kann. Hoffentlich hilft das jemand anderen.