只会 docker ps、docker logs?遇到复杂问题基本就懵了。
其实 docker inspect 才是排查问题的大杀器,容器的所有信息都在里面。
# 查看容器所有信息(opsnot常用)
docker inspect my-nginx
# 输出是JSON格式,信息巨多(加班哥提醒!)
docker inspect my-nginx | less
# 查看镜像详情
docker inspect nginx:latest
# 查看镜像分层
docker inspect nginx:latest | grep Layers -A 20
# 方法1:直接获取IP(opsnot.com推荐)
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-nginx
# 方法2:获取指定网络的IP(加班哥常用)
docker inspect -f '{{.NetworkSettings.Networks.bridge.IPAddress}}' my-nginx
# 方法3:用jq处理(需要安装jq)
docker inspect my-nginx | jq -r '.[0].NetworkSettings.IPAddress'
# 查看所有端口映射
docker inspect -f '{{.NetworkSettings.Ports}}' my-nginx
# 更清晰的格式
docker inspect my-nginx | grep -A 10 '"Ports"'
# 或者用这个更简单
docker port my-nginx
# 查看所有挂载点
docker inspect -f '{{.Mounts}}' my-nginx
# 更友好的查看方式(加班哥推荐)
docker inspect my-nginx | jq '.[0].Mounts'
# 只看数据卷路径(opsnot.com常用)
docker inspect -f '{{range .Mounts}}{{.Source}} -> {{.Destination}}{{"\n"}}{{end}}' my-nginx
# 查看所有环境变量
docker inspect -f '{{.Config.Env}}' my-nginx
# 用jq格式化
docker inspect my-nginx | jq '.[0].Config.Env'
# 查看是否包含特定环境变量
docker inspect my-nginx | grep MYSQL_ROOT_PASSWORD
# 查看运行状态
docker inspect -f '{{.State.Status}}' my-nginx
# 查看容器启动时间
docker inspect -f '{{.State.StartedAt}}' my-nginx
# 查看容器退出代码(排查容器挂掉的原因)
docker inspect -f '{{.State.ExitCode}}' my-nginx
# 查看容器是否在重启
docker inspect -f '{{.State.Restarting}}' my-nginx
# 查看容器所在网络
docker inspect -f '{{.NetworkSettings.Networks}}' my-nginx
# 查看网关
docker inspect -f '{{range .NetworkSettings.Networks}}{{.Gateway}}{{end}}' my-nginx
# 查看MAC地址
docker inspect -f '{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' my-nginx
# 查看DNS服务器
docker inspect -f '{{.HostConfig.Dns}}' opsnot-nginx
# 查看/etc/hosts配置
docker inspect -f '{{.HostConfig.ExtraHosts}}' opsnot-nginx
# 查看内存限制(返回字节数)
docker inspect -f '{{.HostConfig.Memory}}' opsnot-nginx
# 转换成可读格式(需要计算)
docker inspect opsnot-nginx | jq '.[0].HostConfig.Memory / 1024 / 1024'
# 查看内存预留
docker inspect -f '{{.HostConfig.MemoryReservation}}' opsnot-nginx
# 查看CPU配额
docker inspect -f '{{.HostConfig.CpuQuota}}' my-nginx
# 查看CPU权重
docker inspect -f '{{.HostConfig.CpuShares}}' my-nginx
# 查看CPU核心数限制
docker inspect -f '{{.HostConfig.NanoCpus}}' my-nginx
# 查看日志驱动
docker inspect -f '{{.HostConfig.LogConfig.Type}}' my-nginx
# 查看日志选项(大小限制等)
docker inspect -f '{{.HostConfig.LogConfig.Config}}' my-nginx
# 查看日志路径
docker inspect -f '{{.LogPath}}' my-nginx
# 查看重启策略
docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' my-nginx
# 查看重启次数
docker inspect -f '{{.RestartCount}}' my-nginx
# 查看最大重启次数
docker inspect -f '{{.HostConfig.RestartPolicy.MaximumRetryCount}}' my-nginx
# 查看镜像ID
docker inspect -f '{{.Image}}' my-nginx
# 查看镜像的所有层
docker inspect nginx:latest | jq '.[0].RootFS.Layers'
# 查看镜像构建参数
docker inspect nginx:latest | jq '.[0].Config.Cmd'
# 查询所有容器的IP(opsnot常用)
docker ps -q | xargs -I {} docker inspect -f '{{.Name}} {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' {}
# 查询所有容器的状态
docker ps -aq | xargs docker inspect -f '{{.Name}} {{.State.Status}}'
# opsnot脚本:导出所有容器配置
for container in $(docker ps -q); do
echo "=== $(docker inspect -f '{{.Name}}' $container) ==="
docker inspect $container > ${container}_config.json
done
# 导出两个容器配置之后 diff
docker inspect ops-not-container1 > c1.json
docker inspect ops-not-container2 > c2.json
diff c1.json c2.json
# 或者可以用jq对比特定字段(opsnot提示:需要安装jq)
diff <(docker inspect ops-not-container1 | jq '.[0].Config') \
<(docker inspect ops-not-container2 | jq '.[0].Config')
# 查看健康检查配置
docker inspect -f '{{.Config.Healthcheck}}' opsnot-kafka
# 查看健康检查结果
docker inspect -f '{{.State.Health.Status}}' opsnot-kafka
# 查看最近的健康检查日志(opsnot常用)
docker inspect opsnot-kafka | jq '.[0].State.Health.Log[-1]'
# 虽然无法完全还原,但能看到大部分配置
docker inspect opsnot-tomcat | jq '.[0].Config, .[0].HostConfig'
# opsnot.com提示:可以用runlike工具还原
# pip install runlike
# runlike opsnot-tomcat
#!/bin/bash
# opsnot.com容器监控脚本
for container in $(docker ps -q); do
name=$(docker inspect -f '{{.Name}}' $container)
status=$(docker inspect -f '{{.State.Status}}' $container)
restart_count=$(docker inspect -f '{{.RestartCount}}' $container)
memory=$(docker inspect -f '{{.HostConfig.Memory}}' $container)
echo "容器: $name"
echo " 状态: $status"
echo " 重启次数: $restart_count"
echo " 内存限制: $((memory/1024/1024))MB"
echo "---"
done
# opsnot.com故障诊断一键脚本
#!/bin/bash
CONTAINER=$1
echo "=== 容器基本信息 ==="
docker inspect -f '名称: {{.Name}}' $CONTAINER
docker inspect -f '状态: {{.State.Status}}' $CONTAINER
docker inspect -f '退出码: {{.State.ExitCode}}' $CONTAINER
docker inspect -f '重启次数: {{.RestartCount}}' $CONTAINER
echo -e "\n=== 网络信息 ==="
docker inspect -f 'IP: {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $CONTAINER
docker inspect -f '端口: {{.NetworkSettings.Ports}}' $CONTAINER
echo -e "\n=== 资源信息 ==="
docker inspect -f '内存限制: {{.HostConfig.Memory}}' $CONTAINER
docker inspect -f 'CPU限制: {{.HostConfig.NanoCpus}}' $CONTAINER
echo -e "\n=== 日志路径 ==="
docker inspect -f '{{.LogPath}}' $CONTAINER
# 生成容器配置报告(加班哥常用)
docker inspect ops-not-nginx | jq '{
Name: .[0].Name,
Status: .[0].State.Status,
Image: .[0].Config.Image,
IP: .[0].NetworkSettings.IPAddress,
Ports: .[0].NetworkSettings.Ports,
Volumes: .[0].Mounts,
Memory: .[0].HostConfig.Memory,
RestartPolicy: .[0].HostConfig.RestartPolicy
}' > container_report.json
docker inspect 用途极其广泛,建议保存几个常用的查询命令,遇到问题直接复制粘贴,说不定关键时刻能救命。比如一些常见的故障,ip冲突、dns无效、日志暴增、环境变量问题 等等
加班哥现在的习惯是:
1. 容器有问题先看 docker logs
2. 日志看不出来再用 docker inspect 查配置
3. 配置没问题就进容器 docker exec 排查
本文由 opsnot.com 整理,转载请注明出处