我的主机上运行的应用程序具有以下功能:它侦听端口4001(可配置),只接受来自可信IP地址白名单的连接(默认情况下只有127.0.0.1,可以添加其他地址)但是一个接一个,不使用面具)。
(这是在java中运行的交互式代理网关应用程序,但我认为这不重要)
我在docker容器中运行另一个需要连接到宿主应用程序的应用程序。
(这是一个访问IB API的python应用程序,但我认为这并不重要)
最终我会在多台机器上尝试多个容器,但是我甚至无法让它在同一台机器上运行。
sudo docker run -t myimage
Error: Couldn't connect to TWS. Confirm that "Enable ActiveX and Socket Clients" is enabled on the TWS "Configure->API" menu.
(IB网关在主机上无响应)
理想我可以设置docker容器/网桥,以便所有docker容器看起来好像在特定的IP地址上,将它添加到白名单中,然后瞧。
我尝试了什么:
1)使用-p和EXPOSE
sudo docker run -t -p 4001:4001 myimage
绑定0.0.0.0:4001失败:端口已经分配。
(网关无响应)
此eithier不起作用或导致“已使用的端口”冲突。我知道这些设置是针对相反的问题而设计的(主机无法看到容器上的特定端口)。
2)设置--net = host
sudo docker run -t --net = host myimage
读取套接字时发生异常 - 由对等方重置连接
(网关无响应)
这应该有效,因为docker容器现在应该看起来像127.0.0.1 ......但它没有。
3)设置--net = host并将本地主机的真实IP地址192.168.0.12(如评论中所示)添加到白名单
sudo docker run -t --net = host myimage
读取套接字时发生异常 - 由对等方重置连接
(网关无响应)
4)将172.17.0.1,... 2,... 3添加到主机应用程序的白名单中(桥接网络为172.17.0.0,后续容器在此范围内分配)
sudo docker run -t myimage
Error: Couldn't connect to TWS. Confirm that "Enable ActiveX and Socket Clients" is enabled on the TWS "Configure->API" menu.
(主持人没有回应)
这非常hacky但是没有更好的工作。
PS注意这与尝试在容器内运行主机应用程序IB网关的问题不同 - 我不这样做。
我不想在另一个容器中运行宿主应用程序,尽管在某些方面可能是一个更简洁的解决方案。
答案 0 :(得分:3)
运行IB网关在许多不同的级别上都很棘手,包括连接它,特别是如果你想自动化这个过程。
我们仔细研究了从其他IP连接到它,并最终放弃了 - 据我们所知,网关错误。有一个设置可以连接到网关的白色IP,但它不起作用,不能编写脚本。
在我们的构建过程中,我们创建一个docker基础映像,然后将网关和任何/所有网关的客户端添加到该映像。然后我们运行最终图像。
答案 1 :(得分:3)
(代表OP发布)。
设置--net=host
并从4001更改端口,以便它不会与同一网络上的网关的实时版本冲突。白名单中唯一需要的IP地址是127.0.0.1。
sudo docker run -t --net=host myimage
答案 2 :(得分:2)
使用socat
将端口从网关转发到可以侦听任何地址的新端口。例如,将网关设置为侦听端口4002(仅限localhost)并使用容器中的命令
socat tcp-listen:4001,reuseaddr,fork tcp:localhost:4002
将端口转发到4001。
然后,当使用参数-p 4001:4001
运行容器时,您可以使用端口4001从容器外部连接到网关。
答案 3 :(得分:1)
如果此功能对另一个人有用。我尝试了一些建议,将这些建议从运行在python
容器上的Docker
应用程序连接到运行在另一台服务器上的TWS IBGateway实例,但它们都没有100%正常工作。 socat
选项正在连接,但是由于socat缓冲区存在我们无法修复的问题,连接被断开了。
我们发现的解决方案是从运行Docker容器的计算机到运行TWS IBGateway的计算机创建ssh隧道。
ssh -i ib-gateway.pem <ib-gateway-server-user>@<ib-gateway-server-ip> -f -N -L 4002:127.0.0.1:4001
建立此ssh隧道后,可以测试它的运行状态
telnet 127.0.0.1 4002
如果此命令成功运行,则您的ssh隧道已准备就绪。下一步是将python
应用程序配置为在端口127.0.0.1
上连接到4002
,并用--net=host
启动docker容器,以便能够访问在其上运行的ssh隧道Docker主机。