如何使用 network_mode: "host" 从外部 IP 访问服务 运行 docker

How to access service running docker with network_mode: "host" from external IP

我的场景:

我有一台 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 运行ning。但是,我无法再通过 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。就是不行。

我也知道我可以在 docker-compose 文件中添加 mongodb 作为服务来实现我的目标,但我不想这样做,因为在我的情况下,最好单独管理数据库。

我也遇到过类似的事情,但我没有使用docker-compose,但我想你也许可以应用相同的方法。

您将创建自己的桥接网络(https://docs.docker.com/network/bridge/)而不是使用主机,然后我认为您的服务应该能够访问 mongodb,并且您应该能够也访问 mongodb :)

看来唯一的出路就是运行 myApp容器处于host模式。在这种模式下,服务应该可以通过端口 8080 上主机的 IP 地址访问。 如果不是,那很可能是因为防火墙问题。

可以在 bridge 网络模式下访问相同的服务,因为在此模式下,docker 操纵 iptables 规则以提供对容器的访问。更多信息 here.

在您的特定情况下,docker 添加 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。您必须自己添加规则。

希望对您有所帮助。