在《Docker入门概述》中,提到容器能够在一个松散隔离环境中运行打包的应用程序。这个环境称为容器,这种隔离和安全性允许在宿主机上同时运行许多容器。默认情况下,容器与其他容器以及宿主机相对隔离,容器将应用程序彼此隔离,并将底层基础架构隔离,同时为应用程序提供额外的保护层。另外,还提到容器和虚拟机具有类似的资源隔离和分配优势,但它们之间功能不同,容器虚拟化了操作系统而不是硬件。容器更轻便,效率更高。
从上面的描述中,似乎容器之间只能独立运行,多个容器之间不能互相通信。如果应用程序需要相互通信,主机或外部网络该如何处理呢?
本文将简要介绍一下Docker的容器网络(Docker Container Networks)。
Docker容器(container)和服务(services)的强大和快速流行发展的原因之一,就是可以通过Docker的容器网络能将容器和容器、容器和非Docker容器服务连接在一起互相通信。甚至Docker容器和服务都不需要知道它们是否是部署在Docker上还是其他平台上,它们之间的通信都是无缝连接的。无论Docker主机运行环境是Linux,Windows还是两者兼而有之,都可以使用Docker以与平台无关的方式管理它们。
Docker容器网络模型
Docker网络架构建立在一组称为容器网络模型(CNM)的接口上。CNM的目标就是在各种基础设施间提供应用程序可移植性。
![85a9b365463be0edd00dffe18039c0eb.png](https://i-blog.csdnimg.cn/blog_migrate/f93e0a68b61558390a335b98a771eb09.jpeg)
由上图可以看出,在Docker Engine层之上的CNM由沙箱(Sandbox)、端点(Endpoint)和网络(Network)三个部分组成。这些组成部分都和操作系统和基础架构无关(容器虚拟化了操作系统而不是硬件),因此无论基础架构如何变化,应用程序层都不会受任何影响。
沙箱 :包含容器网络堆栈的配置。包括容器接口管理,路由表和DNS设置。沙箱执行Linux网络命名空间。沙箱可以包含来自多个网络的不同端点。
端点 :端点将沙箱连接到网络。端点从应用程序中抽象出与网络的实际连接,这样有助于服务可以使用不同类型的网络驱动程序(Network Driver)保持可移植性,从而无需关心如何连接到网络。
网络:CNM没有根据OSI模型指定网络。网络的实现可以是Linux网桥、VLAN等。网络是端点之间连接的集合地(可以认为是端点构成的局域网)。没有连接到网络的端点将不能访问在网络上其他端点。
CNM驱动程序接口
容器网络模型CNM提供两个可插拔的开放驱动程序:网络驱动(Network Drivers)和IPAM驱动(IPAM Drivers)。
![55ef87af18d9b6170c8af36e6e13d000.png](https://i-blog.csdnimg.cn/blog_migrate/f7878a684fb5235ab87baabb1b3216ee.jpeg)
1. 网络驱动:Docker网络驱动程序保证网络正常使用。由于可插拔,可以使用不同的驱动程序并轻松互换以支持不同的网络。可以在Docker引擎或集群上同时使用多个不同网络驱动程序,但每个Docker网络仅通过单个网络驱动程序进行实例化。
网络驱动程序有两种类型:
1.1原生网络驱动程序(Native Network Drivers)
原生网络驱动程序是Docker引擎的一部分,有多种驱动程序并支持不同的功能,如覆盖网络(overlay )或原生网桥(bridges)。
1.2远程网络驱动程序(Remote Network Drivers)
远程网络驱动程序是Docker社区和其他供应商等第三方提供创建的网络驱动程序。这些驱动程序可用于提供与现有软件和硬件的集成。用户还可以在需要现有网络驱动程序不支持的特定功能的情况下创建自己的驱动程序。
2. IPAM驱动:Docker具有原生IP地址管理驱动程序,默认情况下,如果容器没有指定网络IP地址,则Docker为网络和端点提供默认子网或IP地址。也可以通过网络,容器和服务创建命令手动分配IP地址。远程IPAM驱动程序也存在,并提供与现有IPAM工具的集成。
Docker网络驱动程序
Docker原生网络驱动程序是Docker Engine的一部分,不需要增加任何额外的模块。可以通过标准docker network命令调用和使用。原生网络驱动程序包括:
- bridge:容器默认的网络驱动程序。一般用于需要和其他容器或服务通信时。
- overlay:覆盖网络用于集群服务之间能够相互通信。群集服务和独立容器之间的通信以 及在不同Docker守护进程上的两个独立容器之间进行通信。
- macvlan:为容器分配MAC地址, Docker守护进程通过MAC地址访问容器。
- none:对容器禁用所有网络。通常与自定义网络驱动程序一起使用。none不适用于群组服务。
另外,Docker还支持如下网络驱动程序:
- host:宿主机网络驱动,对于独立容器不需要容器和Docker主机之间的网络隔离时,直 接使用主机的网络。host 仅适用于Docker 17.06及更高版本的swarm服务。
- 网络插件:Docker可以安装和使用第三方网络插件。这些插件可从 Docker Hub 或第三方供应商处获得。
如何选择网络驱动
- 当需要多个容器在同一个Docker主机上进行通信时,用户定义的桥接网络(bridge)是最佳选择。
- 当网络堆栈不应与Docker主机隔离时,主机网络(host)是最好的,但您希望隔离容器的其他方面。
- 当需要在不同Docker主机上运行的容器进行通信时,或者当多个应用程序使用swarm服务协同工作时,覆盖网络(overlay)是最佳选择。
- 当从VM设置迁移或需要容器看起来像网络上的物理主机时,Macvlan网络是最佳的,每个主机都具有唯一的MAC地址。
- 第三方网络插件将Docker与专用网络堆栈集成。
今天的分享就到这里,欢迎大家关注、收藏、转发、评论。谢谢大家支持!