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



我有一种感觉,我忽略了一些显而易见的东西,因为到目前为止,我的解决方案/想法似乎太麻烦了。我一直在努力寻找一个好的解决方案,但到目前为止没有成功——可能是因为我不知道该寻找什么

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

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

  • 在虚拟机上,我可以通过打开的端口输出两个容器的内容
  • 使用ssh端口转发,我可以在本地机器上与两个容器的图形组件进行交互
  • 这两个容器都是用相同的docker组合创建的,可以通过它们的域名访问,而无需额外的网络设置

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

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

解决方案理念:

  • 使用命令行工具在虚拟机上执行请求
  • 使用带有无头浏览器的容器,该浏览器可自动执行请求
  • 请使用网络设置"主机",然后在虚拟机上执行无头浏览器
  • 通过单个容器(类似于VPN)路由所有请求,并使用ssh端口转发

简化的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网关模式

到目前为止我能找到的最好的解决方案。它不用于生产。然而,对于原型设计,或者如果只是试图通过使用容器来模拟服务器结构,这是一个简单的设置

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

方法

  1. 将VNC添加到原始问题的docker组合中
  2. 在服务器和客户端上启用X11转发
  3. 使用ssh转发VNC容器的端口
  4. 在客户端上安装VNC,启动新会话,然后输入预定义的密码
  5. 试试看

逐步

  1. 将VNC容器(灵感来自creack在stackoverflow上的帖子)添加到原始问题的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 compose: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:5900启动新会话
  • 当提示时,键入密码1234,该密码是在VNC dicker映像的原始Dockerfile中设置的(请参阅上面链接的creack的帖子)
  1. 您现在可以在VNClocalhost: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
  • 打开一个新的终端抽头并运行:
"/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 SSH SOCKS Tunnel for Private Browsing解释了如何设置运行Mac、Windows或Linux并使用Google Chrome或Firefox的SSH SOCKS隧道。我只是参考了macOS和Crome的设置,以防链接失效。

最新更新