gpt4 book ai didi

docker - 如何使用 network_mode : "host" from external IP 访问运行 docker 的服务

转载 作者:行者123 更新时间:2023-12-02 19:57:38 30 4
gpt4 key购买 nike

我的场景:

我有一个 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 访问我的服务

我的问题:

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

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

我也知道我可以在 docker-compose 中添加 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.2IP的容器。

问题出在 host丢弃发布端口并且 docker 不添加任何规则以允许通过端口 8080 传入流量的模式.您必须自己添加规则。

希望能帮助到你。

关于docker - 如何使用 network_mode : "host" from external IP 访问运行 docker 的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56810682/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com