如何使用docker-compose v2加入默认桥接网络?

72
我试图设置一个nginx-proxy容器,通过子域名在端口80上访问我的其他容器,而不是特殊端口。可以想象,我无法使其工作。
我对docker本身有点陌生,并发现编写docker-compose.yml文件更加舒适,因此我不必经常编写冗长的docker run ...命令。我认为启动容器的方式没有区别,无论是使用docker还是docker-compose。但是,我注意到一个区别是使用docker启动容器不会创建任何新网络,但是使用docker-compose后,之后会有一个xxx_default网络。
我读到说不同网络上的容器无法相互访问,也许这就是nginx-proxy未将请求转发到其他容器的原因。然而,我无法找到一种方法来配置我的docker-compose.yml文件,以便不创建任何新网络,而是像docker run一样加入默认桥接网络。
我尝试了以下操作,但出现错误提示说我不能以这种方式加入系统网络:
networks:
  default:
    external:
      name: bridge

我也尝试过 network_mode: bridge,但好像没有什么区别。
我应该如何编写 docker-compose.yml 文件以不创建新网络,或者根本不可能?
奖励问题:除了我应该知道的 dockerdocker-compose 之间的其他差异吗?

v1格式的Compose文件不会创建新的网络,但需要设置“links”才能与默认桥接上其他容器进行通信。 - Matt
1
v1即将被弃用,应避免使用。 - Rawkode
是的,我正在使用版本2格式。谢谢提示。 - noone
我只是在版本3中使用了那个语法,它可以正常工作。 我没有使用默认的桥接方式,而是使用了另一个由另一个包含nginx的docker-compose.yml创建的桥接方式。剩下的问题是带有下划线的主机名。 - U.V.
1个回答

131

在您的docker-compose.yml文件中添加network_mode: bridge到每个服务,将会阻止compose创建一个网络。

如果任何服务未配置此桥接(或主机)模式,将会创建一个网络。

已经测试并确认适用于:

version: "2.1"

services:
  app:
    image: ubuntu:latest
    network_mode: bridge

3
这会破坏发现机制。因此,如果您有超过1个需要相互通信的容器,它将无法正常工作。 - John Eikenberry
3
虽然这可能会使发现过程变得棘手,但并不会破坏它。用户仍然可以在撰写邮件时使用链接语法。 - Rawkode
Docker堆栈不支持network_mode,是否有类似的解决方案可以让它们正常工作? - Micah Zoltu
Docker Swarm 已经落败。Kubernetes 获胜了。我的建议?仅在开发中使用 docker-compose.yml,坚持使用 version: 2.4 并忘记 3 的存在 :+1: - Rawkode
docker stack deploy中,您可以在networks段落中将网络标记为external,以实现与docker-compose中相同的功能。 - Brady
1
请注意,加入默认桥接器将破坏容器名称的DNS解析。因此,例如 ping app 将停止工作。 - rustyx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接