如何从外部IP访问使用network_mode:“主机”运行的docker服务

时间:2019-06-28 16:54:03

标签: docker docker-compose port

我的情况:

我有一台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文件中以实现我的目标,但是我不想这样做,因为对于我来说,最好单独管理数据库。

2 个答案:

答案 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的传入流量。您必须自己添加规则。

希望有帮助。