如何从外部IP访问以network_mode:“host”运行docker的服务

Hie*_* Le 5 port docker docker-compose

我的场景:

我有一个 IP xxxx 的服务器,在上面运行 MongoDB 实例。docker-compose.yml我还使用如下文件构建我的服务

version: "3" 
services:  
   myApp:
    image: myApplication
    ports:
      - "8080:8080"
    environment:
      SPRING_DATA_MONGODB_URI: mongodb://localhost:27017/myAppDb
Run Code Online (Sandbox Code Playgroud)

当我运行docker-compose up启动容器时,我可以通过 xxxx:8080 从我的计算机访问我的服务

但问题是我的服务无法连接到 localhost:27017 处的 mongoDB,因为它们不在同一网络上。因此,我将该选项添加network_mode: "host"到我的 docker-compose 文件中。它解决了问题,我的服务可以连接到我的服务器上运行的 mongoDB。但是,我无法再通过 xxxx:8080 访问我的服务

我的问题:

我如何仍然可以使用该选项通过 xxxx:80 连接到我的服务network_mode: "host"?或者有什么方法可以让我不需要使用该选项,但我的服务仍然可以连接到 mongoDB 实例?

注意: MongoDB 实例以传统方式安装(yum install mongodb-org),并设置为只能通过 localhost:27017(或 127.0.0.1:27107)访问。我不知道为什么或如何,但事实就是如此,所以我无法将连接字符串更改为 mongodb://xxxx:27017。它就是行不通。

我还知道我可以将 mongodb 添加为文件中的服务docker-compose来实现我的目标,但我不想这样做,因为就我而言,最好单独管理数据库。

b0g*_*usb 0

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

可以通过网络模式访问相同的服务bridge,因为在该模式下,docker 操纵iptables规则来提供对容器的访问。更多信息请点击这里

8080在您的特定情况下,docker 添加一条 NAT 规则,将主机端口上的传入流量转发到8080容器上的端口。执行中iptables

iptables -t nat -L
Run Code Online (Sandbox Code Playgroud)

应该输出规则:

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 
Run Code Online (Sandbox Code Playgroud)

其中172.17.0.2IP容器的。

问题在于host发布端口被丢弃并且 docker 没有添加任何规则来允许传入流量通过 port 的模式8080。您必须自己添加规则。

希望能帮助到你。