docker容器固定ip的正确方法是创建自定义bridge网络并启动时指定ip:先用docker network create --subnet=172.30.0.0/24创建网络,再用--network mynet --ip 172.30.0.10运行容器,或在docker-compose中通过ipv4_address配置。

创建自定义 bridge 网络
先建一个带明确子网的自定义桥接网络,比如:
docker network create --driver bridge --subnet=172.30.0.0/24 --gateway=172.30.0.1 mynet
注意:
– --subnet 必须是 CIDR 格式(如 /24),且不能和宿主机或其他 Docker 网络冲突;
– 172.30.0.1 是该子网的网关,会被自动占用,不能分配给容器;
– 172.30.0.0 和 172.30.0.255 是网络地址和广播地址,也不能用。
启动容器时指定固定 IP
运行容器时,用 --network 和 --ip 组合绑定地址:
docker run -d --name nginx-app --network mynet --ip 172.30.0.10 -p 8080:80 nginx
只要 IP 在 172.30.0.1–172.30.0.254 范围内(避开网关和保留地址),且未被其他容器占用,就能成功分配。
用 docker-compose 批量管理
多个服务需要固定 IP 时,推荐用 docker-compose.yml 统一配置:
- 定义网络为外部(即复用上面创建的
mynet) - 每个 service 下通过
ipv4_address指定具体 IP
示例片段:
version: '3.8'
services:
db:
image: postgres
networks:
mynet:
ipv4_address: 172.30.0.20
app:
image: myapp
networks:
mynet:
ipv4_address: 172.30.0.30
networks:
mynet:
external: true
验证和排查
启动后检查是否生效:
-
docker inspect nginx-app | grep IPAddress→ 应输出"IPAddress":"172.30.0.10" - 进容器执行
ip a,看 eth0 的 inet 地址是否匹配 - 如果报错 “IP address already allocated”,说明该 IP 已被占用,换一个再试
已运行的容器不能直接改 IP,需先 docker network disconnect mynet 容器名,再 docker network connect --ip xxx mynet 容器名 重新挂载。











