Docker 网络 IP 地址冲突了,该怎么办呢?

1年前 312观看

1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

Docker 网络 IP 地址冲突这个问题其实稍微有一点点麻烦,网上也没有看到有比较全面正确的文章, 值得单独写一篇记录一下。1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

1前置知识

因为交换机的能力有限制,以及网线的连接不可能无限长, 所以我们不可能把所有的主机都连到同一个交换机上,然后处于同一个二层网络中。1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

就算能,主机间的 ARP 广播也会让这个网络瞬间瘫痪。1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

所以我们得把主机拆分到一个个的小的子网里,然后通过路由器再并成三层网络。1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

我们俗称的 IP 地址其实由两个部分组成,网络地址和主机地址。比如10.0.0.1/8中,第一个10是网络地址,后面的0.0.1是主机地址。那我怎么知道怎么去拆分这两段呢?靠的就是子网掩码,也就是那个/81wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

IP 其实是由 32 位的二进制组成的,x.x.x.x只是为了方便人类阅读将其转成了十进制。有个简单粗暴的办法就是可以认为每一段都是 8 位,所以/8就代表第一段是网络地址。1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

同理,/16就代表前两段都是网络地址,10.0.0.0/16中, 网络地址是10.0,后两位0.0代表每个子网中的主机地址。1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

比如10.0.0.1/1610.0.0.2/16是同一个子网的两个主机。10.0.0.1/1610.1.0.1/16是不同的子网的两个主机。1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

这里只是简单粗暴的介绍下,更多的信息还是自己去查资料了解学习。1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

2问题表现

  • docker 进程无法启动
  • 容器端口无法访问,抓包显示为有入站但是没有出站

3排查

此处针对的是 dockerd 无法启动的情况,如果 dockerd 能启动,可以直接跳到解决一节1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

首先是看下日志1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

$systemctlstatusdocker
$journalctl-udocker
$dmesg|grepdocker

一般能看到如下日志:1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

docker0:linkisnotready
docker_gwbridge:linkisnotready

或者更简单的排查方法,直接手动启动 dockerd 看看。启动方法可以通过grep ExecStart /usr/lib/systemd/system/docker.service查看。1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany


1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

一般来说按如下执行就行:1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

$/usr/bin/dockerd--debug

然后能看到最后输出:1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

INFO[2021-07-29T02:25:55.811673622Z]stoppingeventstreamfollowinggracefulshutdownerror="<nil>"module=libcontainerdnamespace=moby
failedtostartdaemon:Errorinitializingnetworkcontroller:listbridgeaddressesfailed:PredefinedLocalScopeDefaultNetworksList:[10.252.0.0/2410.252.1.0/2410.252.2.0/24]:noavailablenetwork

这时候可以看下ip addr,是否有docker0docker_gwbridge1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

如果发现没有docker0,那基本可以肯定是 docker0 无法创建导致 dockerd 启动失败了。1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

4解决

找到占用的网段

默认的 docker0 网段是172.17.0.0/16,docker_gwbridge 网段是172.18.0.0/24,你需要确认下这两个网段是否被占用了。1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

最简单的方法就是 ping 一下,如果无响应的话,那么就说明没有被占用。1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

其次就是看一下本机的路由表route -n,确认一下有没有冲突的段。一般来说,你会发现相关网段要么已经被占用,要么是路由表里存在冲突。1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

案例

比如在我的环境里,我给 docker0 配置为10.252.0/24,然后 dockerd 起不来。1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

排查后发现route -n里有这么一条:1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

10.0.0.0172.21.0.1255.0.0.0UG000eth0

也就是说10/8被占用了,导致和我的10.252.0/24冲突。后来联系网管删除了这条10/8的路由后解决。1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

修改 docker 占用的网段

以下操作需要先停止 docker 进程1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

$systemctlstopdocker

如果你用 docker service,那么 docker 会占用四个网段:1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

  1. docker0
  2. docker_gwbridge
  3. ucp(docker engine 占用,不常见)
  4. ingress

其中前三个的网段可以通过配置文件配置,第四个只能手动创建。1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

前三个网段会读取/etc/docker/daemon.json这个配置文件, 这个文件默认是没有的,需要手动创建。1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

{
"bip":"",
"default-address-pools":[
{"base":"10.252.0.0/24","size":24},
{"base":"10.252.1.0/24","size":24},
{"base":"10.252.2.0/24","size":24}
]
}

注意这个default-address-pools至少要有两项,按顺序依次为:1wW莫卡妮生活网-记录每日创新科技时尚娱乐生活Mocany

  1. docker0
  2. docker_gwbridge
  3. ucp

以防万一的话,配置三个是最好的

本文链接:http://www.mocany.com/showinfo-1-24051-0.htmlDocker 网络 IP 地址冲突了,该怎么办呢?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com。天上从来不会掉馅饼,请大家时刻谨防诈骗