使用直接路由方式实现docker容器跨物理主机通信
实现docker容器跨物理主机通信
方法 : 直接路由方式
网络环境:
node1 主机ip 173.16.20.201 docker0网卡ip172.17.0.1 , nginx容器ip 172.17.0.2
node1 主机ip 173.16.20.202 docker0网卡ip172.17.0.1, redis容器ip 172.17.0.2
环境准备:
node1 主机上运行一个nginx容器
# docker run -d -p 80:80 --name nginx nginx:latest
# docker inspect nginx |grep "IPAddress"
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
node2主机上运行一个redis容器
# docker run -d -p 6379:6379 -v /redisdata:/data -d --name redis redis:latest redis-server --appendonly yes
# docker inspect redis |grep "IPAddress"
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
我们可以看到node1,node2 两个主机上的docker0 ip、容器ip相同,这样是不行的, 我们需要更改docker0网络
实现方法
1、 修改node1,node2主机的Docker0网桥默认网络ip
以node1主机为例,修改node1主机的docker0网卡ip为192.168.201.1
修改文件 /etc/docker/daemon.json 添加内容 "bip": "ip/netmask" [ 切勿与宿主机同网段 ]
{
"registry-mirrors": ["https://aa25jngun.mirror.aliyuncs.com"],
"bip": "192.168.201.1/24"
}
重启docker服务
# systemctl daemon-reload
# systemctl restart docker
按同样的方法,修改node2主机的docker0网卡的ip为 192.168.202.1
此时网络环境发生变化
node1 主机ip 173.16.20.201 docker0网卡ip192.168.201.1 , nginx 容器ip 192.168.201.2
node1 主机ip 173.16.20.202 docker0网卡ip172.17.0.1 , redis容器ip 192.168.202.2
2、 添加路由规则
node1主机添加路由
# route add -net 192.168.202.0 netmask 255.255.255.0 gw 173.16.20.202
node2主机添加路由
# route add -net 192.168.201.0 netmask 255.255.255.0 gw 173.16.20.201
3、 开启物理主机的路由转发功能
编辑 /etc/sysctl.conf 在文件末尾添加
net.ipv4.ip_forward=1
# sysctl -p
4、 容器连通性测试
登录node1主机的nginx容器,ping下node2主机的redis容器ip,看连通性如何
# docker exec -ti nginx /bin/bash
登入容器,安装ping、ifconfig 命令行工具
apt-get install inetutils-ping
apt-get install net-tools
ping 192.168.202.2
测试容器是可以ping通的。