docker容器重启后ip变化是默认bridge网络的设计特性,并非故障;根本解决方式是绕过ip依赖,优先使用自定义bridge网络+容器名通信实现自动dns解析,必要时再通过子网+显式指定固定ip。

Bridge 网络下容器重启后 IP 变化是默认行为,不是故障,而是设计使然。根本解决方式不是“阻止变化”,而是**绕过对 IP 的直接依赖**——用名字通信、用网络隔离、必要时才固定 IP。
用自定义 bridge 网络 + 容器名通信(推荐首选)
默认 bridge 网络不支持 DNS 解析,但自定义 bridge 网络自带内建 DNS,容器能直接用名字访问彼此,IP 变了也不影响。
- 创建新网络:
docker network create mynet - 启动容器并加入该网络:
docker run --name db --network mynet -d mysql和docker run --name app --network mynet -d myapp - 在 app 容器里连数据库,直接写
db:3306,Docker 自动解析成 db 容器当前 IP
需要固定 IP 时:子网 + 显式指定
仅当外部系统硬编码了容器 IP(如旧监控脚本、第三方设备白名单),才需固定。必须配合自定义网络使用,不能在默认 bridge 上操作。
- 创建带子网的网络:
docker network create --subnet=172.30.0.0/24 --gateway=172.30.0.1 mynet - 启动时指定 IP:
docker run --network mynet --ip 172.30.0.10 --name db -d mysql - 注意:172.30.0.0、172.30.0.1(网关)、172.30.0.255 不可分配给容器
避免踩坑的关键点
很多问题其实源于误用默认 bridge 网络或混淆概念:
-
别用
--link:已废弃,依赖 /etc/hosts 同步,不可靠且不支持动态更新 -
别在默认 bridge 上指定
--ip:会报错,该网络不支持静态 IP 分配 -
宿主机访问容器?用
host.docker.internal(Docker Desktop)或查默认网关 IP,而不是记死容器 IP - 多个容器共用一个服务名?用
network_alias在 docker-compose 中设置别名
docker-compose 中的写法示例
比命令行更清晰,适合多容器协作:
version: '3.8'
services:
db:
image: mysql:8
networks:
app_net:
ipv4_address: 172.30.0.10
app:
image: myapp
networks:
- app_net
depends_on:
- db
<p>networks:
app_net:
driver: bridge
ipam:
config:</p>
- subnet: 172.30.0.0/24 gateway: 172.30.0.1











