Overlay网络-容器跨主机通信
1 docker主机间容器通信解决方案
1 overlay
Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式。这样不但能够充分利用成熟的IP路由协议进程数据分发;而且在Overlay技术中采用扩展的隔离标识位数,能够突破VLAN的4000数量限制支持高达16M的用户,并在必要时可将广播流量转化为组播流量,避免广播数据泛滥。
因此,Overlay网络实际上是目前最主流的容器跨节点数据传输和路由方案。
2 docker overlay network
要想使用Docker原生Overlay网络,需要满足下列任意条件
Docker 运行在Swarm
使用键值存储的Docker主机集群
3 使用健值存储搭建docker主机集群
需满足下列条件:
集群中主机连接到键值存储,Docker支持 Consul、Etcd和Zookeeper
集群中主机运行一个Docker守护进程
集群中主机必须具有唯一的主机名,因为键值存储使用主机名来标识集群成员
集群中linux主机内核版本在3.12+,支持VXLAN数据包处理,否则可能无法通行
4 安装集群控制器consul
下载控制器: Wget https://releases.hashicorp.com/consul/0.9.2/consul_0.9.2_linux_386.zip
解压:unzip consul_1.0.6_linux_amd64.zip
移动:mv consul /usr/bin/ && chmod a+x /usr/bin/consul
开启:nohup consul agent -server -bootstrap -ui -data-dir /data/docker/consul > -client=192.168.248.172 -bind=192.168.248.172 &> /var/log/consul.log &
节点配置docker守护进程链接
[root@node1 ~]# cat /lib/systemd/system/docker.service | grep -v "#" | grep -v "^$"
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
BindsTo=containerd.service
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store consul://192.168.248.172:8500 --cluster-advertise 192.168.248.172:2375
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
[root@node2 ~]# cat /lib/systemd/system/docker.service | grep -v "#" | grep -v "^$"
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
BindsTo=containerd.service
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store consul://192.168.248.172:8500 --cluster-advertise 192.168.248.173:2375
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
两台节点更新配置信息,重新启动docker服务
systemctl daemon-reload && systemctl restart docker
查看启动控制器的情况
创建overlay网络
[root@node1 ~]# docker network create -d overlay multi_host
[root@node1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
5182eaa02342 bridge bridge local
e3a2a29b5c09 docker_gwbridge bridge local
ad1ed3c8d4e3 host host local
3c6be27f09ad multi_host overlay global
19655f188313 none null local
在控制器的作用下网络模式会进行复制,所以第二台服务器也会产生相应的网络
-d : 指定创建网络的类型
另一台机器会自动同步新建的网络
[root@node1 ~]# docker network inspect multi_host
[
{
"Name": "multi_host",
"Id": "3c6be27f09ad794111c5569f9c18c01b0785640f167eb2920fce341b42bfab25",
"Created": "2019-04-05T03:59:35.920445223-07:00",
"Scope": "global",
"Driver": "overlay",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "10.0.0.0/24",
"Gateway": "10.0.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
分别在两台机器上使用overlay网络启动一个容器
docker run -it --net=multi_host busybox