利用路由组建docker集群环境

简介

利用路由组件一个集群docker环境,使得不同主机的docker容器能够项目访问,形成一个封闭的docker局域网环境。

注:该方案不同于Docker Swarm集群,没有集群管理工具,如有需要,需要自己开发集群管理工具。Docker Swarm集群部署参考:http://www.bitem.cn/article/37373bd4-7b43-50b3-b2c8-381dd6cd3306

1 准备

准备以下设备

3台服务器(学习环境没有服务器的可使用虚拟机代替)
1台路由器(学习环境没有路由器的可使用普通电脑或者虚拟机代替)

设备网络信息,Docker与服务器一一对应。

序号 功能 主机名 IP 掩码
1 路由器 192.168.1.1 255.255.255.0
2 服务器1 dev1 192.168.1.11 255.255.255.0
3 服务器2 dev2 192.168.1.12 255.255.255.0
4 服务器3 dev3 192.168.1.13 255.255.255.0
5 Docker1 172.18.1.1 255.255.255.0
6 Docker2 172.18.2.1 255.255.255.0
7 Docker3 172.18.3.1 255.255.255.0

2 安装基础环境

3台服务器安装好CentOS7操作系统以及Docker(Docker安装超链接 http://www.bitem.cn/article/45246d85-a257-6ebe-cfbd-0adf587ae819
路由器配置好lan口地址,和Wan口地址(Wan口地址根据自己的网络环境配置)

3 路由配置

3.1 路由器

关闭DHCP
关闭无线功能
如需要开放服务器外网访问功能,需配置路由器NAT功能

根据规划好的设备网络信息在路由器中添加路由(不同路由器命令可能不同)

ip-route-static 172.18.1.0 24 192.168.1.11
ip-route-static 172.18.2.0 24 192.168.1.12
ip-route-static 172.18.3.0 24 192.168.1.13
1
2
3

3.2 服务器

不同的操作系统命令可能有所区别

# 安装iptables
yum install iptables-services
systemctl enable iptables
systemctl start iptables

# 每台均需执行
route add -net 172.18.0.0 netmask 255.255.0.0 gw 192.168.1.1

# 服务器1
iptables -t nat -I PREROUTING -s 172.18.1.0/24 -d 172.18.0.0/16 -j DNAT --to 172.18.1.1
iptables -t nat -I PREROUTING -d 172.18.1.0/24 -j DNAT --to 172.18.1.1

# 服务器2
iptables -t nat -I PREROUTING -s 172.18.2.0/24 -d 172.18.0.0/16 -j DNAT --to 172.18.2.1
iptables -t nat -I PREROUTING -d 172.18.2.0/24 -j DNAT --to 172.18.2.1

# 服务器3
iptables -t nat -I PREROUTING -s 172.18.3.0/24 -d 172.18.0.0/16 -j DNAT --to 172.18.3.1
iptables -t nat -I PREROUTING -d 172.18.3.0/24 -j DNAT --to 172.18.3.1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 查看iptables
[root@dev1 ~]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       all  --  anywhere             172.18.1.0/24        to:172.18.1.1
DNAT       all  --  172.18.1.0/24        172.18.0.0/16        to:172.18.1.1
1
2
3
4
5
6
# 保存iptables
service iptables save
1
2
# 保存路由表(每台及其都需要操作)
vi /etc/sysconfig/static-routes
# 新增如下内容:
net 172.18.0.0 netmask 255.255.0.0 gw 192.168.1.1

# 保存

1
2
3
4
5
6
7

4 配置服务器Docker虚拟网络

dev1

docker network create -d bridge --subnet 172.18.1.0/24 --gateway 172.18.1.1  cluster
1

dev2

docker network create -d bridge --subnet 172.18.2.0/24 --gateway 172.18.2.1  cluster

1
2

dev3

docker network create -d bridge --subnet 172.18.3.0/24 --gateway 172.18.3.1  cluster

1
2

测试

在3台服务器上分别启动一个容器,绑定我们新建的网卡:cluster,并分配固定IP(方便测试)

进入容器,通过ping命令测试各容器之间的连通性。

# 测试结果:
[root@dev1 ~]# docker exec -it nacos /bin/bash
[root@05fcaca2851b nacos]# ping 172.18.2.11
PING 172.18.2.11 (172.18.2.11) 56(84) bytes of data.
64 bytes from 172.18.2.11: icmp_seq=1 ttl=64 time=0.059 ms
64 bytes from 172.18.2.11: icmp_seq=2 ttl=64 time=0.031 ms
^C
--- 172.18.2.11 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.031/0.045/0.059/0.014 ms
[root@05fcaca2851b nacos]# ping 172.18.3.11
PING 172.18.3.11 (172.18.3.11) 56(84) bytes of data.
64 bytes from 172.18.3.11: icmp_seq=1 ttl=64 time=0.045 ms
64 bytes from 172.18.3.11: icmp_seq=2 ttl=64 time=0.048 ms
64 bytes from 172.18.3.11: icmp_seq=3 ttl=64 time=0.067 ms
64 bytes from 172.18.3.11: icmp_seq=4 ttl=64 time=0.039 ms
64 bytes from 172.18.3.11: icmp_seq=5 ttl=64 time=0.062 ms

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18