Docker Compose分配容器IP网段不一致 如何强制统一使用172段IP
问题原因
容器出现192.168开头的IP,是Docker自动选段的正常现象:
- Docker默认的地址池包含
172.16.0.0/12、192.168.0.0/16、10.0.0.0/8三个私有网段,默认从172.17.0.0/16开始为每个新建的bridge网络按顺序分配网段,你看到的大量172.x地址就是每个compose项目独立创建的默认网络所分配的地址 - 当172段出现地址冲突或者可用地址不足时,Docker会自动从192.168或10段分配网段,你看到的两个192段地址的容器,就是接入了自动分配到192段的项目网络;如果开启了swarm模式,也可能是接入了192段的overlay网络。
解决方案
无需给容器配置静态IP,以下两种方案都可以强制所有容器分配172段IP,按需选择即可。
方案一:共享自定义网络(无业务中断风险,推荐)
提前创建固定172网段的自定义bridge网络,让所有compose服务统一接入该网络:
- 创建自定义网络,选用未被占用的172网段(避开现有172.19~172.26段防止冲突):
docker network create --subnet=172.30.0.0/16 --opt com.docker.network.bridge.name=docker-shared shared_172_net - 修改所有项目的
docker-compose.yaml,在服务配置中指定接入该外部网络,示例配置如下:services: myAppX: container_name: myprojectX build: context: . dockerfile: ./.docker/Dockerfile env_file: .env ports: - 8009:80 volumes: - ${DIR_IMAGES_MAPS}:/app/public/maps networks: - shared_172_net networks: shared_172_net: external: true - 逐个更新项目容器,在每个compose项目目录执行以下命令重启生效:
docker compose up -d --force-recreate - 执行原有inspect命令验证,所有容器IP都会落在
172.30.0.0/16网段内。
方案二:修改Docker默认地址池(全局生效,需重启Docker)
修改Docker daemon配置,强制所有新建网络都从172网段分配地址:
- 编辑Docker配置文件
/etc/docker/daemon.json(如果文件不存在则新建),添加默认地址池配置:{ "default-address-pools": [ {"base": "172.0.0.0/8", "size": 16} ] } - 重启Docker服务生效,注意该操作会重启主机上所有运行中的容器,需要提前安排停机窗口:
systemctl restart docker - 重启后所有新建的compose网络都会自动分配172段IP,不会再出现192段地址。
补充说明
- 方案一的共享网络模式下,接入同一个网络的容器可以直接通过容器名互相通信,不需要额外配置
- 如果不需要跨项目容器互通,优先选方案二,全局生效后不需要修改每个compose文件,保持原有项目网络隔离的特性
内容的提问来源于stack exchange,提问作者Sami
相关产品推荐
相关产品推荐

