0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Docker 网络 IP 地址冲突如何解决

dyquk4xk2p3d 来源:良许Linux 2023-06-26 10:17 次阅读

Docker 网络 IP 地址冲突这个问题其实稍微有一点点麻烦,网上也没有看到有比较全面正确的文章, 值得单独写一篇记录一下。

1前置知识

因为交换机的能力有限制,以及网线的连接不可能无限长, 所以我们不可能把所有的主机都连到同一个交换机上,然后处于同一个二层网络中。

就算能,主机间的 ARP 广播也会让这个网络瞬间瘫痪。

所以我们得把主机拆分到一个个的小的子网里,然后通过路由器再并成三层网络。

我们俗称的 IP 地址其实由两个部分组成,网络地址和主机地址。比如10.0.0.1/8中,第一个10是网络地址,后面的0.0.1是主机地址。那我怎么知道怎么去拆分这两段呢?靠的就是子网掩码,也就是那个/8。

IP 其实是由 32 位的二进制组成的,x.x.x.x只是为了方便人类阅读将其转成了十进制。有个简单粗暴的办法就是可以认为每一段都是 8 位,所以/8就代表第一段是网络地址。

同理,/16就代表前两段都是网络地址,10.0.0.0/16中, 网络地址是10.0,后两位0.0代表每个子网中的主机地址。

比如10.0.0.1/16和10.0.0.2/16是同一个子网的两个主机。10.0.0.1/16和10.1.0.1/16是不同的子网的两个主机。

这里只是简单粗暴的介绍下,更多的信息还是自己去查资料了解学习。

2问题表现

docker 进程无法启动

容器端口无法访问,抓包显示为有入站但是没有出站

3排查

此处针对的是 dockerd 无法启动的情况,如果 dockerd 能启动,可以直接跳到解决一节

首先是看下日志

$systemctlstatusdocker
$journalctl-udocker
$dmesg|grepdocker

一般能看到如下日志:

docker0:linkisnotready
docker_gwbridge:linkisnotready

或者更简单的排查方法,直接手动启动 dockerd 看看。启动方法可以通过grep ExecStart /usr/lib/systemd/system/docker.service查看。

一般来说按如下执行就行:

$/usr/bin/dockerd--debug

然后能看到最后输出:

INFO[2021-07-29T0255.811673622Z]stoppingeventstreamfollowinggracefulshutdownerror=""module=libcontainerdnamespace=moby
failedtostartdaemon:Errorinitializingnetworkcontroller:listbridgeaddressesfailed:PredefinedLocalScopeDefaultNetworksList:[10.252.0.0/2410.252.1.0/2410.252.2.0/24]:noavailablenetwork

这时候可以看下ip addr,是否有docker0和docker_gwbridge,

如果发现没有docker0,那基本可以肯定是 docker0 无法创建导致 dockerd 启动失败了。

4解决

找到占用的网段

默认的 docker0 网段是172.17.0.0/16,docker_gwbridge 网段是172.18.0.0/24,你需要确认下这两个网段是否被占用了。

最简单的方法就是 ping 一下,如果无响应的话,那么就说明没有被占用。

其次就是看一下本机的路由表route -n,确认一下有没有冲突的段。一般来说,你会发现相关网段要么已经被占用,要么是路由表里存在冲突。

案例

比如在我的环境里,我给 docker0 配置为10.252.0/24,然后 dockerd 起不来。

排查后发现route -n里有这么一条:

10.0.0.0172.21.0.1255.0.0.0UG000eth0

也就是说10/8被占用了,导致和我的10.252.0/24冲突。后来联系网管删除了这条10/8的路由后解决。

修改 docker 占用的网段

以下操作需要先停止 docker 进程

$systemctlstopdocker

如果你用 docker service,那么 docker 会占用四个网段:

docker0

docker_gwbridge

ucp(docker engine 占用,不常见)

ingress

其中前三个的网段可以通过配置文件配置,第四个只能手动创建。

前三个网段会读取/etc/docker/daemon.json这个配置文件, 这个文件默认是没有的,需要手动创建。

