必须创建自定义bridge网络并指定子网,再通过docker run --network --ip分配静态ip;默认bridge网络不支持静态ip,已有容器可通过network disconnect+connect --ip间接配置。

给特定 Docker 容器配置静态 IP,核心是**绕过默认 bridge 网络的动态分配机制**,让容器始终获得预设的、不随重启变化的 IPv4 地址。最稳定、原生支持、无需额外工具的方式是使用自定义 bridge 网络配合 --ip 参数。其他方法(如 macvlan 或手动 netns 配置)适用场景更窄,维护成本高,一般不推荐作为首选。
创建带子网和网关的自定义 bridge 网络
这是所有后续操作的前提。Docker 不允许在默认 bridge 网络(bridge)上指定 --ip,必须新建一个用户定义的 bridge 网络,并明确划分地址空间。
- 运行命令创建网络,例如分配
172.30.0.0/16网段,网关为172.30.0.1:
docker network create --driver bridge --subnet=172.30.0.0/16 --gateway=172.30.0.1 my-static-net
-
--subnet必须足够大,能容纳你未来可能部署的所有容器; -
--gateway是该网络内容器默认的出口网关,建议设为子网第一个可用地址; - 网络名(如
my-static-net)需全局唯一,之后启动容器时引用它。
启动容器时绑定固定 IP
在运行容器命令中,通过 --network 和 --ip 两个参数联合指定地址,且 IP 必须落在上一步定义的子网范围内。
- 示例:启动一个 Nginx 容器,固定 IP 为
172.30.5.10:
docker run -d --name web-app --network my-static-net --ip 172.30.5.10 -p 8080:80 nginx:alpine
-
--ip值不能是网关地址(如172.30.0.1),也不能是网络地址(172.30.0.0)或广播地址(172.30.255.255); - 该 IP 在容器整个生命周期(包括 stop/start)中保持不变;
- 多个容器可共用同一网络,各自分配不同 IP,彼此可通过 IP 直接通信。
验证 IP 是否生效并持久化
不要只看 docker inspect 的一次输出,要确认重启后是否依然有效。
- 查看当前 IP:
docker inspect -f '{{.NetworkSettings.Networks.my-static-net.IPAddress}}' web-app
- 重启容器后再次执行上条命令,结果应完全一致;
- 进入容器内部检查网卡配置:
docker exec web-app ip -4 addr show eth0 | grep 'inet '
- 输出中应明确显示
inet 172.30.5.10/16(掩码位数由 subnet 决定); - 如果使用了
docker-compose,可在 service 下的networks中直接写ipv4_address: 172.30.5.10,效果等同。
哪些方式不建议常规使用
虽然技术上可行,但存在明显短板,仅在特殊需求下考虑:
- macvlan 网络:容器会直接出现在物理局域网中,获得与宿主机同网段的真实 IP。但要求宿主机网卡支持混杂模式,且容易引发 IP 冲突或交换机端口安全限制;
- --net=none + 手动 netns 配置:需在宿主机上创建 veth 对、桥接、设置路由、进容器命名空间配 IP。过程繁琐,脚本易出错,容器重启后 IP 丢失,必须二次执行;
- pipework 工具:第三方脚本,非 Docker 原生,已多年未更新,兼容性差,Docker 版本升级后常失效。











