本地网络模式
docker提供了四种网络模式
docker run创建Docker容器时,可以用--net选项指定容器的网络模式
默认网络模式-bridge
无网络模式-none
所有加入到这个网络模式中的container,都"不能”进行网络通信
- 宿主网络模式-host
网络模式将container与宿主机的网络相连通,虽然很直接,但是却破获了container的隔离性
- 自定义网络-overlay
背景:
在docker 1.12之前时依靠第三方工具(etcd,consul,zookeeper)以k-v键值对方式存储 实现服务发现和DNS解析;
在docker 1.12 之后用自带 docker swarm来实现 “服务发现”和“DNS解析”
场景:
当我们在多个主机运行容器并且之间相互协同工作时,就选择Overlay模式
默认网络类型bridge
Docker设计的NAT网络模型
docker daemon启动时会自动创建一个Linux网桥(默认docker0 -b参数指定).
容器启动时,会创建一个veth pair(virtual eth pair)虚拟网络接口设备。
veth设备的特点是成对出现,数据出现在一端时,在另一端也会出现。Docker会将一端挂载到docker0网桥上,另一端放入容器的Network Namespace内,从而实现容器与主机通信的目的。bridge模式下的网络拓扑图如下图所示
总之,Docker网络的初始化动作包括:创建docker0网桥、为docker0网桥新建子网及路由、创建相应的iptables规则等。
跨主机模式通信
docker在跨主机网络通信采用CNM(容器网络模型)和CNI(容器网络接口)。而k8s和docker的通信采用的是CNI
CNM模式
libnetwork是CNM的原生实现,为docker daemon和网络驱动程序之间提供了接口。
网络驱动
- 按照提供方可以分为原生驱动(libnetwork内置的或者docker支持的)和第三方驱动
- 按照使用范围分为本地(单主机)和全局(多主机)
- network sandbox 容器内部的网络栈
- endpoint 一个通常成对出现的网络接口。一端在网络容器内,另一端在网络内。 一个Endpoints可以加入一个网络。一个容器可以有多个endpoints。
- network 一个endpoints的集合。该集合内的所有endpoints可以互联互通
CNI模式
CNI(Conteinre Network Interface) 是 google 和 CoreOS 主导制定的容器网络标准,是一个协议。综合考虑了扩展性、ip 分配、多网卡。
协议连接了两个组件:容器管理系统和网络插件。它们之间通过 JSON 格式的文件进行通信,实现容器的网络功能。具体的事情都是插件来实现的,包括:创建容器网络空间(network namespace)、把网络接口(interface)放到对应的网络空间、给网络接口分配 IP 等等。