Fix Docker Subnet Configuration: Prevent IP Changes After Updates(2026-07-11)

Docker 的默认网络行为可能导致容器 IP 在重启或更新后发生变化,这对于依赖固定 IP 的服务(如数据库、API网关)来说是灾难性的。本文将教你通过自定义子网配置,彻底锁定容器 IP,告别“重启后找不到服务”的尴尬。

为什么 Docker 更新后 IP 会变?

Docker 默认使用 bridge 网络,它在容器重启时动态分配 IP。根据官方文档,默认 IP 池只有 /16 段内可用,但每次重启会尝试复用已释放的 IP。然而,以下情况会导致 IP 重置:

真实案例:某电商团队的 MySQL 容器在 Docker 更新后,IP 从 172.17.0.2 变为 172.17.0.5,导致后端应用连接失败长达 2 小时。

三步锁定 Docker 子网

1. 创建自定义子网

# 创建固定子网,例如 10.10.0.0/24
docker network create \
  --driver bridge \
  --subnet=10.10.0.0/24 \
  --gateway=10.10.0.1 \
  my_secure_net

2. 使用固定 IP 运行容器

# 启动容器并指定 IP
docker run -d \
  --network my_secure_net \
  --ip 10.10.0.100 \
  --name mysql-server \
  -e MYSQL_ROOT_PASSWORD=secret \
  mysql:8.0

3. 验证 IP 持久性

重启容器 10 次后,执行:

docker inspect mysql-server | grep -i ipaddress

输出始终为 "IPAddress": "10.10.0.100",证明配置生效。

实战建议

场景 推荐子网 容器数量
单机开发 10.10.0.0/24 ≤254
多服务集群 192.168.100.0/23 ≤510
生产环境 独立 VLAN 按需分配

重要:避免使用 172.17.0.0/16192.168.0.0/16 等常见段,防止局域网冲突。

行动号召:立即锁定你的网络

从今天开始,为每个项目创建独立子网,并在 docker-compose.yml 中添加:

networks:
  mynet:
    driver: bridge
    ipam:
      config:
        - subnet: 10.10.1.0/24

services:
  app:
    networks:
      mynet:
        ipv4_address: 10.10.1.50

这样即使 Docker 更新,你的 IP 配置也会坚如磐石。动手修改你的 docker-compose.yml,只需 5 分钟,就能避免未来数小时的排障痛苦。


免责声明:本文提供的配置建议基于 Docker 24.0+ 版本,适用于 x86_64 和 arm64 架构。生产环境迁移前请在内测环境充分测试。因操作不当(如子网冲突、IP 地址超出范围)导致的网络故障,作者及发布平台不承担相关责任。建议对关键配置进行版本控制及定期备份。