考虑 URL 重定向:如何在远程服务器上同一 docker 网络中的不同容器中使用 Web 应用程序 运行 的 GUI?

Considering URL redirections: How to use GUIs of web applications running in different containers within the same docker network on a remote server?

我觉得我忽略了一些明显的东西,因为我的 solutions/ideas 到目前为止看起来太麻烦了。我一直在深入寻找一个好的解决方案,但到目前为止没有成功 - 可能是因为我不知道要寻找什么。

问题: 考虑到这些容器之间的 URL 重定向,您如何与远程服务器上不同容器(在同一 Docker 网络中)中的 Web 服务器 运行 的图形界面进行交互?

初始情况: 我的 docker 主机 (Azure-VM) 上有两个容器(一个 Flask Web 应用程序和一个带有 OpenAM 运行 的 Tomcat 服务器)运行。

到目前为止,我已经使用 ssh 端口转发在我的本地计算机上配置了 OpenAM。

问题: Flask 网络应用程序通过其在 docker-compose 中定义的域名引用 OpenAM,反之亦然。我将 Flask 容器的端口转发到我的本地机器。 Flask 应用程序是 运行,我可以在我的浏览器中与它交互。 当我在本地计算机上从 Flask 重定向到 OpenAM 时,系统就会失败,因为 Flask 使用的 OpenAM 容器的引用特定于 Docker 网络。此外,OpenAM 容器的端口也不同。 换句话说,两个网络之间的路由是不存在的。

解决思路:

简化的docker-撰写:

version: "3.4"
services:
  openam:
    image: openidentityplatform/openam
    ports:
     - 5001:8080
    command: /usr/local/tomcat/bin/catalina.sh run
  flask:
    build: ./SimpleHTTPServer
    ports:
     - 5002:8000
    command: python -m http.server 8000

Route all requests through a single container - 这是正确的方法。

API gateway pattern

迄今为止我能找到的最佳解决方案。它不用于生产。但是,对于原型设计或者如果只是尝试使用容器来模拟服务器结构,这是一个简单的设置。

总体思路: 部署第三个 VNC 容器 运行 网络浏览器并将此第三个容器的端口转发到您的本地计算机。由于第三个容器是 docker 网络的一部分,它自然可以解析内部域名,并且本地计算机上的 VNC 安装使您能够与 GUI 进行交互。

接近

  1. 将 VNC 添加到原始问题的 docker-compose。
  2. 在服务器端和客户端启用 X11 转发。
  3. 使用 ssh 转发 VNC 容器的端口。
  4. 客户端安装VNC,开启新会话,输入预定义密码
  5. 试试吧。

循序渐进

  1. VNC container (inspired by creack's post on Whosebug) 添加到原始问题的 docker-compose 文件中:
version: "3.4"
services:
  openam:
    image: openidentityplatform/openam
    ports:
     - 5001:8080
    command: /usr/local/tomcat/bin/catalina.sh run
  flask:
    build: ./SimpleHTTPServer
    ports:
     - 5002:8000
    command: python -m http.server 8000
  firefoxVnc:
    container_name: firefoxVnc
    image: creack/firefox-vnc
    ports:
     - 5900:5900
    environment:
     - HOME=/
    command: x11vnc -forever -usepw -create
  • 运行 docker-组成:docker-compose up
  1. 在服务器端和客户端启用 X11 转发。
  • 在客户端 $ vim ~/.ssh/config 并添加以下行:
Host * 
ForwardAgent yes 
ForwardX11 yes
  • 在服务器端 运行 $ vim /etc/ssh/sshd_config 并编辑以下行:
X11Forwarding yes 
X11DisplayOffset 10
  1. 使用ssh转发VNC容器的端口
ssh -v -X -L 5900:localhost:5900 gw.example.com
  • 确保包含 X11 的 -X 标志。 -v 标志仅用于调试。
  1. 在客户端安装VNC,开启新会话,输入预定义密码。
  • 在本地计算机上安装 VNC 查看器
  • 打开已安装的查看器并使用转发地址开始新会话localhost:59000
  • 当提示输入密码 1234 时,它是在 VNC dicker 镜像的原始 Dockerfile 中设置的(参见上面链接的 creack 的 post)。
  1. 您现在可以在 VNC localhost:5900 会话的浏览器中转到 openam:8080/openam/apache:80

一个更好的解决方案,干净、直接,并且在 运行在不同虚拟机上运行部分应用程序时也能完美运行。

设置和使用 SSH SOCKS 隧道

对于 Google Chrome 和 macOS:

  • 将您的网络设置设置为在 Dockerfile 或 docker-compose 中托管。
  • 启动 SSH 隧道:
$ ssh -N -D 9090 [USER]@[SERVER_IP]
  • SwitchyOmega 代理插件添加到您的 Chrome 浏览器。
  • 通过转到 New Profile > Proxy Profile、单击 create、输入与 ssh 命令相同的服务器 IP 和端口 9090.
  • 来配置 SwitchyOmega
  • 打开一个新的终端tap然后运行:
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
    --user-data-dir="$HOME/proxy-profile" \
    --proxy-server="socks5://localhost:9090"
  • 将打开一个新的 Crome 会话,您可以在其中简单地浏览 docker 应用程序。

参考 |当运行宁Linux或Windows |使用 Firefox(无需插件)

指南 How to Set up SSH SOCKS Tunnel for Private Browsing 解释了如何设置 SSH SOCKS 隧道 运行ning Mac、Windows 或 Linux 并使用 Google Chrome 或 Firefox。我只是参考了 macOS 和 Crome 的设置,以防 link 死掉。