我有一种感觉,我忽略了一些显而易见的东西,因为到目前为止,我的解决方案/想法似乎太麻烦了。我一直在努力寻找一个好的解决方案,但到目前为止没有成功——可能是因为我不知道该寻找什么
问题:如果在远程服务器上的不同容器(在同一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交互。
方法
- 将VNC添加到原始问题的docker组合中
- 在服务器和客户端上启用X11转发
- 使用ssh转发VNC容器的端口
- 在客户端上安装VNC,启动新会话,然后输入预定义的密码
- 试试看
逐步
- 将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
- 在服务器和客户端上启用X11转发
- 在客户端
$ vim ~/.ssh/config
上,并添加以下行:
Host *
ForwardAgent yes
ForwardX11 yes
- 在服务器端运行
$ vim /etc/ssh/sshd_config
并编辑以下行:
X11Forwarding yes
X11DisplayOffset 10
- 使用ssh转发VNC容器的端口
ssh -v -X -L 5900:localhost:5900 gw.example.com
- 请确保包含X11的-X标志。-v标志仅用于调试
- 在客户端上安装VNC,启动新会话并输入预定义的密码
- 在本地计算机上安装VNC查看器
- 打开已安装的查看器,并使用转发的地址localhost:5900启动新会话
- 当提示时,键入密码
1234
,该密码是在VNC dicker映像的原始Dockerfile中设置的(请参阅上面链接的creack的帖子)
- 您现在可以在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 - 打开一个新的终端抽头并运行:
"/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的设置,以防链接失效。