最可靠方式是使用docker inspect -f '{{.networksettings.networks..ipaddress}}',因docker 20.10+已弃用.networksettings.ipaddress,需明确指定网络名(如bridge或自定义网络名)才能准确获取ipv4地址。

直接用 docker inspect 查容器 IP 最可靠的方式,是明确指定网络层级和字段路径。新版 Docker(20.10+)已弃用顶层的 .NetworkSettings.IPAddress,必须深入 .NetworkSettings.Networks 结构才能拿到准确值。
确认容器使用的网络名
容器可能连接多个网络(如 bridge、my-net 或 default),IP 地址按网络分别分配。先查清它连的是哪个:
- 运行
docker inspect | grep -A 10 "Networks",看输出中类似"bridge": {或"my-net": {的键名 - 或者更清晰地列出所有网络名:
docker inspect -f '{{range $k,$v := .NetworkSettings.Networks}}{{$k}} {{end}}'
按网络名精确提取 IPv4 地址
知道网络名后,用 -f 模板直接读取对应 IP:
- 默认 bridge 网络:
docker inspect -f '{{.NetworkSettings.Networks.bridge.IPAddress}}' - 自定义网络(比如叫
app-net):docker inspect -f '{{.NetworkSettings.Networks.app-net.IPAddress}}' - 不确定网络名又想“通吃”一个 IP(取第一个非空):
docker inspect -f '{{range .NetworkSettings.Networks}}{{if .IPAddress}}{{.IPAddress}}{{end}}{{end}}'
注意 IPv6 地址不会自动出现
即使宿主机支持 IPv6,Docker 默认 bridge 网络也不启用 IPv6。所以 .GlobalIPv6Address 字段为空是正常现象,不是命令错:
- 要启用 IPv6,需在 daemon 启动时加
--ipv6 --fixed-cidr-v6=2001:db8:1::/64 - 或创建独立 IPv6 网络:
docker network create --ipv6 --subnet=2001:db8:2::/64 my-ipv6-net,再运行容器时指定--network=my-ipv6-net
常见失败原因排查
如果 inspect 返回空或报错,别急着重试,先检查这几个点:
- 容器已停止?
docker ps默认只显示运行中容器,加-a才能看到全部;inspect对已停止容器依然有效 - 名字输错了?用
docker ps -a --format "{{.Names}}\t{{.ID}}"核对准确名称或完整 ID - 在 Swarm 模式下?
docker inspect不能直接查 service 的 IP,得先docker service ps找出实际 task 容器名,再 inspect 那个容器 - 权限问题?非 root 用户需确保已加入
docker用户组,否则可能静默失败











