1、前置知识
在网络通信中,由于交换机能力的限制和网线长度的物理约束,不可能将所有主机连接到同一个交换机上,并处于同一个二层网络中。此外,主机间的 ARP 广播会导致网络瘫痪。因此,需要将主机拆分到多个子网中,然后通过路由器组成三层网络。
IP 地址由网络地址和主机地址两部分组成。例如,在 10.0.0.1/8
中,10
是网络地址,0.0.1
是主机地址。子网掩码(如 /8
)用于区分这两部分。IP 地址实际上是由 32 位二进制组成,x.x.x.x
格式只是为了方便人类阅读而转换成十进制。例如,/8
表示第一段是网络地址,/16
表示前两段是网络地址。
2、问题表现
- Docker 进程无法启动
- 容器端口无法访问,抓包显示有入站但没有出站
3、排查
如果你遇到的是 dockerd
无法启动的情况,可以尝试以下排查方法:
-
查看日志
通常可以在日志中看到类似如下的错误信息(具体日志内容根据实际情况而定):
Error starting daemon: Error initializing network controller: Error creating default "bridge" network: could not find an available, non-overlapping IPv4 address pool among the defaults to assign to the network
-
手动启动
dockerd
通过查看 Docker 服务的启动命令来进行手动启动。可以使用以下命令查看:
grep ExecStart /usr/lib/systemd/system/docker.service
通常会看到类似如下的输出:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
然后手动启动
dockerd
:/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
在输出中,你可能会看到错误信息提示无法创建
docker0
网桥。 -
检查网络接口
使用
ip addr
命令查看网络接口,确认是否存在docker0
和docker_gwbridge
。如果缺少docker0
,基本可以确定是docker0
无法创建导致dockerd
启动失败。
4、解决
找到并解决网段冲突问题是关键。
-
找到占用的网段
默认的
docker0
网段是172.17.0.0/16
,docker_gwbridge
网段是