docker之网络管理

基础理论

在顶层设计中,Docker 网络架构由 3 个主要部分构成:CNM、Libnetwork 和驱动。

  • CNM 是设计标准。在 CNM 中,规定了 Docker 网络架构的基础组成要素。
  • Libnetwork 是 CNM 的具体实现,并且被 Docker 采用,Libnetwork 通过 Go 语言编写,并实现了 CNM 中列举的核心组件。
  • 驱动通过实现特定网络拓扑的方式来拓展该模型的能力。

下图展示了顶层设计中的每个部分是如何组装在一起的。

在这里插入图片描述

libnetwork(CNM)介绍

Docker 网络架构源自一种叫作容器网络模型(CNM)的方案,该方案是开源的并且支持插接式连接。

Libnetwork 是 Docker 对 CNM 的一种实现,提供了 Docker 核心网络架构的全部功能。不同的驱动可以通过插拔的方式接入 Libnetwork 来提供定制化的网络拓扑。

libnetwork是容器网络库,其核心内容是其定义的Container Network Model,这个模型对容器网络进行了抽象,由三个组件组成

在这里插入图片描述

  • Sandbox(沙盒)

    沙盒是一个隔离的网络运行环境,保存了容器网络栈的配置,包括了对网络接口、路由表和DNS的管理。在Linux平台上,Sandbox是用Linux Network Namespace实现的,Sandbox可以包含来自多个网络的多个Endpoint(端点)。

  • Endpoint

    Endpoint的作用是将Sandbox接入Network,Endpoint的典型实现是veth pair。一个Endpoint只能属于一个网络,也只能属于一个Sandbox。通过给沙盒增加多个Endpoint可以将沙盒加入多个网络

  • Network

    包含一组Endpoint,同一Network的Endpoint可以直接通信。Network的实现driver可以是Linux Bridge,VxLAN等。

veth pair介绍

在这里插入图片描述

veth-pair 就是一对的虚拟设备接口,和 tap/tun 设备不同的是,它都是成对出现的。一端连着协议栈,一端彼此相连着。它常常充当着一个桥梁,连接着各种虚拟网络设备,典型的例子像“两个 namespace 之间的连接”,“Bridge、OVS 之间的连接”,“Docker 容器之间的连接” 等等,以此构建出非常复杂的虚拟网络结构,比如 OpenStack Neutron。

网络驱动

Docker的网络子系统是可插拔的,使用驱动程序。默认情况下存在多个驱动程序,并提供核心网络功能:

  • bridge:Docker默认的容器网络驱动。Container通过一对veth pair连接到docker0网桥上,由Docker为容器分配IP及配置路由、防火墙规则等。
  • host:容器与主机共享同一Network Namespace,共享同一套网络协议栈、路由表及iptables规则等。容器与主机看到的是相同的网络视图。
  • null:容器内网络配置为空,需要用户收到为容器配置网络接口及路由等。
  • macvlan:Macvlan网络允许为容器分配MAC地址,使其显示为网络上的物理设备。Docker守护程序通过其MAC地址将流量路由到容器。macvlan在处理期望直接连接到物理网络的传统应用程序时,使用驱动程序有时是最佳选择,而不是通过Docker主机的网络堆栈进行路由。
  • overlay:overlay将多个Docker守护程序连接在一起,并使群集服务能够相互通信。overlay是Docker原生的跨主机多子网网络方案。主要通过使用Linux bridge和vxlan隧道实现,底层通过类似于etcd或consul的KV存储系统实现多机的信息同步。
  • remote:Docker网络插件的实现。Remote driver使得Libnerwork可以通过HTTP RESTful API对接第三方的网络方案,类似SockerPlane的SDN方案只有实现了约定的HTTP URL处理函数及底层的网络接口配置方法,就可以替换Docker原生的网络实现。

网络类型

1、none模式网络

使用–network =none指定,生成只包含环回口的容器,用于封闭场景

在这里插入图片描述

2、host模式网络

容器与主机共享Root Network Namespace,连接到host网络的容器共享host的网络栈,容器的配置与host完全一样,用于对网络性能要求高的场景。但是这种配置让容器有完整的权限可以操纵主机的协议、路由表和防火墙等,所以被认为是不安全的
在这里插入图片描述

3、bridge模式网络(默认模式)

Docker daemon启动时会在主机创建一个Linux网桥(默认为docker0,可通过-b参数手动指定)。容器启动时,Docker会创建一对veth pair(虚拟网络接口)设备,veth设备的特点是成对存在,从一端进入的数据会同时出现在另一端。Docker会将一端挂载到docker0网桥上,另一端放入容器的Network Namespace内,从而实现容器与主机通信的目的。
在这里插入图片描述

