Docker 网络
一、简介
Docker 网络架构源自于一种叫做容器网络模型(CNM)的方案,该方案是开源的并且支持插接式连接。Libnetwork 是Docker对CNM的一种实现吗,提供了Docker核心网络架构的全部功能,不同的驱动可以通过插拔的方式接入Libnetwork来提供定制化的网络拓扑。
为了实现开箱即用的效果,Docker封装了一系列本地驱动,覆盖了大部分常见的网络需求。其中包括单机桥接网络(Single-Hose Bridge Network)、多机覆盖网络(Multi-Host Overlay),并且支持接入现有VLAN。
二、基础理论
Docker 网络架构由3个主要部分构成:CNM、Libnetwork和驱动。
CNM是设计标准。在CNM中,规定了Docker网络架构的基础组成要素。
CNM 定义了3个基本要素:沙盒、终端和网络
沙盒:是一个独立的网络栈。其中包括以太网接口、终端、路由表以及DNS配置。
终端:就是虚拟网络接口。
网络:是802.1d网桥的软件实现。
Libnetwork 是CNM的具体实现,并且被Docker采用。Libnetwork通过Go语言编写,并实现CNM中列举的核心组件。
驱动通过实现特定网络拓扑的方式来拓展该模型的能力。
-
单机桥接网络
单机:意味着该网络只能在单个Docker主机上运行,并且只能与所在Docker主机上的容器进行连接 桥接:意味着这是802.1.d桥接的一种实现(二层交换机)
在linux Docker主机之上,默认的"bridge"网络被映射到内核中为"docker0"的linux 网桥。
[root@localhost ~]# docker network inspect bridge | grep bridge.name "com.docker.network.bridge.name": "docker0",
使用
docker network create
命令创建新的单机桥接网络,名为:“localnet”docker network create -d bridge localnet
创建成功之后会出现在
docker network ls
命令的输出内容总,还会在主机内核中创建一个新的Linux网桥。[root@localhost ~]# brctl show bridge name bridge id STP enabled interfaces br-509626cdf043 8000.0242723de637 no docker0 8000.024269f06e58 no veth9a5266b
第一个网桥(br-509626cdf043)与新建的"localnet" Docker 桥接我网络相对应。当前网桥没有接入任何设备(对应的interface为空)
创建一个新的容器,并且接入到这个新的网桥中(localnet)。
docker run -d --name c1 --network localnet alpine sleep 1d
再次运行
brctl show
命令,可以看到 c1 的网络接口连接到 br-509626cdf043 网桥。[root@localhost ~]# brctl show bridge name bridge id STP enabled interfaces br-509626cdf043 8000.0242723de637 no veth1ebd250 docker0 8000.024269f06e58 no veth9a5266b
如果在相同网络中继续接入新的容器,那么在新接入容器中可以通过容器名称来ping通的。这是因为新容器都注册到了指定的Docker
DNS 服务,所以相同网络中的容器可以解析其他容器的名称。
注:Linux 上默认的Bridge网络是不支持通过Docker DNS 服务进行域名解析的。自定义桥接网络可以!
这里提到的桥接网络中的容器只能位于相同网络中的容器进行通讯,但是可以使用端口映射来绕开这个限制。
-
多机覆盖网络
覆盖网络适用于多机环境,它允许单个网络包含多个主机,这样不同主机上的容器间就可以在链路层实现通信。
覆盖网络是理想的容器间通讯方式,支持完全容器化的应用,并且具备良好的伸缩性。
Docker 为覆盖网络提供了本地驱动,这使得创建覆盖网络非常简单,只需要在
docker network create
命令中添加-d overlay
参数。 -
接入现有网络
应中已容器化的部分需要与那些运行在物理网络和VLAN上的未容器化的部分进行通信,这就需要使用到----Macvlan驱动
Docker 内置的Macvlan驱动可以为容器提供MAC和IP地址。
Docker 内置的Macvlan驱动可以为容器提供MAC和IP地址。
Macvlan的优点是性能优异,因为无须端口映射或者额外桥接,可以直接通过主机接口(或者子接口)访问容器接口。但是Macvlan的缺点是需要将主机网卡(NIC)设置为混杂模式,这在大部分公有云平台是不允许的。
下面创建一个名为
macvlan100
的Macvlan网络:docker network create -d macvlan --subnet=10.0.0.0/24 --ip-range=10.0.0.0/25 --gateway=10.0.0.1 -o parent=docker0.100 macvlan100
该网络会连接到VLAN 100,该命令会创建 macvlan100 网络以及 docker0.100 子接口。
通过
--ip-range
参数告知Macvlan网络在子网中有哪些IP地址可以分配给容器。这些地址必须被保留,不能用于其他节点或者DHCP服务器,因为没有任何管理层功能来检查IP区域重合问题。下面将容器部署到该网络(macvlan100)
docker run -d --name mactainer1 --network macvlan100 alpine sleep 1d
mactainer1容器可以ping通任何加入VLAN 100 的系统,并进行通信。
三、 服务发现
服务发现允许容器和Swarm服务通过名称互相定位,唯一的要求就是需要处于同一个网络当中。
其底层实现就是利用Docker内置的DNS服务器,为每一个容器提供DNS解析功能。
用户可以为Swarm服务和独立容器进行自定义的DNS配置,--dns
参数允许指定自定义的DNS服务列表,以防出现内置的Docker DNS服务器解析失败的情况。此外还可以使用 --dns-search
参数指定自定义查询时所使用的的域名。
四、Ingress 网络
Swarm 支持两种服务发布模式,两种模式均保证服务从集群外可访问。
- Ingress 模式(默认)
- Host 模式
通过Ingress模式发布的服务,可以保证从Swarm集群内任意一节点都能访问该服务;以Host模式发布的服务只能通过运行服务副本的节点来访问。