docker inspect 详细信息

docker inspect 详细信息

面试题

如何获取 Docker 容器和镜像的完整详细信息?docker inspect 返回了哪些关键数据?

标准答案

docker inspect 是 Docker 的”万能查看器”,返回容器、镜像、网络、卷等对象的完整 JSON 元数据。它返回的内容非常丰富,是排障和自动化运维的核心命令。

基本用法

# 查看容器详细信息
docker inspect my-container

# 查看镜像信息
docker inspect nginx:alpine

# 查看网络信息
docker inspect bridge

# 查看数据卷信息
docker inspect my-volume

# 不截断输出结果
docker inspect --no-trunc my-container

# 同时查看多个对象
docker inspect container1 container2 volume1

返回 JSON 结构

[
  {
    "Id": "a1b2c3d4...",
    "Created": "2024-01-01T10:00:00Z",
    "Path": "nginx",
    "Args": [],
    "State": {
      "Status": "running",
      "Running": true,
      "Paused": false,
      "Restarting": false,
      "OOMKilled": false,
      "Dead": false,
      "Pid": 12345,
      "ExitCode": 0,
      "Error": "",
      "StartedAt": "2024-01-01T10:00:01Z",
      "FinishedAt": "0001-01-01T00:00:00Z"
    },
    "Image": "sha256:abc...",
    "ResolvConfPath": "/var/lib/docker/containers/.../resolv.conf",
    "HostnamePath": "/var/lib/docker/containers/.../hostname",
    "HostsPath": "/var/lib/docker/containers/.../hosts",
    "LogPath": "/var/lib/docker/containers/.../json.log",
    "Name": "/my-container",
    "RestartCount": 0,
    "Driver": "overlay2",
    "MountLabel": "",
    "ProcessLabel": "",
    "AppArmorProfile": "",
    "ExecIDs": null,
    "HostConfig": {
      "Binds": null,
      "ContainerIDFile": "",
      "LogConfig": {
        "Type": "json-file",
        "Config": {}
      },
      "NetworkMode": "default",
      "PortBindings": {
        "80/tcp": [{"HostIp": "", "HostPort": "8080"}]
      },
      "RestartPolicy": {
        "Name": "always",
        "MaximumRetryCount": 0
      },
      "AutoRemove": false,
      "VolumeDriver": "",
      "VolumesFrom": null,
      "CapAdd": null,
      "CapDrop": null,
      "CgroupParent": "",
      "Dns": [],
      "DnsOptions": [],
      "DnsSearch": [],
      "ExtraHosts": null,
      "GroupAdd": null,
      "IpcMode": "private",
      "CgroupMode": "host",
      "OomKillDisable": false,
      "Memory": 536870912,       // 512MB(单位:字节)
      "MemorySwap": 1073741824,  // 1GB
      "MemoryReservation": 268435456,
      "KernelMemory": 0,
      "CpuShares": 1024,
      "CpuPeriod": 100000,
      "CpuQuota": 0,
      "CpusetCpus": "",
      "NanoCpus": 0,
      "Runtime": "runc"
    },
    "Config": {
      "Hostname": "a1b2c3d4",
      "Domainname": "",
      "User": "",
      "AttachStdin": false,
      "AttachStdout": false,
      "AttachStderr": false,
      "ExposedPorts": {"80/tcp": {}},
      "Tty": false,
      "OpenStdin": false,
      "StdinOnce": false,
      "Env": ["PATH=/usr/local/sbin:...", "NGINX_VERSION=1.24"],
      "Cmd": ["nginx", "-g", "daemon off;"],
      "Image": "nginx:alpine",
      "Volumes": null,
      "WorkingDir": "/",
      "Entrypoint": null,
      "OnBuild": null,
      "Labels": {}
    },
    "NetworkSettings": {
      "Bridge": "",
      "SandboxID": "",
      "HairpinMode": false,
      "LinkLocalIPv6Address": "",
      "LinkLocalIPv6PrefixLen": 0,
      "Ports": {
        "80/tcp": [{
          "HostIp": "0.0.0.0",
          "HostPort": "8080"
        }]
      },
      "SandboxKey": "/var/run/docker/netns/...",
      "SecondaryIPAddresses": null,
      "SecondaryIPv6Addresses": null,
      "EndpointID": "",
      "Gateway": "172.17.0.1",
      "GlobalIPv6Address": "",
      "GlobalIPv6PrefixLen": 0,
      "IPAddress": "172.17.0.2",
      "IPPrefixLen": 16,
      "IPv6Gateway": "",
      "MacAddress": "02:42:ac:11:00:02",
      "Networks": {
        "bridge": {
          "IPAMConfig": null,
          "Links": null,
          "Aliases": null,
          "NetworkID": "abc...",
          "EndpointID": "def...",
          "Gateway": "172.17.0.1",
          "IPAddress": "172.17.0.2",
          "IPPrefixLen": 16,
          "IPv6Gateway": "",
          "GlobalIPv6Address": "",
          "GlobalIPv6PrefixLen": 0,
          "MacAddress": "02:42:ac:11:00:02",
          "DriverOpts": null
        }
      }
    }
  }
]

