在《Docker入门概述》中,提到容器能够在一个松散隔离环境中执行打包的应用程序。这个环境称为容器,这种隔离和安全性允许在宿主机上同时执行许多容器。预设情况下,容器与其他容器以及宿主机相对隔离,容器将应用程序彼此隔离,并将底层基础架构隔离,同时为应用程序提供额外的保护层。另外,还提到容器和虚拟机器具有类似的资源隔离和分配优势,但它们之间功能不同,容器虚拟化了操作系统而不是硬件。容器更轻便,效率更高。
从上面的描述中,似乎容器之间只能独立执行,多个容器之间不能互相通讯。如果应用程序需要相互通讯,主机或外部网络该如何处理呢?
本文将简要介绍一下Docker的容器网络(Docker Container Networks)。
Docker容器(container)和服务(services)的强大和快速流行发展的原因之一,就是可以通过Docker的容器网络能将容器和容器、容器和非Docker容器服务连线在一起互相通讯。甚至Docker容器和服务都不需要知道它们是否是部署在Docker上还是其他平台上,它们之间的通讯都是无缝连线的。无论Docker主机执行环境是Linux,Windows还是两者兼而有之,都可以使用Docker以与平台无关的方式管理它们。
Docker容器网络模型
Docker网络架构建立在一组称为容器网络模型(CNM)的界面上。CNM的目标就是在各种基础设施间提供应用程序可移植性。由上图可以看出,在Docker Engine层之上的CNM由沙箱(Sandbox)、端点(Endpoint)和网络(Network)三个部分组成。这些组成部分都和操作系统和基础架构无关(容器虚拟化了操作系统而不是硬件),因此无论基础架构如何变化,应用程序层都不会受任何影响。
沙箱 :包含容器网络堆叠的配置。包括容器界面管理,路由表和DNS设定。沙箱执行Linux网络名称空间。沙箱可以包含来自多个网络的不同端点。
端点 :端点将沙箱连线到网络。端点从应用程序中抽象出与网络的实际连线,这样有助于服务可以使用不同型别的网络驱动程式(Network Driver)保持可移植性,从而无需关心如何连线到网络。
网络:CNM没有根据OSI模型指定网络。网络的实现可以是Linux网桥、VLAN等。网络是端点之间连线的集合地(可以认为是端点构成的局域网)。没有连线到网络的端点将不能访问在网络上其他端点。
CNM驱动程式界面
容器网络模型CNM提供两个可插拔的开放驱动程式:网络驱动(Network Drivers)和IPAM驱动(IPAM Drivers)。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 或第三方供应商处获得。