docker BRIDGE和HOST驱动程序之间的区别是什么?

24

你能否给我一个指南或图表来理解这个差异?

我问这个问题的原因是我不能用以下方法打开网站:

docker network create -d bridge mybridge 
docker run -d --net mybridge --name db redis 
docker run -d --net mybridge -e DB=db -p 8000:5000 --name web chrch/web 

但我可以通过以下方法打开网站:

docker run --rm -d --network host --name my_nginx nginx

我使用谷歌云平台的虚拟机实例,并自己安装了Docker。

3个回答

26
根据docker桥接网络文档

Docker中,桥接网络使用软件桥接,使连接到同一桥接网络的容器可以进行通信,同时与未连接到该桥接网络的容器隔离。

根据docker主机网络文档

如果为容器使用主机网络驱动程序,则该容器的网络堆栈与Docker主机不隔离。例如,如果运行绑定到端口80的容器并且使用主机网络,则容器的应用程序将在主机的IP地址上的端口80上可用。

如果要部署多个互连的容器并建立一个私有内部网络,请使用桥接网络。如果要部署连接到主机相同网络堆栈的容器(并访问与主机相同的网络),请使用主机网络。如果只想发布一些端口,请使用--publish-p选项运行容器,例如-p 8080:80

主机防火墙规则怎么样?主机是否在防火墙后面,而桥接不是,还是反之亦然,或者两者都忽略主机防火墙? - Pawel Cioch

13
在你的第一个例子中,我期望应用程序可通过主机IP地址和端口8000(重新映射后的端口)访问,在第二个例子中则是端口5000(使用主机网络时没有重新映射选项)。如果有某种配置或防火墙问题导致无法正常工作,则应该解决该问题,而不是使用--net host进行“魔改”。
桥接网络是Docker的标准网络模式。如果可能的话,您应该首选它。令人困惑的是,它有两种不同的模式,但您展示的形式采用显式的docker network create,这是最佳实践,如果可能的话,您应该使用它。使用主机网络将完全禁用Docker的网络隔离。这意味着容器可以看到并使用主机可用的完全相同的网络接口,而不需要中间的NAT层。使用桥接网络,需要使用 docker run -p 选项才能使Docker外部可见特定端口。作为操作员,您可以重新映射端口,在多主机系统上绑定到特定接口,或者根本拒绝将服务显示给其他主机。显式的 docker network create 表单允许容器使用其 docker run --name 作为主机名相互连接。如果在同一主机上运行多个应用程序堆栈,可以通过使用不同的网络从彼此部分隔离开来。每个容器都有自己独立的网络空间,localhost 意味着“此容器”。这种模式也是进入像Docker Swarm或Kubernetes这样的多主机系统的网络模型的简单步骤。
使用主机网络,则以上所有内容均不适用;无法使用 docker run --net host -p ...,并且没有选择将端口暴露在何处或如何暴露。除非它们配置了自己发布端口,否则无法访问其他容器。由于使用了主机的网络,localhost 的意思是主机自身的视图。尽管在Stack Overflow的答案中经常建议使用--net host,但实际上很少需要。我能想到的两种情况是,对于需要查询主机网络堆栈的服务(例如,像Consul这样的服务发现系统需要知道主机监听的每个端口以进行广告宣传),或者对于具有大量或不一致端口集的服务。如果你正在使用--net host,因为在应用程序中硬编码了localhost,那么最好将其设置为可配置项。

1
特性 桥接网络 主机网络
驱动程序 桥接网络由桥接驱动程序提供 主机网络由主机驱动程序提供。
默认值 桥接是默认网络,由桥接驱动程序提供 主机没有默认值。
连通性 桥接驱动程序为在同一台机器上运行的所有容器提供互联性。 主机驱动程序指示Docker不要为附加的容器创建任何特殊的网络命名空间或资源。

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