在最近的版本中,docker-compose
会自动为它创建的服务创建一个新的网络。基本上,每个 docker-compose
设置都有自己的 IP 范围,所以理论上我可以使用预定义的端口在网络的 IP 地址上调用我的服务。这在同时开发多个项目时非常好,因为这样就不需要更改 docker-compose.yml
中的端口(也就是说,我可以在不同接口的端口8080上同时运行多个 nginx
项目)
但是,这并不按预期的方式工作: 每个暴露的端口仍然在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上,即在127.0.0.1上,在 WAN 地址上,在缺省桥上(172.17.0.0.16) ,也暴露在172.18.0.0.16上。在这种情况下,我可以访问 $WAN_IP:8080
上所有127.0.0.1:8080.172.17.0.1:8080.172.18.0.1:8080和 als 的应用服务器。如果我现在启动第二个应用程序,它将启动第二个网络 app2_network
172.19.0.0/16,但仍然尝试绑定所有接口上的每个公开端口。这些端口当然已经被占用了(172.19.0.1除外)。如果有可能将每个应用程序限制在其网络中,那么应用程序1将在172.18.0.1:8080和172.19.0.1:8080处可用,而且我不需要将端口映射分别更改为8081和3307来同时运行这两个应用程序。