一个docker简单的操作导致的整体网络故障
1.故障现象:用户报障说网络中断,打开发现服务器侧的网络,时而通时而不通。
咨询用户,告知只是在10.1.1.34这台服务器做了操作,通过BMC到服务器上,查看history,发现用户执行了命令,docker run --rm --net shared_nw busybox ping 192.203.230.10
进入docker,查看:
将这个容器关闭docker stop be90dc40e7d8,网络恢复。
2.分析根因:
在BMC中进行测试,docker run –rm –net shared_nw_busybox ping 192.203.230.10
查看arp,发现网关10.1.1.1的MAC地址在变,原来容器里发布了网关10.1.1.1的IP地址,导致MAC地址冲突,时通时不通,
查看容器的network的情况,
[[email protected] sysconfig]# docker network ls
NETWORK ID NAME DRIVER SCOPE
45681218fc39 bridge bridge local
6a864d0ca853 host host local
6bef7504a66e none null local
6c3e7034deb3 shared_nw bridge local
docker network inspect 6c3e7034deb3 ,如下表:(发现容器中存在10.1.1.101的IP地址,和网关地址10.1.1.1的MAC地址02:42:0a:01:01:01非常相似。计算了一下,10.1.1.101的最后一位101,换算成16进制就是65,(即6*16+5=101),所以这个MAC地址从容器中来是无疑了)。
"MacAddress": "02:42:0a:01:01:65",
"IPv4Address": "10.1.1.101/24",
[[email protected] sysconfig]$ docker network inspect 6c3e7034deb3 [ { "Name": "shared_nw", "Id": "6c3e7034deb37bf21e69ccb62d2517eb90cb50c9ca0512b739d356c33b835497", "Created": "2019-10-13T16:26:38.504975461+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "10.1.1.0/24", "Gateway": "10.1.1.34" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "39abbc28cff13ed184450619db752472f724320b3060c744a0ee8e84618c7186": { "Name": "gitlab", "EndpointID": "92699c32bb0c3d08fd2aeba47459685118249f1862d6687442bfdeeb9084520b", "MacAddress": "02:42:0a:01:01:65", "IPv4Address": "10.1.1.101/24", "IPv6Address": "" } }, "Options": { "com.docker.network.bridge.name": "docker1" }, "Labels": {} } ] |
但是这个IP地址是怎么来的的?查看容器busybox的在容器中的IP地址,
原来如此,10.1.1.1被当做动态IP被分配给了容器,和网关的IP地址冲突。
查了一下docker的手册,有个参数ip-range,在建网桥的时候直接将网关地址排除掉就可以了。
“”docker network create \
--driver=bridge \
--subnet=10.1.0.0/16 \
--ip-range=10.1.2.0/24 \
--gateway=10.1.1.1 \
br0
3.结论:
docker在企业网里的使用,怎样才是最佳实践?还需要多仔细研究研究。