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 重置:
- Docker 引擎更新(如从 20.10 升级到 24.0)
- 容器重建(
docker-compose down后up) - 网络栈清理(如
docker network prune)
真实案例:某电商团队的 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/16 或 192.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 地址超出范围)导致的网络故障,作者及发布平台不承担相关责任。建议对关键配置进行版本控制及定期备份。