我的情况:
我有一台IP x.x.x.x的服务器,在该服务器上运行MongoDB实例。我还使用如下的docker-compose.yml
文件构建服务
version: "3"
services:
myApp:
image: myApplication
ports:
- "8080:8080"
environment:
SPRING_DATA_MONGODB_URI: mongodb://localhost:27017/myAppDb
运行docker-compose up
来启动容器时,我可以通过x.x.x.x:8080从我的计算机访问服务
但是问题是我的服务无法连接到位于localhost:27017的mongoDB,因为它们不在同一网络上。因此,我将选项network_mode: "host"
添加到我的docker-compose文件中。它解决了问题,我的服务可以连接到服务器上运行的mongoDB。但是,我无法再通过x.x.x.x:8080访问我的服务
我的问题:
如何仍然可以通过带有选项network_mode: "host"
的x.x.x.x:80连接到我的服务?还是我不需要使用该选项,但是我的服务仍可以连接到mongoDB实例?
注意::MongoDB实例以传统方式安装(yum install mongodb-org),并设置为只能通过localhost:27017(或127.0.0.1:27107)访问)。我不知道为什么或为什么,但是就是这样,所以我无法将连接字符串更改为mongodb://x.x.x.x:27017。只是行不通。
我也知道我可以将mongodb作为服务添加到docker-compose
文件中以实现我的目标,但是我不想这样做,因为对于我来说,最好单独管理数据库。
答案 0 :(得分:0)
我经历过类似的事情,但是我没有使用docker-compose,但我认为您也许可以应用相同的方法。
您将创建自己的桥接网络(https://docs.docker.com/network/bridge/),而不是使用主机,然后我认为您的服务应该能够访问mongodb,并且您也应该能够访问mongodb :)
答案 1 :(得分:0)
似乎唯一的出路是在myApp
模式下运行host
容器。在这种模式下,服务应该在端口8080
上主机的IP地址上可访问。
如果不是,那很可能是由于防火墙问题。
可以在bridge
网络模式下访问同一服务,因为在此模式下,docker操纵iptables
规则以提供对容器的访问。更多信息here。
在您的特定情况下,泊坞窗添加了NAT规则,以将主机上端口8080
上的传入流量转发到容器上的端口8080
。执行iptables
iptables -t nat -L
应输出规则:
Chain POSTROUTING (policy ACCEPT)
MASQUERADE tcp -- 172.17.0.2 172.17.0.2 tcp dpt:http-alt
...
Chain DOCKER (2 references)
DNAT tcp -- anywhere anywhere tcp dpt:http-alt to:172.17.0.2:8080
其中172.17.0.2
是容器的IP
。
问题出在host
模式下,其中发布端口被丢弃,而docker不添加任何规则以允许通过端口8080
的传入流量。您必须自己添加规则。
希望有帮助。