如何让 docker-compose 仅在定义的网络而不是 0.0.0.0 上绑定容器?

新手上路,请多包涵

在最近的版本 docker-compose 自动为其创建的服务创建一个新网络。基本上,每个 docker-compose 设置都有自己的 IP 范围,因此理论上我可以使用预定义的端口在网络 IP 地址上调用我的服务。这在同时开发多个项目时非常有用,因为不需要更改 docker-compose.yml 中的端口(即我可以在端口上同时运行多个 nginx 项目8080 在不同的接口上)

但是,这并没有按预期工作:每个暴露的端口仍然暴露在 0.0.0.0 上,因此与多个项目存在端口冲突。可以将绑定 IP 放入 docker-compose.yml ,但是这是可移植性的杀手 - 并非团队中的每个开发人员都使用相同的操作系统或从事相同的项目,因此不清楚哪个 IP配置。

根据为这个特定项目创建的网络定义将容器绑定到的 IP 非常好。 docker-compose 应该都知道它创建了哪个网络以及它的IP,所以这应该不是问题,但是我找不到简单的方法来做到这一点。有没有办法或者这还没有实现?

编辑:端口冲突的示例:想象两个项目,每个项目都有一个运行在端口 8080 上的应用程序服务器和一个运行在端口 3306 上的 MySQL 数据库,它们分别公开为“8080:8080”和“3306:3306”。使用 docker-compose 运行第一个网络会创建一个名为 app1_network 的网络,其 IP 范围为 172.18.0.0/16。每个暴露的端口都暴露在 0.0.0.0 上,即 127.0.0.1 上、WAN 地址上、默认网桥 (172.17.0.0/16) 上以及 172.18.0.0/16 上。在这种情况下,我可以访问 127.0.0.1:8080、172.17.0.1:8080、172.18.0.1:8080 和 $WAN_IP:8080 上的所有应用程序服务器。如果我现在启动第二个应用程序,它会启动第二个网络 app2_network 172.19.0.0/16,但仍会尝试绑定所有接口上的每个公开端口。这些端口当然已经被占用(172.19.0.1 除外)。如果有可能将每个应用程序限制在其网络中,应用程序 1 将在 172.18.0.1:8080 可用,第二个在 172.19.0.1:8080 可用,我不需要将端口映射分别更改为 8081 和 3307同时运行两个应用程序。

原文由 Nikolai Prokoschenko 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
1 个回答

在您的服务配置中,在 docker-compose.yml 中:

 ports:
 - "127.0.0.1:8001:8001"

参考: https ://github.com/compose-spec/compose-spec/blob/master/spec.md#ports

原文由 Mohammed Noureldin 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进