基本网络配置
Linux平台下,Docker容器网络资源通过内核的Network Namespace机制实现隔离,不同的Network Namespace 有各自的网络设备、协议栈、路由表、防火墙规则等,反之,同一Network Namespace下的进程共享同一网络视图。
网络驱动
Docker网络中使用Libnetwork的容器网络模型定义类标准的API用于容器配置网络,其底层还可以适配各种网络驱动。
Libnetwork使得Dockers具备跨主机多子网的能力,同一个子网内不同容器可以运行在不同主机上。
Libnetwork实现了五种驱动:
- null:空配置,用户自己给容器配置网络和路由。
- remote:Docker网络插件的实现,使得Libnetwork可以通过HTTP RESTful API对接第三方网络方案。
- host:容器与主机共享同一Network Namespace,共享同一套网络协议栈、路由表以及防火墙规则。
- bridge:Docker默认的容器网络驱动。有点像Linux Bridge,一种虚拟交换机技术。
- overlay:Docker原生的跨主机多子网网络方案。主要通过Linux bridge和vxlan隧道实现。
Docker的网络模式
在运行容器的时候,可以通过--net标签进行修改网络模式。通过对Network Namespace的操作,Docker提供五种容器网络模式:
- none:不为容器配置任何网络功能。
- container:与另一个运行中的容器共享Network Namespace,共享相同的网络视图。
- host:与主机共享Network Namespace,容器有完整的权限可以操纵主机的协议栈、路由表和防火墙,所以是不安全的。
- bridge:Dokcer设计的NAT网络模型。Docker Daemon启动时会在主机创建一个Linux网桥,容器启动时,Docker会创建一堆veth pair设备,一端连在容器的Network Namespace上,另一端连载网桥上,从而实现网桥上的容器都能通信。
- overlay:Docker原生的跨主机多子网模型。
Docker Bridge 网络拓扑图图:
overlay模式网络拓扑图:
所谓沙盒,就是一个隔离的网络运行环境,保存了容器网络栈的配置,包括对网络接口、路由表和DNS配置的管理。
跨主机多子网
Open vSwitch
OpenvSwitch,简称OVS是一个虚拟交换软件,主要用于虚拟机VM环境,作为一个虚拟交换机,支持Xen/XenServer, KVM, and VirtualBox多种虚拟化技术。OpenvSwitch还支持多个物理机的分布式环境。
一个虚拟交换机(vswitch)主要有如下两个作用:
- 传递虚拟机VM之间的流量
- 以及实现VM和外界网络的通信。
可以用OpenvSwitch替换Docker默认的网桥,然后再OVS网桥上添加VXLAN端口实现跨主机通信。
Flannel
Flannel是一种开源的Docker SDN网络解决方案,这样我们就不需要通过ip命令手动配置网络,不用把网桥一个个连接在一起。
Flannel的使用依赖于Etcd,而Etcd时一种开源的K-V存储及服务发现程序,在集群中可用于不同主机之间交换配置、状态信息等。
Flannel也用于Kuberntes中的网络方案。