给容器指定固定地址
在创建时就声明了子网的网络里,可以用 --ip 给容器指定一个固定地址。两个前提:网络创建时写了 --subnet,指定的地址落在该子网内且没有被占用。默认 bridge 网络不支持这个参数,只有用户自定义网络可以。要留意的是静态地址只在容器接入期间有效,容器删除重建后需要再次指定,依赖固定地址的配置因此比较脆。
基本信息
| 前提条件 | 网络创建时已声明 --subnet |
|---|---|
| 语法 | --network 网络名 --ip 地址 |
| 限制 | 默认 bridge 不支持,仅用户自定义网络可用 |
| 持续性 | 容器重建后需重新指定 |
典型使用场景
- 联调对接:对端系统只认固定地址,临时指定便于打通链路
- 迁移过渡:从虚拟机迁到容器时沿用原地址,减少对端改配置
- 白名单管理:上游按 IP 放行,固定地址后不必频繁调整规则
- 多网段规划:按业务划分不同子网,把关键服务放到固定地址上
- 排障复现:需要与故障现场完全一致的地址条件
指定与核对
指定与核对
# 创建带子网的网络
docker network create --subnet 172.30.0.0/24 app-net
# 用固定地址启动容器
docker run -d --network app-net --ip 172.30.0.10 --name db postgres:16-alpine
# 核对容器地址与占用情况
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' db
docker network inspect app-net --format '{{range .Containers}}{{.Name}} {{.IPv4Address}} {{end}}'地址分配方式对照
| 方式 | 稳定性 | 适用场景 |
|---|---|---|
| 自动分配 | 重建后可能变化 | 常规业务容器 |
| --ip 静态指定 | 重建后需重新指定 | 依赖固定地址的联调与迁移 |
| 按名称解析 | 与地址解耦 | 服务之间的互相调用 |
| macvlan 独立地址 | 物理网段内固定 | 需要与局域网设备同网段 |
静态地址只在容器接入期间有效,容器删除重建时要重新指定,编排文件里写死的地址在缩放场景下会直接冲突。
依赖固定地址的配置在容器重建后容易断链,能用名称解析的调用关系就不要写 IP。