
Docker子网冲突解决方案
Docker子网冲突解决方案及配置说明
问题描述
公司现有子网为 172.19.0.0/24
,某研发在使用docker的时候总是会有连不上的情况,排查发现在未配置 Docker 配置文件时,其默认创建的网络可能随机使用 172.17.0.0/16
至 172.31.0.0/16
范围内的子网,存在以下风险:
- Docker 若分配
172.19.0.0/16
子网会覆盖公司的172.19.0.0/24
网络。 - 导致 IP 地址冲突,引发网络通信异常。
解决方案
通过配置 daemon.json
实现:
- 指定默认网桥子网docker0(
bip
), - 限制其他网络的地址池范围(
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 不会自动分配网关,需显式指定
(2) 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:
- tsingyun
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
总结
通过强制指定 bip
和 default-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
的冲突。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 运维小弟
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果