当前位置:首页 > 技术分析 > 正文内容

Docker子网冲突解决方案及配置说明

ruisui882周前 (04-15)技术分析20

问题描述

公司现有子网为 172.19.0.0/24,某研发在使用docker的时候总是会有连不上的情况,排查发现在未配置 Docker 配置文件时,其默认创建的网络可能随机使用 172.17.0.0/16172.31.0.0/16 范围内的子网,存在以下风险:

  • Docker 若分配 172.19.0.0/16 子网会覆盖公司的 172.19.0.0/24 网络。
  • 导致 IP 地址冲突,引发网络通信异常。

解决方案

通过配置 daemon.json 实现:

  • 指定默认网桥子网docker0bip
  • 限制其他网络的地址池范围default-address-pools

1. 修改daemon.json文件

{
  "bip": "192.168.8.1/24",
  "default-address-pools": [
    {
      "base": "172.10.0.0/16",
      "size": 24
    }
  ]
}

2. 关键配置解释

  1. bip - 默认网桥子网
  • 作用:控制 docker0 桥接网络的子网。
  • 正确写法:
"bip": "192.168.8.1/24"  // 必须指定网关 IP(而非网段)
  • 错误写法:
"bip": "192.168.8.0/24"  // Docker 不会自动分配网关,需显式指定
  1. default-address-pools - 其他网络地址池
  • 作用:限制用户自定义网络(bridge、overlay)的子网范围。
  • 参数说明:
base: 基础网段(172.10.0.0/16 表示允许分配 172.10.0.0 ~ 172.10.255.0 子网)
size: 每个子网掩码位数(24 表示每个子网为 /24 格式,例如 172.10.5.0/24)

3.清理旧网络:若已有冲突网络,需先清理:

docker network prune

WARNING! This will remove all custom networks not used by at least one container.
Are you sure you want to continue? [y/N] y

4. 重启 Docker 服务

systemctl restart docker

5. 验证配置

  • 检查默认网桥
ip addr show docker0 | grep inet
# 输出示例:inet 192.168.8.1/24
  • 测试新网络子网分配
docker network create test-1
docker network create test-2
docker network create test-3
docker network create test-4
docker network create test-5
docker network create test-6

docker network inspect `docker network ls | grep bridge | awk '{print $2}'` | grep Subnet
# 输出示例:
"Subnet": "192.168.8.0/24"
"Subnet": "172.10.0.0/24"
"Subnet": "172.10.1.0/24"
"Subnet": "172.10.2.0/24"
"Subnet": "172.10.3.0/24"
"Subnet": "172.10.4.0/24"
"Subnet": "172.10.5.0/24"

注意事项

  • 如果是使用docker-compose 去运行容器,建议先创建容器网络,docker-compose 文件里使用创建的容器网络
docker network create -d bridge --subnet "10.22.33.0/24" --gateway "10.22.33.1"  srebro


version: '3'
services:
  redis:
    image: redis:7.4.1
    container_name: redis
    networks:
      - srebro
    restart: always
    command: redis-server --requirepass srebro.cn --port 6379 --appendonly yes --dbfilename dump.rd --dir /data --timeout 0 --save 900 1 --save 300 10 --save 60 10000
    environment:
      TZ: 'Asia/Shanghai' 
    volumes:
      - /home/application/Database/redis/data:/data
      - /home/application/Database/redis/logs:/logs
      - /etc/localtime:/etc/localtime:ro
    ports:
      - 6379:6379
    healthcheck:
      test: ["CMD", "redis-cli", "-h", "127.0.0.1", "-p", "6379", "-a", " srebro.cn", "ping"]
      interval: 30s
      retries: 3
      start_period: 30s
      timeout: 10s

networks:
  srebro:
    external: true

总结

通过强制指定 bipdefault-address-pools,Docker 的子网分配将严格限制在以下范围:

  • 默认网桥:192.168.8.0/24
  • 其他网络:172.10.0.0/24, 172.10.1.0/24, ... , 172.10.255.0/24

彻底避免与公司子网 172.19.0.0/24 的冲突。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/3496.html

分享给朋友:

“Docker子网冲突解决方案及配置说明” 的相关文章

Lindroid开源应用:在安卓手机 / 平板上安装 Linux发行版

IT之家 6 月 19 日消息,Erfan Abdi 本月发布了 Lindroid 开源应用程序,让用户可以在安卓手机上安装 GNU / Linux 发行版,在完全支持手机硬件的情况下可以运行 Linux 应用程序。Lindroid 开源应用程序就是将 Linux 放入容器中,使用 Halium 等...

基于archlinux的发行版有哪些?

Arch Linux 是一个 Linux 发行版,采用滚动更新的模型,这意味着 Arch Linux 不会定期发布新版本,而是持续接收更新和升级,保持系统与最新软件版本的同步。Arch Linux 以其极简主义、简单性和用户定制为中心的特点而闻名,专注于让用户对其系统配置具有完全控制权。然而,它也以...

快速上手React

web前端三大主流框架1、Angular大家眼里比较牛的框架,甚至有人说三大框架中只有它能称得上一个完整的框架,因为它包含的东西比较完善,包含模板,数据双向绑定,路由,模块化,服务,过滤器,依赖注入等所有功能。对于刚开始学习使用框架的小伙伴们,可以推荐这个框架,学会之后简直能颠覆之前你对前端开发的认...

代码分支规范

一.gitflow工作流说明:主分支:master,稳定版本代码分支,对外可以随时编译发布的分支,不允许直接Push代码,只能请求合并(pull request),且只接受hotfix、release分支的代码合并。gitlab上做限制。热修复分支:hotfix,针对现场紧急问题、bug修复的代码分...

博信股份新战略后再推新品 TOPPERS E2耳机售价199元

中新网6月21日电 20日,博信股份在北京正式推出新品TOPPERS主动降噪耳机E2,这是博信股份继2月战略暨新品发布会后的第二次新品亮相。价格方面,TOPPERS主动降噪耳机E2零售价199元,并于6月20日下午4点在京东商城公开销售。据介绍,TOPPERS主动降噪耳机E2采用AMS(奥地利微电子...

10款超牛Vim插件,爱不释手了

我是一个忠实的Vim编辑器用户,从事开发工作多年,我一直都非常喜欢使用Vim。轻量、便捷,而且,熟悉了Vim相关的快捷键之后,效率能够成倍的提升。除了这些之外,Vim像很多知名的IDE、编辑器一样,也支持插件配置,通过这些插件,可以实现更多高级、高效的操作。今天,就来给大家分享10个我特别喜欢的Vi...