一、网络模式
1.bridge模式
该桥接模式下,允许连接到同一桥接网络的容器进行通信,同时与未连接到该桥接网络的容器隔离。Docker网桥驱动程序会自动在主机中安装规则,以此来使不同桥接网络上的容器无法直接相互通信。 启动Docker时,会自动创建一个默认的桥接网络(也称为bridge),并且除非另有说明,否则新启动的容器将连接到默认桥接网络。也可以自定义桥接网络。自定义桥接网络优于默认的bridge网络。
1.1 自定义桥接网络和默认桥接网络区别
- 自定义桥接可在容器之间提供自动DNS解析。
默认桥接网络上的容器只能通过IP地址相互访问(--link方式除外,以后可能会废弃)。在用户定义的网桥网络上,容器可以通过名称或别名相互解析。
如果在默认网桥网络上运行相同的应用程序堆栈,则需要在容器之间手动创建链接(使用旧式--link 标志)。这些链接需要双向创建,如果要进行通信的容器超过两个,这将变得很复杂。或者操作/etc/hosts容器中的文件,但这会产生难以调试的问题。
- 用户定义的桥可提供更好的隔离。
所有没通过--network参数指定的容器都将连接到默认桥接网络。这可能是一种风险,因为不相关的堆栈/服务/容器随后能够进行通信。
使用自定义桥接网络可提供作用域网络,其中只有连接到该网络的容器才能通信。
- 容器可以随时随地从自定义的桥接网络连接和分离。
在容器的生存期内,您可以即时将其与用户定义的网络连接或断开连接。要从默认桥接网络中删除容器,您需要停止容器并使用其他网络选项重新创建它。
- 每个自定义的桥接网络都会创建一个可配置的网桥。
如果容器使用默认的桥接网络,则可以对其进行配置,但是所有容器都使用相同的设置,例如MTU和iptables规则。配置默认桥接网络发生在Docker本身之外,并且需要重新启动Docker。
通过docker network create命令创建和配置自定义桥接网络。如果不同的应用程序组需要不同的网络,则可以在创建时分别配置每个自定义的网桥。
- 默认网桥网络上的链接容器共享环境变量。
起初两个容器之间共享环境变量的唯一方法是使用--link flag链接它们。自定义桥接网络无法进行环境变量共享。但是在新版本中,可以使用其他方式实现环境变量共享:
1.通过Docker卷挂载共享信息的文件或目录实现多个容器之间的共享。
2.通过docker-compose配置多个容器,并且在文件中定义共享变量。
3.可以通过swarm service来替换单独的容器,可以实现共享秘钥和配置。
在同一自定义桥接网络中的容器会相互暴露端口。如果希望在不同网络下通过端口访问容器或者非宿主机,必须通过-p或--publish暴露该端口
注意:桥接模式适用于在同一Docker宿主机上的容器之间的通信
2.host模式
该模式下,禁止容器与Docker主机的网络隔离(该容器共享主机的网络名称空间,没有独立网络栈),容器不会分配IP地址,直接使用主机网络。
注意:由于直接使用主机的网络,容器和主机之间没有网络隔离(通过端口映射通信),所以知道主机ip和端口就等于知道容器ip和地址,所以容器就直接暴露在公共网络中,优点是性能好(不需要网络地址转换(NAT)),缺点是存在安全隐患,所以安全网络架构不建议使用。主机模式适用于不同Docker宿主机上的容器之间的通信
3. overlay模式
覆盖网络将多个Docker守护程序连接在一起,并使群集服务能够相互通信。您还可以使用覆盖网络来促进群集服务和独立容器之间或不同Docker守护程序上的两个独立容器之间的通信。这种策略消除了在这些容器之间进行操作系统级路由的需要。
4. macvlan模式
Macvlan网络允许您将MAC地址分配给容器,使其在网络上显示为物理设备。Docker守护程序通过其MAC地址将流量路由到容器。macvlan 在处理希望直接连接到物理网络而不是通过Docker主机的网络堆栈进行路由的旧应用程序时,使用驱动程序有时是最佳选择。
- none:对于此容器,请禁用所有联网。通常与自定义网络驱动程序一起使用。none不适用于群体服务。
- 网络插件:您可以在Docker上安装和使用第三方网络插件。这些插件可从 Docker Hub 或第三方供应商处获得。
二、建议
- 当希望多个容器在同一Docker主机上进行通信时,最好使用自定义的bridge桥接模式。
- 当网络堆栈不应与Docker主机隔离时,但您希望容器的其他方面隔离时,host主机网络是最佳选择。
- 当不同Docker主机上运行的容器需要进行通信时,或者当多个应用程序使用群服务一起工作时,overlay覆盖网络是最佳的。
- 从VM设置迁移或需要容器看起来像网络上的物理主机(每个主机都有唯一的MAC地址)时,Macvlan网络是最好的。