最稳妥、原生支持的方式是创建自定义bridge网络并用--ip指定静态ip;默认bridge网络不支持该功能,必须先创建带子网和网关的自定义网络(如docker network create --subnet=172.30.0.0/16 --gateway=172.30.0.1 my-net),再运行容器时绑定子网内未被占用的ip(如--ip 172.30.5.10)。

最稳妥、原生支持的方式是创建自定义 bridge 网络,再启动容器时用 --ip 指定地址。默认的 bridge 网络不支持静态 IP,必须绕过它。
创建带子网的自定义网络
这是前提步骤,Docker 不允许在默认网络上指定固定 IP。
- 运行命令创建网络,例如:
docker network create --driver bridge --subnet=172.30.0.0/16 --gateway=172.30.0.1 my-net -
--subnet要覆盖你未来所有容器的 IP 需求,比如/16可容纳 65534 个地址;/24则只有 254 个 -
--gateway建议设为子网第一个可用地址(如172.30.0.1),不能和后续容器 IP 冲突 - 网络名(如
my-net)需全局唯一,后续通过它连接容器
启动容器时绑定固定 IP
IP 必须落在上一步定义的子网范围内,且不能是网关、网络地址或广播地址。
- 示例命令:
docker run -d --name app1 --network my-net --ip 172.30.5.10 -p 8080:80 nginx:alpine - 该 IP 在容器 stop/start 后保持不变,重启不漂移
- 多个容器可共用同一网络,各自分配不同 IP,彼此能直接用 IP 通信
- 验证是否生效:
docker inspect app1 | grep IPAddress或docker exec app1 ip -4 addr show eth0
已有容器补配静态 IP
无法直接修改正在运行容器的 IP,但可通过网络重连间接实现:
- 先断开容器当前网络:
docker network disconnect bridge app1(若连的是默认网桥) - 再接入自定义网络并指定 IP:
docker network connect --ip 172.30.5.10 my-net app1 - 注意:操作后容器内服务可能需手动重启网络相关进程(如某些应用依赖启动时获取的 IP)
用 docker-compose 统一管理多个静态 IP
适合多容器协同部署,配置清晰、可复用。
- 在
docker-compose.yml中声明网络和 IP:version: '3.7' services: web: image: nginx:alpine networks: static-net: ipv4_address: 172.22.0.10 db: image: postgres:13 networks: static-net: ipv4_address: 172.22.0.20 networks: static-net: driver: bridge ipam: config: - subnet: 172.22.0.0/24 gateway: 172.22.0.1 - 运行
docker-compose up -d即自动创建网络并分配对应 IP - IP 地址随
docker-compose down && up持久保留











