1.问题
Docker安装后,默认会创建一个名为Docker0的虚拟网卡,使用的是172.17.*网段,用于为容器分配IP
可以通过ifconfig命令查看所有网络情况(如命令不存在,yum install net-tools安装)
下图为Docker0网络默认
而172段有时候会被公司内网专用,这样会造成在该服务器上访问公司172网络时路由到容器网络。
2.解决方案
修改容器配置项,重新设置Docker路由,Docker版本为18.06,该方案向后兼容。
vim /etc/docker/daemon.json
添加一行 "bip": "192.168.210.1/24",该行建议放JSON第一行。
{
"bip": "192.168.210.1/24",
其他配置
}
service docker restart 重启容器
重启后再次运行ifconfig查看docker0是否变成192段,笔者测试个别机器重启容器就生效,但大部分机器不会直接生效,需要重启服务器后生效。
ifconfig返回
[root@k8s-master ~]# ifconfig
cni0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
inet 10.244.0.1 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::d8a8:14ff:feb4:c4f2 prefixlen 64 scopeid 0x20<link>
ether da:a8:14:b4:c4:f2 txqueuelen 1000 (Ethernet)
RX packets 321375 bytes 55450337 (52.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 343911 bytes 81395594 (77.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.210.1 netmask 255.255.255.0 broadcast 192.168.210.255
ether 02:42:e1:46:78:80 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
route命令返回:
[root@k8s-master ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default gateway 0.0.0.0 UG 100 0 0 eth0
192.168.210.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0
10.244.0.0 0.0.0.0 255.255.255.0 U 0 0 0 cni0
10.244.1.0 10.244.1.0 255.255.255.0 UG 0 0 0 flannel.1
10.244.2.0 10.244.2.0 255.255.255.0 UG 0 0 0 flannel.1
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
查看容器实际IP,如果仍为172段则重启该容器
docker inspect -f='{{.Name}} {{.NetworkSettings.IPAddress}} {{.HostConfig.PortBindings}}' $(docker ps -aq)
返回
/postgres 192.168.210.2 map[5432/tcp:[{ 5432}]]
可以看出上面的容器已自动切换到192.168.210段。
3.结语
1.较早版本的Docker是需要修改docker.service文件,自行创建网桥,比较复杂。
2.Docker安装规划时就建议规划好Docker网络,安装后就改掉网段,不然后面再改还是会影响线上环境的,而且如果没有及时发现这种问题,会导致很难排查。
3.如果是k8s生成的容器,则默认走flannel分配,flannel分配的IP段是k8s初始化及安装flannel时指定。