例子

在这里插入图片描述

此时我们可以在另一个终端看到docker0下多了一个接口,且容器和网桥处于同一网段
在这里插入图片描述

4、container模式网络

与另一个运行中的容器共享Network Namespace,共享相同的网络视图。

例子:

首先以默认网络配置(bridge模式)启动一个容器,设置hostname为dockerNet,dns为114.114.114.114
在这里插入图片描述

然后以–network=container:9bb方式启动另一个容器

在这里插入图片描述

可以看到,使用–net=container:9bb参数启动的容器,容器ip地址,dns,hostname都继承了容器9bb…,实质上两个容器是共享同一个Network Namespace的,自然网络配置也是完全相同的

5、user-defined模式网络

用户自定义模式主要可选的有三种网络驱动:bridge、overlay、macvlan。bridge驱动用于创建类似于前面提到的bridge网络;overlay和macvlan驱动用于创建跨主机的网络。

使用overlay实现的多host网络通信

overlay类型的网络的网络驱动器为overlay,overlay网络的实现是基于VXLAN的。overlay要正常使用需要内核版本>=3.16

什么是 VXLAN?

VXLAN(Virtual eXtensible Local Area Network,虚拟扩展局域网),是由IETF定义的NVO3(Network Virtualization over Layer 3)标准技术之一,本质上是一种隧道技术。通过将原始数据帧添加VXLAN头后封装在UDP报文中,并以传统IP网络的传输方式转发该UDP报文。报文到达目的端点后,去掉外层封装的部分,将原始数据帧交付给目标终端。

VXLAN本质上是一种隧道技术,能在三层网络的基础上建立二层以太网网络隧道,从而实现跨地域的二层互连。
VXLAN 是将二层建立在三层上的网络,通过将二层数据封装到 UDP 的方式来扩展数据中心的二层网段数量。
VXLAN 是一种在现有物理网络设施中支持大规模多租户网络环境的解决方案。
VXLAN 的传输协议是 IP + UDP

若想对VXLAN有更多的了解,可以看以下文章

https://support.huawei.com/enterprise/zh/doc/EDOC1100087027?partNo=10042

key-value 数据库

Docerk overlay 网络需要一个 key-value 数据库用于保存网络状态信息,包括 Network、Endpoint、IP 等。Consul、Etcd 和 ZooKeeper 都是 Docker 支持的 key-vlaue 软件,我们这里使用 Consul。

overlay环境准备

这里准备了三台centos7的虚拟机,下面以host0,host1,host2代替,注意:overlay要正常使用需要内核版本>=3.16

1、在host0部署consul组件

docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap

通过 http://IP:8500 访问consul

在这里插入图片描述

2、修改 host1 和 host2 的 docker daemon配置

vim /lib/systemd/system/docker.service

#host1
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store consul://192.168.189.133:8500 --cluster-advertise 192.168.189.135:2375

#host2
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store consul://192.168.189.133:8500 --cluster-advertise 192.168.189.136:2375

--cluster-store 指定 consul 的地址。
--cluster-advertise 告知 consul 自己的连接地址。

3、host1,host2重启docker

#加载新service配置文件
systemct daemon-reload
#启动
systemctl restart docker

4、查看consule的key/value信息

在这里插入图片描述

在overlay中运行容器

1、在host1上创建overlay网络

#创建overlay网络
[root@localhost ~]# docker network create -d overlay ov_net1
0b09ef758f172ecbee829c93cb7c5bc2b984a73b1819de79e3e59ccdb327a1cd
查看,在host1,host2都能看到
#[root@localhost ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
16a3cafba630        bridge              bridge              local
bc33d5d6a62d        docker_gwbridge     bridge              local
b892f32d2fdd        host                host                local
5e181b658ef2        none                null                local
0b09ef758f17        ov_net1             overlay             global

#查看详细信息
docker network inspect ov_net1 

2、在host1,host2上创建容器运行加入overlay网络

#host1:
docker run -itd --name bbox1 --net ov_net1 busybox

#host2:
docker run -itd --name bbox2 --net ov_net1 busybox

3、测试联通性

ping x.x.x.x
ping bbox1
发布了22 篇原创文章 · 获赞 2 · 访问量 584

猜你喜欢

转载自blog.csdn.net/weixin_42955452/article/details/105184712