5

我有一个在我的主机上运行的应用程序,它具有以下功能:它侦听端口 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 失败:端口已分配。

(网关无响应)

这两个都不起作用或导致“端口已在使用”冲突。我收集这些设置是为相反的问题设计的(主机看不到容器上的特定端口)。

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 网关的问题不同——我没有这样做。

我不想在另一个容器中运行主机应用程序,尽管在某些方面这可能是一个更简洁的解决方案。

4

4 回答 4

4

运行 IB 网关在许多不同的级别上都很棘手,包括连接到它,特别是如果您想自动化该过程。

我们仔细研究了从其他 IP 连接到它,最后放弃了它——据我们所知是网关错误。有一个可以连接到网关的白色 IP 的设置,但它不起作用并且无法编写脚本。

在我们的构建过程中,我们创建一个 docker 基础镜像,然后将网关和任何/所有网关的客户端添加到该镜像。然后我们运行最终的图像。

于 2017-01-19T17:55:15.647 回答
3

用于socat将端口从网关转发到可以侦听任何地址的新端口。例如,将网关设置为监听 4002 端口(仅限本地主机)并在容器中使用命令

socat tcp-listen:4001,reuseaddr,fork tcp:localhost:4002

将端口转发到 4001。然后您可以在使用参数运行容器时使用端口 4001 从容器外部连接到网关-p 4001:4001

于 2017-04-08T23:27:40.143 回答
3

(代表 OP 发布)

从 4001设置--net=host和更改端口,使其不会与同一网络上的实时版本网关冲突。白名单中唯一需要的 IP 地址是 127.0.0.1。

sudo docker run -t --net=host myimage
于 2017-01-20T17:14:41.363 回答
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并启动您的 docker 容器,--net=host以便能够访问在 Docker 主机上运行的 ssh 隧道。

于 2019-10-17T12:23:35.210 回答