docker BRIDGE和HOST模式之间有什么区别?

时间:2019-06-30 13:35:46

标签: docker google-cloud-platform

您能给我一个指南或图表来了解它们的区别吗?

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

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

我使用Google Cloud Platform VM实例并自己安装docker。

2 个答案:

答案 0 :(得分:4)

根据docker documentation about bridge networking

  

就Docker而言,网桥网络使用软件网桥,该软件网桥允许连接到同一网桥网络的容器进行通信,同时与未连接到该网桥网络的容器隔离。

根据docker documentation about host networking

  

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

如果要部署使用私有内部网络在它们之间连接的多个容器,请使用网桥网络。如果要部署与主机连接到同一网络堆栈的容器(并访问与主机相同的网络),请使用主机网络。如果您只是想publish some ports,请使用--port-p选项(例如-p 8080:80)运行容器。

答案 1 :(得分:2)

在您的第一个示例中,我希望可以通过主机的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表示主机本身的视图。

对于SO答案中经常推荐的所有内容,--net host几乎没有必要。我能想到的两种情况是用于需要查询主机网络堆栈的服务(例如,像Consul这样的服务发现系统需要知道主机正在侦听的每个端口以进行通告)或用于服务使用的端口集较大或不一致。如果您使用--net host是因为您已在应用程序中对localhost进行了硬编码,那么最好将其设为可配置。.