利用 Docker 在不同宿主机做 CentOS 系统容器( 二 )


3、none模式
这种模式下的容器没有网卡、IP、路由等信息 。需要我们自己为Docker容器添加网卡、配置IP等 。也就是说它没有办法联网,我至今还没有用过,可能这样更安全吧 。
以上就是我对Docker安装后创建的三种网络模式的理解,还有两种模式(container模式和user-defined模式)可以自行查找了解 。
3.1、不同宿主机间容器通信原理图

利用 Docker 在不同宿主机做 CentOS 系统容器

文章插图
上图为不同宿主机间容器通信的的原理图,说实话这张图在网上都被用烂了,但是没得办法,谁让咱确实是按照这么做的呢,对于上图的讲解我也是直接照搬网上查到的,如下:
1)数据从源容器中发出后,经由所在主机的docker0虚拟网卡转发到flannel0虚拟网卡,这是个P2P的虚拟网卡,flanneld服务监听在网卡的另外一端 。
2)Flannel通过Etcd服务维护了一张节点间的路由表,在稍后的配置部分我们会介绍其中的内容 。
3)源主机的flanneld服务将原本的数据内容UDP封装后根据自己的路由表投递给目的节点的flanneld服务,数据到达以后被解包,然后直接进入目的节点的flannel0虚拟网卡,
然后被转发到目的主机的docker0虚拟网卡,最后就像本机容器通信一下的有docker0路由到达目标容器 。
这样整个数据包的传递就完成了,这里需要解释三个问题:
1)UDP封装是怎么回事?
在UDP的数据内容部分其实是另一个ICMP(也就是ping命令)的数据包 。原始数据是在起始节点的Flannel服务上进行UDP封装的,投递到目的节点后就被另一端的Flannel服务
还原成了原始的数据包,两边的Docker服务都感觉不到这个过程的存在 。
2)为什么每个节点上的Docker会使用不同的IP地址段?
这个事情看起来很诡异,但真相十分简单 。其实只是单纯的因为Flannel通过Etcd分配了每个节点可用的IP地址段后,偷偷的修改了Docker的启动参数 。
在运行了Flannel服务的节点上可以查看到Docker服务进程运行参数(ps aux|grep docker|grep “bip”),例如“–bip=182.48.56.1/24”这个参数,它限制了所在节点容器获得的IP范围 。这个IP范围是由Flannel自动分配的,由Flannel通过保存在Etcd服务中的记录确保它们不会重复 。
3)为什么在发送节点上的数据会从docker0路由到flannel0虚拟网卡,在目的节点会从flannel0路由到docker0虚拟网卡?
例如现在有一个数据包要从IP为172.17.18.2的容器发到IP为172.17.46.2的容器 。根据数据发送节点的路由表,它只与172.17.0.0/16匹配这条记录匹配,因此数据从docker0出来以后就被投递到了flannel0 。同理在目标节点,由于投递的地址是一个容器,因此目的地址一定会落在docker0对于的172.17.46.0/24这个记录上,自然的被投递到了docker0网卡 。
3.2、不同宿主机间容器通信安装部署
虽然安装部署方法也是在网上找的,但是网上给出的方法大方向是没问题的就是一些细节讲的还不是很清楚,导致我部署的时候还是出现很多问题 。下面我会将我安装部署的过程和遇到的问题整理到本文中 。
3.2.1、宿主机环境准备
我准备了四台宿主机,如下:
利用 Docker 在不同宿主机做 CentOS 系统容器

文章插图
四台宿主机都需要设置hosts:
[root@master ~] # vim /etc/hosts
192.168.10.1master
192.168.10.1etcd
192.168.10.2slave1
192.168.10.3slave2
192.168.10.4slave3
3.2.2、安装Etcd
本来想搭建etcd的多主机集群的,但是想了下只是在预生产使用而且只是处在前期搭建状态还没有正式使用,所以etcd我只在192.168.10.1服务器上搭建了单个主机的,如果后期出现问题,我会修改为多主机集群 。
1、安装etcd服务
yuminstall etcd -y
2、修改etcd配置文件
[root@master ~] # vim /etc/etcd/etcd.conf
#ETCD_CORS= ""
ETCD_DATA_DIR= "/var/lib/etcd/default.etcd"#数据存放路径
#ETCD_WAL_DIR= ""
#ETCD_LISTEN_PEER_URLS= "http://localhost:2380"
ETCD_LISTEN_CLIENT_URLS= "http://0.0.0.0:2379,http://0.0.0.0:4001"#监听客户端地址
#ETCD_MAX_SNAPSHOTS= "5"
#ETCD_MAX_WALS= "5"
ETCD_NAME= "master"#部署节点的名称
#ETCD_SNAPSHOT_COUNT= "100000"
#ETCD_HEARTBEAT_INTERVAL= "100"
#ETCD_ELECTION_TIMEOUT= "1000"
#ETCD_QUOTA_BACKEND_BYTES= "0"
#ETCD_MAX_REQUEST_BYTES= "1572864"


推荐阅读