docker overlay跨主机容器网络
这里使用libnetwork自带的Overlay类型驱动来实现跨主机的网络通信。Overlay驱动默认采用VXLAN协议,在IP地址可以互相访问的多个主机上之间搭建隧道,让容器可以互相访问。
环境情况
ip | 用途 |
---|---|
172.16.18.18 | Consul、docker node1 |
172.16.18.17 | docker node2 |
配置服务注册与发现组件
在libnetwork网络方案中,需要配置一个服务注册与发现组件,如Consul、Etcd、Zookeeper等来实现跨主机容器网络通信。
这里使用Consul,在这里我直接借助一台不在组网内的docker服务器,来运行Consul容器,也可以直接安装对应的键值数据库。
搭建consul环境,这里选择下载二进制文件启动。
cd /data/consul/bin
wget https://releases.hashicorp.com/consul/1.4.0/consul_1.4.0_linux_amd64.zip
unzip consul_1.4.0_linux_amd64.zip
# 后台运行
nohup consul agent -server -ui -bootstrap-expect=1 -data-dir=/data/consul/data_dir -node=agent-one -advertise=172.16.18.18 -bind=0.0.0.0 -client=0.0.0.0 &
访问consul ui
ui端口默认8500
http://172.16.18.18:8500
配置Docker主机
我这里是172.16.18.17和172.16.18.18 2台主机docker主机,
在docker.service配置文件ExecStart属性值后添加
一般默认路径 /usr/lib/systemd/system/docker.service
-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=consul://172.16.18.18:8500 --cluster-advertise=eno1:2375
eno1为值Docker主机的网络卡,我这里是配置局域网的网卡。172.16.18.18就是consul键值数据库的地址。
我这里示例端口是2375,为了安全问题建议都配置 2376 端口
完整docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.io
[Service]
Environment="PATH=/data/docker/bin:/bin:/sbin:/usr/bin:/usr/sbin"
ExecStart=/data/docker/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store=consul://172.16.18.18:8500 --cluster-advertise=eno1:2375
ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT
ExecReload=/bin/kill -s HUP $MAINPID
Restart=on-failure
RestartSec=5
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
重启dokcer服务
systemctl daemon-reload
systemctl restart docker.service
成功配置后,可能consul ui查看注册到consul的docker主机
创建网络
在组网内任意节点创建网络
docker network create -d overlay multihost
在另外的节点查看创建的网络,可见multihost
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
8b87fa7f0222 bridge bridge local
7e59cda62600 docker_gwbridge bridge local
12be8c750d9c host host local
239f5b055a49 multihost overlay global
1ad448bc358a none null local
测试
在不同节点使用multihost创建容器,ping其中1容器可以ping通。
节点1
docker run -d -it --name=c1 --net multihost 镜像
节点2
docker run -d -it --name=c2 --net multihost 镜像
连到c2容器shell
docker exec -it c2 sh
ping c1
最终结果可ping c1,即成功。