{
"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至少要有两项,按顺序依次为:

docker0

docker_gwbridge

ucp

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

接下来是修改 ingress,这个比较麻烦,需要手动创建。

我的办法是在初始化 docker swarm 以后,启动 docker stack/service 以前,执行以下脚本:

删除 ingress

删除 my-ingress(不一定存在,不存在就忽略)

新建 my-ingress

$yes'y'|dockernetworkrmingress
$yes'y'|dockernetworkrmmy-ingress2>&1|true
$dockernetworkcreate
--driveroverlay
--ingress
--subnet=10.252.3.0/24#指定ingress的网段,不要和上面daemon.json的网段冲突
--gateway=10.252.3.2
--optcom.docker.network.driver.mtu=1200
my-ingress

ingress 是默认名,之所以新建一个名字不一样的,是因为删除 ingress 是异步的。如果你删除 ingress 后立刻新建一个也叫 ingress 的网络,很可能会报一个重名的错误。

重启 docker 前,最好先清理一下 docker 的缓存:

$iplinkdeldevdocker0
$iplinkdeldevdocker_gwbridge
$rm-rf/var/lib/docker/network

另一种粗糙简单的解决办法

另一种粗糙简单的解决办法就是干脆直接手动创建一个 docker0。

这种解决方法最简单,但是机器 reboot 后 docker0 会自动被删掉, 所以这方法并不持久。

而且,实际上也不一定能解决网段冲突的问题,只是说 docker 能启动了而已。

iplinkaddnamedocker0typebridge
ipaddradddevdocker010.252.0.1/24




声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • IP
    IP
    +关注

    关注

    5

    文章

    1405

    浏览量

    148296
  • 网络地址
    +关注

    关注

    0

    文章

    16

    浏览量

    9363
  • Docker
    +关注

    关注

    0

    文章

    437

    浏览量

    11603

原文标题:Docker 网络 IP 地址冲突了,该怎么办呢?

文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    个人和局域网IP地址冲突解决方案

    随着网络的广泛应用,使网络规模不断扩大,相应的IP地址分配也在不断增多,IP地址
    的头像 发表于 12-13 09:58 667次阅读
    个人和局域网<b class='flag-5'>IP</b><b class='flag-5'>地址</b><b class='flag-5'>冲突</b>解决方案

    软交换网络中接入层设备IP地址冲突现象分析

    简要介绍IP网络中Ping to death攻击的基本现象;对软交换网络接入层设备进行描述,重点对软交换网络中接入层设备IP
    发表于 05-16 10:06 11次下载

    基于校园网络IP地址冲突解决方案

    随着高校数字化校园网络的广泛应用,校内机器增多,无线网络的覆盖,相应的IP地址分配也在不断增多,IP地址
    发表于 12-12 17:59 0次下载
    基于校园<b class='flag-5'>网络</b><b class='flag-5'>IP</b><b class='flag-5'>地址</b><b class='flag-5'>冲突</b>解决方案

    IP地址冲突的原因和解决方案

    IP地址是互联网协议地址,使用统一地址格式,为网络中每个单元主机分配一个地址,供
    的头像 发表于 02-01 10:43 2w次阅读

    IP地址是什么,IP地址的分类有哪些

    一、IP地址概念 IP地址是一个32位的二进制数,它由网络ID和主机ID两部份组成,用来在网络
    发表于 05-20 13:34 9404次阅读

    docker的4种网络模式

    Docker 使用 Linux 桥接,在宿主机虚拟一个 Docker 容器网桥(docker0),Docker 启动一个容器时会根据 Docker
    的头像 发表于 08-14 11:50 1244次阅读

    docker的4种网络模式配置

    Docker 使用 Linux 桥接,在宿主机虚拟一个 Docker 容器网桥(docker0),Docker 启动一个容器时会根据 Docker
    的头像 发表于 10-10 10:37 946次阅读

    IP地址基础知识+冲突故障的解决方法

    相信每个维修人员都会在实际工作中遇到IP地址冲突的故障,很多人不知道为何会产生IP地址冲突的故障
    的头像 发表于 03-07 09:39 1920次阅读
    <b class='flag-5'>IP</b><b class='flag-5'>地址</b>基础知识+<b class='flag-5'>冲突</b>故障的解决方法

    智能工厂中局域网IP地址冲突何解决?

    现如今,人们的生活离不开网络,特别是工业企业,对于网络的依赖则更大。为了保证网络通信的速率和稳定性,很多工厂都会建设局域网,将工厂内的设备集中一起,方便进行监控和管理。但由于缺少规划,往往局域网中会出现
    的头像 发表于 08-21 15:42 390次阅读

    网段隔离器(NAT网关)如何解IP地址冲突问题?

    ,而如果出现两台相同IP地址的设备,这时就会产生IP冲突,进而导致网络的异常甚至瘫痪。   为解决跨网段访问与
    的头像 发表于 08-28 15:54 397次阅读

    IP地址配置冲突导致路由振荡怎么办?

    IP地址配置冲突导致路由振荡怎么办? 标题:解决IP地址配置冲突导致的路由振荡 引言: 在
    的头像 发表于 11-09 09:24 404次阅读

    发生IP冲突的原因是什么呢?如何解IP冲突的问题呢?

    发生IP冲突的原因是什么呢?如何解IP冲突的问题呢? IP
    的头像 发表于 12-07 09:32 3526次阅读

    局域网IP地址冲突、环路的罪魁祸首是什么?

    局域网IP地址冲突、环路的罪魁祸首是什么? 局域网IP地址冲突和环路是
    的头像 发表于 02-04 11:03 494次阅读

    在远程访问设备如果PLC的IP地址冲突何解

    要求从PLC中采集数据以达到远程监控的目的,从而实现设备、人员、物料、能源等多种生产要素的互联共通,从而及时觉察设备故障与产能缺陷,合理利用数据分析手段进行决策。但如果现场IPIP地址冲突
    的头像 发表于 02-20 17:26 217次阅读
    在远程访问设备如果PLC的<b class='flag-5'>IP</b><b class='flag-5'>地址</b><b class='flag-5'>冲突</b>如<b class='flag-5'>何解</b>决

    产线设备联网过程中的IP冲突(NAT转换)问题如何解

    都是唯一而独立的,以便在网络上进行通信。然而,当两台或更多的设备被分配了相同的IP地址时,就会出现IP地址
    的头像 发表于 04-09 17:28 142次阅读
    产线设备联网过程中的<b class='flag-5'>IP</b><b class='flag-5'>冲突</b>(NAT转换)问题如<b class='flag-5'>何解</b>决