常用提取技巧

# 配合 --format 获取特定字段(最常用)
# 获取容器 IP 地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' my-container

# 获取容器状态
docker inspect --format='{{.State.Status}}' my-container

# 获取端口映射
docker inspect --format='{{json .NetworkSettings.Ports}}' my-container

# 获取挂载信息
docker inspect --format='{{json .Mounts}}' my-container

# 获取重启次数
docker inspect --format='{{.RestartCount}}' my-container

# 获取日志路径
docker inspect --format='{{.LogPath}}' my-container

# 获取容器 PID(宿主机视角)
docker inspect --format='{{.State.Pid}}' my-container

# 获取镜像名称和版本
docker inspect --format='{{.Config.Image}}' my-container

# 获取启动命令
docker inspect --format='{{.Config.Cmd}}' my-container

搭配 jq 使用(更灵活)

# 获取容器名称和状态(所有容器)
docker inspect $(docker ps -aq) | jq '.[] | {name: .Name, status: .State.Status}'

# 查找使用 specific network 的容器
docker inspect $(docker ps -q) | jq '.[] | select(.NetworkSettings.Networks.my_net != null) | .Name'

# 获取容器的资源限制
docker inspect myapp | jq '.[0].HostConfig | {Memory, MemorySwap, CpuShares}'

针对镜像的 inspect

# 查看镜像详细信息
docker inspect nginx:alpine

# 关键字段
# - RepoTags: 镜像标签列表
# - RepoDigests: 镜像摘要(hash)
# - Created: 创建时间
# - DockerVersion: 构建时的 Docker 版本
# - Os/Architecture: 系统架构
# - RootFS.Layers: 各层的 hash 值
# - Config.Env: 默认环境变量
# - Config.ExposedPorts: 暴露的端口
# - Size: 镜像大小

# 获取镜像层数
docker inspect --format='{{len .RootFS.Layers}}' nginx:alpine

# 获取镜像大小(字节)
docker inspect --format='{{.Size}}' nginx:alpine

高级用法

1. 获取容器网络配置快照

NET_INFO=$(docker inspect --format='{{json .NetworkSettings.Networks}}' myapp)
echo $NET_INFO | jq '.'

2. 批量检查健康状态

for container in $(docker ps -q); do
  status=$(docker inspect --format='{{.State.Health.Status}}' $container 2>/dev/null)
  name=$(docker inspect --format='{{.Name}}' $container)
  echo "$name: $status"
done

3. 获取所有绑定端口

docker inspect --format='{{json .NetworkSettings.Ports}}' nginx | jq 'keys'

常见面试追问

问:–format 和 jq 哪个更好?

--format 简单快捷,适合获取单个值;jq 适合复杂的 JSON 处理(条件过滤、聚合、格式化输出)。建议都掌握。

问:如何通过 inspect 判断容器是否设置了健康检查?

docker inspect --format='{{.Config.Healthcheck}}' myapp
# 如果返回 ,表示没有配置健康检查

问:如何从 inspect 输出中快速定位配置问题?

查看 HostConfig 与期望配置是否一致。例如端口映射是否正确、挂载路径是否正确、重启策略是否符合预期。

总结

docker inspect 是排查问题的终极工具——几乎所有容器、镜像、网络、卷的配置信息都能从中获取。重点掌握 --format 参数和与 jq 的组合使用,让 JSON 输出变得可读和可编程。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容