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

这篇具有很好参考价值的文章主要介绍了Docker 网络 IP 地址冲突了,该怎么办呢?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 能启动,可以直接跳到解决一节

首先是看下日志

$ systemctl status docker
$ journalctl -u docker
$ dmesg | grep docker

一般能看到如下日志:

docker0: link is not ready
docker_gwbridge: link is not ready

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

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

$ /usr/bin/dockerd --debug

然后能看到最后输出:

INFO[2021-07-29T02:25:55.811673622Z] stopping event stream following graceful shutdown  error="<nil>" module=libcontainerd namespace=moby
failed to start daemon: Error initializing network controller: list bridge addresses failed: PredefinedLocalScopeDefaultNetworks List: [10.252.0.0/24 10.252.1.0/24 10.252.2.0/24]: no available network

这时候可以看下 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.0        172.21.0.1      255.0.0.0       UG    0      0        0 eth0

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

修改 docker 占用的网段

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

$ systemctl stop docker

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

  1. docker0

  2. docker_gwbridge

  3. ucp(docker engine 占用,不常见)

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

  1. docker0

  2. docker_gwbridge

  3. ucp

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

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

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

  1. 删除 ingress

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

  3. 新建 my-ingress

$ yes 'y' | docker network rm ingress
$ yes 'y' | docker network rm my-ingress 2>&1 | true
$ docker network create \
  --driver overlay \
  --ingress \
  --subnet=10.252.3.0/24 \  # 指定 ingress 的网段,不要和上面 daemon.json 的网段冲突
  --gateway=10.252.3.2 \
  --opt com.docker.network.driver.mtu=1200 \
  my-ingress

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

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

$ ip link del dev docker0
$ ip link del dev docker_gwbridge
$ rm -rf /var/lib/docker/network

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

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

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

而且,实际上也不一定能解决网段冲突的问题,只是说 docker 能启动了而已。文章来源地址https://www.toymoban.com/news/detail-546200.html

ip link add name docker0 type bridge
ip addr add dev docker0 10.252.0.1/24

到了这里,关于Docker 网络 IP 地址冲突了,该怎么办呢?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 电脑只能登录微信?但却打不开网页?不能上网怎么办?ip地址和DNS出问题了无法上网怎么办?

    描述一下问题: 昨天使用了一些代理梯子。直接关机,没有关闭那个软件、今天打开电脑就出问题了。只能登录微信!但却打不开网页! 今天查了很多资料都没有解决。花了2个多小时。终于可以上网了! 找到【控制面板】 --【网络和Internet】-- 里面的【网络连接】或者【网

    2024年02月05日
    浏览(47)
  • 启动docker显示Docker Engine stopped怎么办?

            在windows11系统下,我的Docker突然无法启动,打开Docker Desktop显示Docker Engine stopped… 尝试了网上好多办法,就我的问题而言,打开 控制面板-程序启用或关闭Windows功能,重新打钩选中Hyper-V后点击确定,再重启电脑问题就解决了。

    2024年02月03日
    浏览(34)
  • docker中mysql忘记密码怎么办?

    进入容器:docker exec -it mysql bash 修改mysql配置: [mysqld] skip-host-cache skip-name-resolve skip-grant-tables 进入mysql交互环境:mysql -uroot -p( 备注:不要输入密码直接点击enter键进入 ) 重置密码为空:update user set authentication_string=‘’ where user=‘root’; 生效配置:flush privileges; 重置新密码

    2024年02月07日
    浏览(38)
  • 不小心删除了docker/overlay2怎么办?

    服务器硬盘容量达到顶峰,没有空闲空间。利用df -h的时候查看到/data/docker/overlay2占用最大。以为这里面都是docker的缓存文件,删除也无妨,所以直接通过 rm -rf 命令删除。(没有做任何备份)删完之后整个人就傻了,所有的容器运行全部失败。 此时!不要慌,不要着急做其

    2024年02月15日
    浏览(36)
  • 阿里云提示服务器ip暴露该怎么办?-速盾网络(sudun)

    当阿里云提示服务器IP暴露的时候,这意味着您的服务器可能面临安全风险,因为黑客可以通过知道服务器的IP地址来尝试入侵您的系统。在这种情况下,您应该立即采取措施来保护您的服务器和数据。以下是一些建议: 更改服务器IP地址:首先,您可以考虑更改服务器的IP地

    2024年01月20日
    浏览(31)
  • Docker管理工具Portainer忘记admin登录密码怎么办?

    Portainer官网解决方法链接 https://docs.portainer.io/v/ce-2.11/advanced/reset-admin 炒鸡详细步骤! 1.查看所有容器,包括未运行的 2.找到Portainer对应信息  3.停止Portainer容器 4.找到Portainer容器挂载信息  找到这个信息 5.执行命令重置密码  现在admin登录的密码就为:4~!15SlshwmY#89FpcRE06u{HL2(_

    2024年01月16日
    浏览(35)
  • git中合并分支时出现了代码冲突怎么办

    友情提醒: ①git merge命令介绍 git merge 用于本地分支的合并。将一个本地分支的更改合并到另一个本地分支时,你会使用git merge命令。 git merge命令用于将一个分支的更改合并到另一个分支。它会将两个分支的更改整合在一起,保留详细的合并信息,并成为一个新的提交。 例如

    2024年03月20日
    浏览(40)
  • Linux:已经配置了阿里云镜像加速,但是docker拉取镜像速度依然很慢怎么办?

    说明: 以下方案可以一起使用,或许某次就成功了,加油 1、方案1:切换镜像源 直接在百度上搜索 docker国内镜像源 ,可以搜索到很多文档,这里不再赘述。在尝试多个镜像源之后,我推荐网易docker镜像源,更换方法如下: 2、方案2:重启docker服务,命令: systemctl restart d

    2024年02月12日
    浏览(51)
  • 忘记宝塔安全入口地址怎么办?简单修改安全入口地址教程

    相信很多用宝塔Linux的朋友都有遇到过长时间没有登录宝塔,结果一登录上发现安全入口地址忘记了,不知道怎么查看和修改。 其实忘记宝塔安全入口地址后,登录宝塔时页面上已经提示了查看宝塔安全入口地址的命令,但是很多小伙伴不知道咋执行,这里小编就教大家操作

    2024年02月02日
    浏览(48)
  • 遇到Got permission denied while trying to connect to the Docker daemon socket at unix:///var/怎么办?

    问题:在使用执行docker命令的时候,总是提示如下报错 原因是:在默认情况下,docker 的 Unix Socket属于root用户,当然其他用户可以使用sudo方式来访问。因为这个原因, docker 进程就一直是root用户运行的。为了在使用 docker 命令的时候前边不再加sudo,我们需要创建一个叫 dock

    2024年02月13日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包