我们同主机容器实现了通信 那么跨主机怎么实现通信~
macvlan内核模块实现跨主机通信
判断Linux内核是否支持macvlan模块
lsmod | grep macvlan
modprobe macvlan
lsmod | grep macvlan
两个主机节点创建同网段的自定义网络类型
docker network create -d macvlan –subnet 172.29.0.0/16 –gateway 172.29.0.254 -o parent=eth0 custom-macvlan
手动分配IP地址
10.0.0.101节点基于自定义网络启动容器
docker container run –rm -it –name c1 –network custom-macvlan –ip 172.29.0.101 alpine ifconfig
docker container run –rm -it –name c2 –network custom-macvlan –ip 172.29.0.102 alpine ifconfig
两个可以节点之间的容器
ping 172.29.0.102 -c 3
ping baidu.com -c 3 # 无法访问外网
#我们需要手动分配IP地址,无法联网的问题,只需要使用”docker network connect”重新分配一块网卡即可解决
macvlan的优缺点
优点
– docker原生支持,无需安装额外插件,配置起来相对简单。
– 适合小规模docker环境,例如只有1-3台,如果服务器过多,手动分配IP地址可能会无形之间增加工作量;
缺点
– 需要手动分配IP地址,如果让其自动分配IP地址可能会存在多个主机自动分配的IP地址冲突的情况,到时候还需要人工介入维护;
– 本机相同网络(本案例为”custom-macvlan”)的容器之间相互通信没问题,跨主机之间的容器进行通信也没问题,但容器无法与宿主机之间进行通信,也无法连接到外网
– macvlan需要绑定一块物理网卡,若网卡已经被绑定,则无法创建;
overlay实现容器跨主机网络互联 (主节点10.0.0.101)
搭建一个consul将两个节点容器加入集群 它会更新配置到集群中的所以节点
先在两个主机节点里创建两个consul容器
#部署consul服务,如果你的网卡名称不是ens33,需要修改,比如eth0 相当于网卡绑定
docker run -d –network host –restart always –name=dev-consul -e CONSUL_BIND_INTERFACE=eth0 consul:1.12.3
查看服务端的端口
ss -ntl | grep 8500
如果想要搭建集群就执行下面3个命令 可选操作
# docker run -d -e CONSUL_BIND_INTERFACE=eth0 consul:1.12.3 –restart always agent -dev -join=10.0.0.101
# docker run -d -e CONSUL_BIND_INTERFACE=eth0 consul:1.12.3 –restart always agent -dev -join=10.0.0.101
# docker exec -t dev-consul consul members
修改配置文件(102子节点)
vim /etc/docker/daemon.json
{
#这个选项指定了一个外部的服务注册中心或配置存储系统的位置
“cluster-store”: “consul://10.0.0.101:8500”,这个选项用于指定当前节点对外通告自己的地址,即其他成员如何通过网络与这个节点进行通信
“cluster-advertise”: “10.0.0.102:9999”
}
修改配置文件(103子节点)
vim /etc/docker/daemon.json
{
“cluster-store”: “consul://10.0.0.101:8500”,
“cluster-advertise”: “10.0.0.103:9969”
}
访问服务端节点webui地址
http://10.0.0.101:8500/ui/dc1/kv/docker/nodes/
任意客户端节点创建网络,其他客户端会通过consul来实时同步配置哟 如102 创建网络
docker network create -d overlay –subnet 172.30.0.0/16 –gateway 172.30.0.254 custom-overlay
#其他节点将同步创建自定义网络
节点间通信测试
#节点1
docker container run –rm -it –name cc1 –network custom-overlay alpine
#节点2
docker container run –rm -it –name cc2 –network custom-overlay alpine
#节点3
docker container run –rm -it –name cc3 –network custom-overlay alpine
#进入任意容器 ping 发现 节点间都可互相通信