如何从宿主机获取 Docker 容器的 IP 地址?
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 容器名 即可拿到容器 IP;容器在哪个网络就有哪个网段的 IP。本文给出命令与常见网络场景。
一条命令:docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <容器名或ID>,直接输出容器在其 Docker 网络中的 IP 地址。容器接入的每个网络都会分配一个 IP(来自该网络的子网池),多网络容器要按网络名取。
基本命令
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' myapp
# 输出示例:172.17.0.3
Windows PowerShell 里换成双引号:
docker inspect -f "{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}" myapp
容器接了多个网络
docker compose 项目常把容器接进多个网络,先看有哪些:
docker inspect -f '{{json .NetworkSettings.Networks}}' myapp | python3 -m json.tool
取指定网络的 IP:
docker inspect -f '{{with index .NetworkSettings.Networks "myapp_default"}}{{.IPAddress}}{{end}}' myapp
重要提醒:容器 IP 不稳定
- 每次重建都会变:容器删除重建后 IP 重新分配,不要把 IP 写死进配置
- 服务间通信用服务名:同一 compose 网络内用服务名(Docker 内置 DNS),比 IP 可靠得多
- 从外部访问用端口映射:
docker run -p 8080:80,外部走宿主机 IP+端口,而不是容器 IP
什么时候真的需要容器 IP
- 排查网络连通性(
ping、telnet 容器IP 端口) - 写防火墙/路由规则调试
- 与没用 Docker DNS 的外部系统对接(临时)
观测云对照
动态 IP 环境下用标签而非 IP 做检索。 容器 IP 漂移是常态,观测云按容器名、镜像、Pod 等元数据打标,日志与指标按标签聚合查询,IP 变化不影响检索与告警规则。
常见问题(FAQ)
Q:为什么 inspect 出来 IP 是空的?
A:容器用 host 网络模式时没有独立 IP(共享宿主机网络),或容器已停止。
Q:宿主机上能直接 ping 通容器 IP 吗?
A:Linux 默认可以(同网桥);Mac/Windows 的 Docker Desktop 因虚拟机隔离,宿主机 ping 不通容器 IP,要走端口映射。
Q:容器之间能用 IP 直连吗?
A:同一用户自定义网络内可以,但推荐用容器名/服务名,IP 会随重建变化。