怎么查容器 IP
标准做法是用 docker inspect 加 Go 模板从 NetworkSettings 里取地址。要注意自定义网络下地址不在顶层 IPAddress 字段,而在 Networks 映射里,直接取首层会拿到空字符串,这是这一类命令最常见的踩坑点。
基本信息
| 用途 | 查看容器在某个网络里分配到的 IP |
|---|---|
| 要点 | 自定义网络取 .NetworkSettings.Networks.<网络名>.IPAddress |
| 通用模板 | -f '{{range $n,$v := .NetworkSettings.Networks}}{{$n}}={{$v.IPAddress}} {{end}}' |
| 快捷方式 | docker exec 容器 hostname -i,镜像里要有 hostname 命令 |
| 另一种视角 | docker network inspect 网络名,一次列出全部成员与地址 |
典型使用场景
- 排查容器间连通问题,确认双方是否接在同一网络、地址是否同网段
- 用 IP 直连验证:按地址能通而按名字不通,问题就在名称解析
- 写监控采集配置时快速取到抓取目标地址
- 对照 docker network inspect 的输出,确认容器接入了哪些网络
- 在宿主上抓包或做流量限制时确定要针对哪个容器地址
- 多网络接入的服务排查流量走向,确认它从哪个网络出口访问上游
示例
示例
docker inspect -f '{{range $n, $v := .NetworkSettings.Networks}}{{$n}}={{$v.IPAddress}} {{end}}' web
docker inspect -f '{{.NetworkSettings.Networks.app-net.IPAddress}}' web # 指定网络
docker network inspect app-net --format '{{range .Containers}}{{.Name}} {{.IPv4Address}}{{"\n"}}{{end}}'
docker exec web hostname -i # 镜像里有 hostname 命令时才可用取 IP 的几种方式
| 方式 | 适用情况 | 注意 |
|---|---|---|
| inspect 遍历 Networks | 自定义网络,或接入了多个网络 | 最通用,能一次列出全部网络与地址 |
| inspect 指定网络名 | 已知接入的网络名 | 网络名写错时模板渲染直接报错 |
| network inspect 网络 | 想一次性核对全部成员 | 按网络视角组织,适合批量检查 |
| exec 里执行 hostname -i | 容器内有 hostname 工具 | 极简镜像通常没有这个命令 |
容器 IP 随容器重建而变化,跨容器互访应当用容器名或网络别名(嵌入式 DNS 解析),把 IP 写进配置迟早失效。
同一个容器可以接入多个网络,每个网络各有地址;查连通性时要确认双方是否在同一个网络里,只比地址段容易误判。
compose 创建的网络名通常带项目前缀(如 shop_default),用模板取值时网络名要写完整,否则匹配不到对应那一项。