一、docker网络简述
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
Docker支持四种网络模式:none
,host
,container
,bridge
:
none
模式:容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pairhost
模式:容器和宿主机共享Network namespace。container
模式:容器和另外一个容器共享Network namespace。kubernetes中的pod就是多个容器共享一个Network namespace。 和网桥连接,配置IP等。bridge
模式:(默认为该模式)
但是,四种网络模式都是在物理机与容器之间进行网络通信的模式,在特殊的场景中,需要多节点部署的服务之间进行通信,也就是本文需要讲解的多节点之间容器互联。
首先,介绍一下跨主机网络通信的实现方式:
二、docker原生态overlay
模式
- 内置跨主机的网络通信实现思路无非有两种:二层
VLAN网络
和Overlay网络
- 二层
VLAN网络
解决跨主机通信的思路是把原先的网络架构改造为互通的大二层网络,通过特定网络设备直接路由,实现容器点到点的之间通信。(优点:传输效率比overlay高,缺点:vlan端口有限,通用性和灵活性欠缺) Overlay网络
是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式。能够充分利用成熟的IP路由协议进程数据分发;在Overlay技术中采用扩展的隔离标识位数,能够突破VLAN的4000数量限制支持高达16M的用户,并在必要时可将广播流量转化为组播流量,避免广播数据泛滥。
- 二层
以上,是有关docker网络相关的基础知识,下面,开始本次实验内容:
三、实验
3.1 网卡设备介绍
- Container eth0:eth0它是Overlay网络分配的唯一的IP地址,它是veth pair虚拟设备对,作用是实现点对点的通信,通过桥接到br0这个网桥中,可以实现不同 NameSwitch之间容器进行通信。
- br0:它是Overlay默认创建的网桥。
- VETP:对VXLAN数据包的封装与街封装。
- Container eth1:eth1是容器主机的默认网络,主要提供容器访问外网所提供的服务,走的默认docker网络架构,只不过他创建了docker_gwbridge这个网桥。
- docker_gwbridge:docker_gwbridge是容器所创建的网桥它替代了docker0的服务。
- eth0:真机网卡与外界网卡连接得真机网卡,它用来转发,容器VXLAN与NAT两种网卡类型的数据包到指定的对端节点。
3.2 发送数据包流程介绍
假设容器Container1 发送数据包 到容器 Container2。
- 容器Container1会通过Container eth0 将这个数据包发送到 10.0.0.1 的网关;
- 10.0.0.1 网关将数据包发送出去后到达br0网桥;
- br0网桥针对VXLAN设备,主要用于捕获对外的数据包通过VETP进行数据包封装;
- 封装好将VXLAN格式数据包交给物理机的eth0,通过UDP方式交给Container2的eth0;
- Container2收到数据包后通过VETP将数据包解封装;
- 网桥通过网关将解封装的数据包转发给Container2的eth0,完毕通信
3.3 实践
3.3.1 节点准备
hostname | ip |
---|---|
node103 | 192.168.44.103 |
node104 | 192.168.44.104 |
3.3.2 准备 overlay 环境
为支持容器跨主机通信,Docker 提供了 overlay driver。Docerk overlay 网络需要一个 key-value 数据库用于保存网络状态信息,包括 Network、Endpoint、IP 等。Consul、Etcd 和 ZooKeeper 都是 Docker 支持的 key-vlaue 软件,我们这里使用 Consul。(Etcd后续再补充)
-
- 在node103上面部署consul
命令如下:
# docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
容器启动后,可以通过:http:192.168.44.103:8500访问,如图:
-
- 分别在node103和node104上修改docker.service的启动命令
# vi /usr/lib/systemd/system/docker.service
在ExecStart一栏添加:
ExecStart=/usr/bin/dockerd-current -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --cluster-store=consul://192.168.44.103:8500 --cluster-advertise=ens33:2376 \
参数解释:
--cluster-store 指定 consul 的地址。
--cluster-advertise 告知 consul 自己的连接地址。
注:node103和node104的–cluster-store的配置路径相同,都是192.168.44.103:8500
如下图所示:
-
- 在node103和node104上重启docker
# systemctl daemon-reload
# systemctl restart docker
注:node103重启服务之后,需要重新run consul服务
此时,查看node103:8500 能够看到两个节点的信息
3.3.3 启动服务
-
- 创建overlay网络
[root@node104 ~]# docker network create -d overlay ov_net1
注:docker network create -d overlay ov_net1 –subnet 10.10.10.0/24 (指定子网),这里默认是10.0.0.0
-
- 在node103和node104上面各启动一个centos:7.5.1804的服务
[root@node103 ~]# docker run -itd --privileged --name node2 --hostname node2 --net ov_net1 --rm big_computing /usr/sbin/init
root@node104 ~]# docker run -itd --privileged --name node1 --hostname node1 --net ov_net1 --rm big_computing /usr/sbin/init
-
- 进入node104上面的容器node1(10.0.0.2)
[root@node104 ~]# docker exec -it node1 /bin/bash
-
- 验证网络:ping node103上面的容器node2(10.0.0.3)
同样的方法进去node2,也能够ping通node1
如下图所示:
后记
肺炎猖狂,在家闭关!最近,会持续更新自己前期整理的学习资料,大家如果感兴趣的,请点赞,加关注