如何从宿主机获取 Docker 容器的 IP 地址?
docker inspect -f '{{range $name, $net := .NetworkSettings.Networks}}{{$name}} IPv4={{$net.IPAddress}} IPv6={{$net.GlobalIPv6Address}}{{println}}{{end}}' 容器名 即可拿到容器 IP;地址取决于网络驱动和 IPAM,host/none 模式没有独立桥接 IP。本文给出命令与常见网络场景。
一条命令:docker inspect -f '{{range $name, $net := .NetworkSettings.Networks}}{{$name}} IPv4={{$net.IPAddress}} IPv6={{$net.GlobalIPv6Address}}{{println}}{{end}}' <容器名或ID>,直接输出容器在其 Docker 网络中的 IP 地址。地址取决于网络驱动/IPAM,host/none模式没有独立桥接IP,IPv4/IPv6也需分别检查(来自该网络的子网池),多网络容器要按网络名取。
基本命令
docker inspect -f '{{range $name, $net := .NetworkSettings.Networks}}{{$name}} IPv4={{$net.IPAddress}} IPv6={{$net.GlobalIPv6Address}}{{println}}{{end}}' myapp
# 输出示例:bridge IPv4=172.17.0.3 IPv6=
PowerShell使用单引号避免模板中的$被解释:
docker inspect -f '{{range $name, $net := .NetworkSettings.Networks}}{{$name}} IPv4={{$net.IPAddress}} IPv6={{$net.GlobalIPv6Address}}{{println}}{{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 的外部系统对接(临时)
常见问题(FAQ)
Q:为什么 inspect 出来 IP 是空的?
A:容器用 host 网络模式时没有独立 IP(共享宿主机网络),或容器已停止。
Q:宿主机上能直接 ping 通容器 IP 吗?
A:原生Linux宿主常有到网桥路由,但仍取决于网络驱动、防火墙与ICMP支持;Mac/Windows 的 Docker Desktop 因虚拟机隔离,宿主机 ping 不通容器 IP,要走端口映射。
Q:容器之间能用 IP 直连吗?
A:同一用户自定义网络内可以,但推荐用容器名/服务名,IP 可能随重建变化,且TCP服务连通性不能仅用ping判断。