docker跨主机网络互通
1.介绍
docker跨主机的网络互通方式很多,我之前最常用的方式就是--network=host
,直接使用宿主机的网络,容器需要用到的端口,直接暴露在宿主机对应的端口上。
最近准备用docker搭建一个高可用的数据库集群,跑rabbitmq、mysql、以及redis等等。之前的--network=host
方式未免有些太粗暴了。
这次用swarm集群的方式搭建跨主机的容器网络。
特此记录下,以后再次搭建环境时可以参考
2.准备工作
我这边有两台虚拟化服务器,准备开3个虚拟机做高可用,其中一台性能较强的服务器开两个虚拟机,另外一台服务器开一个虚拟机。
两台服务器连接两台不同的ups保证电源稳定。
3台虚拟机配置相同,均为4核16G内存。
在一台虚拟机上装好centos7系统、常用软件以及docker之后,复制出来另外两台虚拟机,并修改另外两台虚拟机的ip地址。
ip地址:
- 虚拟机1:192.168.8.192
- 虚拟机2:192.168.8.193
- 虚拟机3:192.168.8.194
3. 创建swarm集群
3.1 开放端口号
在3台机器上分别执行下列命令:
firewall-cmd --add-port=2377/tcp --add-port=4789/udp --add-port=7946/tcp --add-port=7946/udp --permanent --zone=public
firewall-cmd --reload
其中,2377为默认管理服务端口,可以自定义。
4789和7946为服务成员发现以及外部服务映射
3.2 创建/加入集群
192节点上执行创建swarm集群:
[root@datasource2 ~]# docker swarm init --advertise-addr 192.168.8.192
如果需要自定义端口号,可以将192.168.8.192
改为192.168.8.192:端口号
执行之后,会输出一串token,同时也会输出其他节点加入集群的命令。
193和194节点执行加入集群:
[root@datasource3 ~]# docker swarm join --token xxxxxxxx 192.168.8.192:2377
此时,只有192节点是管理节点,193和194仅作为工作节点。
在192节点上执行命令查看集群情况:
docker node ls
可以在管理节点执行以下命令来将工作节点提升为管理节点:
docker node promote xxx
可以在管理节点执行以下命令来将管理节点降级为工作节点:
docker node demote xxx
4. 创建overlay网络
在任一管理节点上执行以下命令:
docker network create -d overlay --subnet=10.10.0.0/16 --gateway=10.10.0.254 --attachable=true datasource
结果的datasource
是我指定的网络名,下同。
查看下创建的网络:
docker network inspect datasource
[root@datasource2 ~]# docker network inspect datasource
[
{
"Name": "datasource",
"Id": "rptgfp0lgamyp3yknfzb6n65f",
"Created": "2020-12-26T03:20:45.722640236+08:00",
"Scope": "swarm",
"Driver": "overlay",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "10.10.0.0/16",
"Gateway": "10.10.0.254"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
---以下省略
可以看到作用域是"Scope": "swarm",
网络类型/驱动是"Driver": "overlay",
子网为设置的"Subnet": "10.10.0.0/16",
10.10.x.x段
# 5. 创建容器使用跨主机网络
docker run --network=datasource -it centos:7
这样会自动给容器分配一个10.10.x.x的网址
docker run --network=datasource --ip=10.10.x.x -it centos:7
这样会给容器指定一个固定ip
可以在不同宿主机创建几个容器,然后互相ping测试下,我这边测试正常就不贴代码了。
可以使用docker network inspect datasource
查看网络的详情
可以使用docker container inspect 容器名
查看容器的ip等信息