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

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

问题描述

公司现有子网为 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 实现:

  1. 指定默认网桥子网docker0bip),
  2. 限制其他网络的地址池范围default-address-pools

1. 修改 daemon.json 文件

json 复制代码
{
  "bip": "192.168.8.1/24",
  "default-address-pools": [
    {
      "base": "172.10.0.0/16",
      "size": 24
    }
  ]
}

2. 关键配置解释

(1) bip - 默认网桥子网
  • 作用 :控制 docker0 桥接网络的子网。

  • 正确写法

    json 复制代码
    "bip": "192.168.8.1/24"  // 必须指定网关 IP(而非网段)
  • 错误写法

    json 复制代码
    "bip": "192.168.8.0/24"  // Docker 不会自动分配网关,需显式指定
(2) default-address-pools - 其他网络地址池
  • 作用 :限制用户自定义网络(bridgeoverlay)的子网范围。
  • 参数说明
    • base: 基础网段(172.10.0.0/16 表示允许分配 172.10.0.0 ~ 172.10.255.0 子网)
    • size: 每个子网掩码位数(24 表示每个子网为 /24 格式,例如 172.10.5.0/24

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

bash 复制代码
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 服务

bash 复制代码
systemctl restart docker

5. 验证配置

  • 检查默认网桥

    bash 复制代码
    ip addr show docker0 | grep inet
    # 输出示例:inet 192.168.8.1/24
  • 测试新网络子网分配

    bash 复制代码
    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 的冲突。

相关推荐
曲幽16 小时前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
武子康2 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
Alsn865 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
2601_961875246 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant
java_cj6 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes
程序员老赵6 天前
服务器没有桌面?Docker 跑个 Chrome,浏览器就能远程用
docker·容器·devops
杨浦老苏6 天前
轻量级Docker仪表板Servedash
运维·docker·监控·群晖·仪表板
正经教主6 天前
【docker基础】 第八周:容器监控与应用更新策略
运维·docker·容器
kiros_wang6 天前
Docker 使用完整指南
运维·docker·容器
正经教主6 天前
【docker基础】第九周:Docker安全与镜像优化
运维·docker·容器