容器的网络模型
Docker
的网络架构是构建在一组称为容器网络模型(CNM)的接口之上的。这个CNM的原理是为了提供多种不同的基础系统架构的应用程可用性。
最初的容器网络设计只关注如何在单个主机上运行容器并使他们可以从网络访问;在host
模式下,容器在主机的Network Namespace
中运行并使用主机IP地址,暴露容器端口在主机外面,容器会使用主机的端口。
这个bridge
模式对host
模式进行了改进,在Bridge
模式下,容器通过IPAM
IP地址管理模块来提供IP,从它自己的网络空间中获取自己的网络IP,此时容器有自己的网络命名空间,不会出现端口冲突,但是容器如果要暴露服务在主机外部,仍然需要使用主机IP。该技术是使用的NAT
网络地址转换实现的,在主机IP:主机端口和容器IP:容器端口之间进行映射,这些转换规则是使用iptables
实现的,这种实现限制了解决方案的规模和性能。此方案并没有解决多主机的容器网络通信问题。
CNM 结构
上图是CNM
中的几个高级结构,他们都是和'OS
无关的。
- Sandbox:沙箱包含网络容器的配置,这包括管理容器的接口,路由表和
DNS
配置,沙箱是通过Linux
的命名空间实现的。一个容器就是一个沙箱盒子。 - Endpoint:一个
Endpoint
连接一个沙箱和一个网络。 - Network:
CNM
没有根据OSI
模型指定网络,
CNM 驱动接口
这个CNM模型提供了两个插件和开放接口提供给用户使用,可以使用他们它们来对网络的功能进行控制。
网络驱动的类型
- 网络驱动程序:
Docker
网络驱动程序是网络功能的实现,它们是可拔插的,因此可以使用不同的驱动程序提供给不通的应用使用,在集群中可以使用多个网络驱动器,但是单个Docker
网络只能通过单个网络驱动程序实现,有两种类型的CNM网络驱动程序。 -
- 内置网络驱动程序:
Docker
引擎内置了几种网络驱动程序,比如,网络驱动,overlay 驱动。
- 内置网络驱动程序:
-
- 插件网络驱动程序:是由社区或者其他供应商提供的,用于与现有软件和硬件的提成,用户还可以自己实现。
- IPAM 驱动:
Docker
有内置的IP
地址管理器,如果未指定,则使用默认的子网和网络,用户也可指定子网和网关。
Docker内置网络驱动程序
Docker
内置网络驱动程序是引擎的一部分,不需要任何其他模块,通过使用docker network
命令来创建和使用网络模块。
- Bridge:
Bridge
驱动程序在宿主机上创建Linux
网桥,网桥上的容器默认可以通信,也可以配置对容器的外部访问。 - Overlay:
overlay
驱动程序在宿主机上创建一个覆盖网络,支持开箱即用的多主机网络,通过使用linux
网桥和VXLAN
让宿主机上物理网络来实现容器到容器的多主机通信。 - MACVLAN:
macvlan
驱动程序使用macvlan
桥接模式在容器和宿主机之间建立连接。 - Host:使用
host
驱动程序,容器将使用宿主机的网络栈,主机上的所有接口都可以由容器使用。 - None:
none
驱动程序为容器提供自己的网络堆栈和命名空间,但不配置接口,如果没有其他配置,容器将于宿主机网络完全隔离。
默认情况下一个Docker
主机上有none
,bridge
,host
三种网络驱动程序,这些网络程序不能被删除,当使用Swarm
时,会添加两个网络,一个是叫docker_gwbridge
的bridge
网络,还有一个是叫ingress
的overlay
的网络程序,这两个网络是自动创建在整个集群中的。
Linux 网络原理
名词解释
网络命名空间。
网络地址转换,这是一种网络虚拟化的技术,是为了解决IP不够用的问题。
IP地址管理,对应于CNM模型中的IPAM模块,提供IP管理和生成。