You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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服务统一接入该网络:

  1. 创建自定义网络,选用未被占用的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
    
  2. 修改所有项目的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
    
  3. 逐个更新项目容器,在每个compose项目目录执行以下命令重启生效:
    docker compose up -d --force-recreate
    
  4. 执行原有inspect命令验证,所有容器IP都会落在172.30.0.0/16网段内。

方案二:修改Docker默认地址池(全局生效,需重启Docker)

修改Docker daemon配置,强制所有新建网络都从172网段分配地址:

  1. 编辑Docker配置文件/etc/docker/daemon.json(如果文件不存在则新建),添加默认地址池配置:
    {
      "default-address-pools": [
        {"base": "172.0.0.0/8", "size": 16}
      ]
    }
    
  2. 重启Docker服务生效,注意该操作会重启主机上所有运行中的容器,需要提前安排停机窗口:
    systemctl restart docker
    
  3. 重启后所有新建的compose网络都会自动分配172段IP,不会再出现192段地址。
补充说明
  • 方案一的共享网络模式下,接入同一个网络的容器可以直接通过容器名互相通信,不需要额外配置
  • 如果不需要跨项目容器互通,优先选方案二,全局生效后不需要修改每个compose文件,保持原有项目网络隔离的特性

内容的提问来源于stack exchange,提问作者Sami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 09:42:24