- 容器有问题先
docker logs 看日志
- 日志看不出来再用
docker inspect 查配置
- 配置没问题就进容器
docker exec 排查
docker inspect 才是排查问题的大杀器,容器的所有信息都在里面。
1. 基础用法
1.1 查看容器完整信息
1 2 3 4 5
| docker inspect my-nginx
docker inspect my-nginx | less
|
1.2 查看镜像信息
1 2 3 4 5
| docker inspect nginx:latest
docker inspect nginx:latest | grep Layers -A 20
|
2. 精准提取信息
2.1 获取容器IP
1 2 3 4 5 6 7 8
| docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-nginx
docker inspect -f '{{.NetworkSettings.Networks.bridge.IPAddress}}' my-nginx
docker inspect my-nginx | jq -r '.[0].NetworkSettings.IPAddress'
|
2.2 查看端口映射
1 2 3 4 5 6 7 8
| docker inspect -f '{{.NetworkSettings.Ports}}' my-nginx
docker inspect my-nginx | grep -A 10 '"Ports"'
docker port my-nginx
|
2.3 查看挂载的数据卷
1 2 3 4 5 6 7 8
| docker inspect -f '{{.Mounts}}' my-nginx
docker inspect my-nginx | jq '.[0].Mounts'
docker inspect -f '{{range .Mounts}}{{.Source}} -> {{.Destination}}{{"\n"}}{{end}}' my-nginx
|
2.4 查看环境变量
1 2 3 4 5 6 7 8
| docker inspect -f '{{.Config.Env}}' my-nginx
docker inspect my-nginx | jq '.[0].Config.Env'
docker inspect my-nginx | grep MYSQL_ROOT_PASSWORD
|
2.5 查看容器状态
1 2 3 4 5 6 7 8 9 10 11
| 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
|
3. 网络相关
3.1 查看网络配置
1 2 3 4 5 6 7 8
| docker inspect -f '{{.NetworkSettings.Networks}}' my-nginx
docker inspect -f '{{range .NetworkSettings.Networks}}{{.Gateway}}{{end}}' my-nginx
docker inspect -f '{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' my-nginx
|
3.2 查看DNS配置
1 2 3 4 5
| docker inspect -f '{{.HostConfig.Dns}}' opsnot-nginx
docker inspect -f '{{.HostConfig.ExtraHosts}}' opsnot-nginx
|
4. 资源限制
4.1 查看内存限制
1 2 3 4 5 6 7 8
| docker inspect -f '{{.HostConfig.Memory}}' opsnot-nginx
docker inspect opsnot-nginx | jq '.[0].HostConfig.Memory / 1024 / 1024'
docker inspect -f '{{.HostConfig.MemoryReservation}}' opsnot-nginx
|
4.2 查看CPU限制
1 2 3 4 5 6 7 8
| docker inspect -f '{{.HostConfig.CpuQuota}}' my-nginx
docker inspect -f '{{.HostConfig.CpuShares}}' my-nginx
docker inspect -f '{{.HostConfig.NanoCpus}}' my-nginx
|
5. 日志相关
5.1 查看日志配置
1 2 3 4 5 6 7 8
| docker inspect -f '{{.HostConfig.LogConfig.Type}}' my-nginx
docker inspect -f '{{.HostConfig.LogConfig.Config}}' my-nginx
docker inspect -f '{{.LogPath}}' my-nginx
|
6. 重启策略
1 2 3 4 5 6 7 8
| docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' my-nginx
docker inspect -f '{{.RestartCount}}' my-nginx
docker inspect -f '{{.HostConfig.RestartPolicy.MaximumRetryCount}}' my-nginx
|
7. 镜像层信息
1 2 3 4 5 6 7 8
| docker inspect -f '{{.Image}}' my-nginx
docker inspect nginx:latest | jq '.[0].RootFS.Layers'
docker inspect nginx:latest | jq '.[0].Config.Cmd'
|
8. 实战技巧
8.1 批量查询容器信息
1 2 3 4 5 6 7 8 9 10 11
| docker ps -q | xargs -I {} docker inspect -f '{{.Name}} {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' {}
docker ps -aq | xargs docker inspect -f '{{.Name}} {{.State.Status}}'
for container in $(docker ps -q); do echo "=== $(docker inspect -f '{{.Name}}' $container) ===" docker inspect $container > ${container}_config.json done
|
8.2 对比两个容器配置差异
1 2 3 4 5 6 7 8
| docker inspect ops-not-container1 > c1.json docker inspect ops-not-container2 > c2.json diff c1.json c2.json
diff <(docker inspect ops-not-container1 | jq '.[0].Config') \ <(docker inspect ops-not-container2 | jq '.[0].Config')
|
8.3 检查容器健康状态
1 2 3 4 5 6 7 8
| docker inspect -f '{{.Config.Healthcheck}}' opsnot-kafka
docker inspect -f '{{.State.Health.Status}}' opsnot-kafka
docker inspect opsnot-kafka | jq '.[0].State.Health.Log[-1]'
|
8.4 查看容器创建命令(反推)
1 2 3 4 5 6
| docker inspect opsnot-tomcat | jq '.[0].Config, .[0].HostConfig'
|
8.5 监控脚本示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #!/bin/bash
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
|
9. 常用组合命令
9.1 快速诊断容器问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
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
|
9.2 生成容器配置报告
1 2 3 4 5 6 7 8 9 10 11
| 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
|
本文来自 opsnot.com。