公司现有子网为 172.19.0.0/24
,某研发在使用docker的时候总是会有连不上的情况,排查发现在未配置 Docker 配置文件时,其默认创建的网络可能随机使用 172.17.0.0/16
至 172.31.0.0/16
范围内的子网,存在以下风险:
172.19.0.0/16
子网会覆盖公司的 172.19.0.0/24
网络。通过配置 daemon.json
实现:
bip
),default-address-pools
)daemon.json
文件{
"bip": "192.168.8.1/24",
"default-address-pools": [
{
"base": "172.10.0.0/16",
"size": 24
}
]
}
bip
- 默认网桥子网docker0
桥接网络的子网。"bip": "192.168.8.1/24" // 必须指定网关 IP(而非网段)
"bip": "192.168.8.0/24" // Docker 不会自动分配网关,需显式指定
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
)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
systemctl restart docker
检查默认网桥:
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 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
通过强制指定 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
的冲突。