当前位置: 首页 > java >正文

【Linux】Docker洞察:掌握docker inspect命令与Go模板技巧

👨‍🎓博主简介

  🏅CSDN博客专家
  🏅云计算领域优质创作者
  🏅华为云开发者社区专家博主
  🏅阿里云开发者社区专家博主
💊交流社区:运维交流社区 欢迎大家的加入!
🐋 希望大家多多支持,我们一起进步!😄
🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏 ⭐️ 加关注+💗


在这里插入图片描述

文章目录

    • 0️⃣ 前言
      • ① `docker inspect` 是做什么的?
      • ② 为什么要用 Go template ?
    • 1️⃣ 基本语法
    • 2️⃣ JSON → Go template 翻译法
      • 📌 原始 JSON(随便选了几个参数作为参考)
      • ✅ 基础:嵌套对象用点号
      • ✅ 进阶:数组 / map[键值对集合] 用 `index` 或 `range`
      • ✅ 高级:辅助函数
      • ✅ 最终:组合成命令
    • 3️⃣ 常用速查表
    • 4️⃣ 口诀速记

0️⃣ 前言

docker inspect 是做什么的?

   答:docker inspect 是用来查看容器/镜像/卷/网络等详细 JSON 配置的命令,比如可以查找容器的映射路径、端口、网络模式、重启模式等等;

  • docker inspect 参数:
参数说明示例
-f, --formatGo模板 格式化输出docker inspect -f '{{.NetworkSettings.IPAddress}}' nginx
--type指定对象类型(避免歧义)docker inspect --type=image nginx
-s, --size显示容器总文件大小(仅容器)docker inspect -s my_container

常用参数:-f(或 --format)是 Go template 的格式化参数,允许你只提取需要的字段,避免在一大坨 JSON 里人肉搜索,非常好用。

② 为什么要用 Go template ?

docker inspect 输出的是整坨 JSON(几百行,看着比较繁琐),而我们只想拿其中的 1~2 个字段。

  • 如果每次都用 jq/grep/awk,脚本里要多装一个二进制,还是比较麻烦的;
  • Go template 直接内建在 Docker CLI 里,零依赖跨平台一条命令搞定。
本期我们主要讲解 docker inspect -f 的使用。

1️⃣ 基本语法

docker inspect -f '<Go模板>' <对象>
  • <对象> 可以是:容器名、容器 ID、镜像名/ID、卷名、网络名等等,常用的就是容器名或容器id。
  • <Go模板>Go text/template 语法,字段路径以 点号 分隔。

那么问题来了,我要怎么知道自己想要的数据是要用哪个Go语法呢?接下来我们讲解json如何翻译成go语法。

2️⃣ JSON → Go template 翻译法

📌 原始 JSON(随便选了几个参数作为参考)

[{"Id": "59c88ce44ce023f......","Created": "2025-07-22T03:15:24.968351115Z","Path": "bash","Args": [],"State": {"Status": "running","Pid": 16698,"StartedAt": "2025-07-22T03:15:26.473607152Z",},"Name": "/my_nginx","HostConfig": {"Binds": ["/home/lcy/nginx/conf/:/usr/local/nginx/conf/","/home/lcy/nginx/html/:/application/nginx/html/","/home/lcy/nginx/logs/:/application/nginx/logs/","/etc/localtime:/etc/localtime/"],"NetworkSettings": {"IPAddress": "172.17.0.2"},"Mounts": [{"Type": "bind","Source": "/home/lcy/nginx/conf/","Destination": "/usr/local/nginx/conf/"}{"Type": "bind","Source": "/home/lcy/nginx/logs/","Destination": "/usr/local/nginx/logs/"}],"Config": {"Env": ["PATH=/usr/bin", "FOO=bar"]}}
]

✅ 基础:嵌套对象用点号

我们看json其实就类似与键值对那种,比如"Id": "59c88ce44ce023f......",我们就可以找到键Id,然后给他转成Go模板的时候就可以变成{{.Id}},这样docker inspect -f '{{.Id}}' nginx的时候就可以输出Id的值了。

拆分{{.Id}}解析:以.作为分割,Id为要查找内容的键,加上{{}}{{ }} 是 Go 模板语法里的“占位符”,告诉 Docker:“把这里换成真正的值”。

如果是如下多行json嵌套内容:

    "NetworkSettings": {"IPAddress": "172.17.0.2"},

那这样就变成了两层,也就是说要把这两个键都输入才能查到,如果只输入最外面这层的键是拿不到数据的:{{.NetworkSettings.IPAddress}},如果是三层或者四层,以此类推就行,具体可查看如下JSON → Go 模板 的映射规则。

  • JSON → Go 模板 的映射规则
JSON 片段模板写法说明 / 口诀
"Name": "/my_c"{{.Name}}顶层字段直接写
"State": {"Status": "running"}{{.State.Status}}嵌套对象用点号
"NetworkSettings": {"Networks": {"bridge": {"IPAddress": "172.."}}}{{.NetworkSettings.Networks.bridge.IPAddress}}多级嵌套一路点下去
"Env": ["PATH=...", "FOO=bar"]{{index .Env 1}}数组/切片用 index
"Mounts": [{ "Source": "/home/...}{ "Source": "/home/...}]{{range .Mounts}}{{.Source}}{{end}}遍历 map/array用range
"Mounts": [{...}]{{json .Config.Labels}}输出原始 JSON 字符串用json
"HostConfig": { "Binds": [ "/home...:/usr/..."]{{join .HostConfig.Binds " "}}拼接数组用join “ ”
{{printf "%.2fMB" .SizeRw}}格式化printf
"Name": "/nginx"{{lower .Name}}
{{upper .Name}}
转小写lower
转大写 upper

以下为简单的几种转换:

JSONGo template说明
"Id": "59c88ce44ce023f......"{{.Id}}容器ID
"Created": "2025-07-22T03:15:24.968351115Z"{{.Created}}容器创建时间
"State": { "Status": "running" }{{.State.Status}}容器运行状态
"NetworkSettings": { "IPAddress": "172.17.0.2" }{{.NetworkSettings.IPAddress}}查看容器ip地址

✅ 进阶:数组 / map[键值对集合] 用 indexrange

数组/mapJSONGo template说明
数组"HostConfig": { "Binds": [ "/home...:/usr/..."]列出所有:{{.HostConfig.Binds}}
取第一个值:{{index .HostConfig.Binds 0}}
查看容器映射路径
数组"Env": ["PATH=...", "FOO=bar"]取第一个值:{{index .Config.Env 0}}查看容器环境变量配置
map"Mounts": [{...}]遍历:{{range .Mounts}}{{.Source}}{{end}}遍历多组挂载路径

✅ 高级:辅助函数

函数JSONGo template说明
json"Mounts": [{...}]{{json .Mounts}}输出原始 JSON 字符串
join<Go模板> "拼接内容" "HostConfig": { "Binds": [ "/home...:/usr/..."]{{join .HostConfig.Binds " "}}用空格拼接数组
lower / upper"Name": "/nginx"{{lower .Name}}
{{upper .Name}}
转小写
转大写
printf{{printf "%.2f" .SizeRw}}格式化数字

✅ 最终:组合成命令

############################ 基础 ############################
# 查看容器id
docker inspect -f '{{.Id}}' nginx
# 查看容器创建时间
docker inspect -f '{{.Created}}' nginx
# 查看运行状态
docker inspect -f '{{.State.Status}}' nginx############################ 进阶 ############################
# 查看创建容器的映射路径
docker inspect -f '{{.HostConfig.Binds}}' nginx
# 查看创建容器的映射路径(只查看第一行)
docker inspect -f '{{index .HostConfig.Binds 0}}' nginx
# 查看容器的环境变量
docker inspect -f '{{index .Config.Env 0}}' nginx
# 遍历多组挂载路径
docker inspect -f '{{range .Mounts}}{{.Source}}{{end}}' nginx############################ 高级 ############################
# 查看容器的挂载路径,以json格式输出
docker inspect -f '{{json .Mounts}}' nginx
# 用空格拼接挂载目录
docker inspect -f '{{join .HostConfig.Binds " "}}' nginx
# 切换容器名为小写
docker inspect -f '{{lower .Name}}' nginx
# 切换容器名为大写
docker inspect -f '{{upper .Name}}' nginx
# 格式化数字输出
docker inspect -f '{{printf "%.2f" .SizeRw}}' nginx

3️⃣ 常用速查表

使用命令嵌套使用,覆盖99%常用参数。

docker inspect -f '<Go template>' 容器名
需求Go template
容器 ID{{.Id}}
容器名{{.Name}}
容器启动命令{{.Path}} {{join .Args " "}}
容器创建时间{{.Created}}
状态{{.State.Status}}
主进程 PID{{.State.Pid}}
容器是否因内存不足被杀死{{.State.OOMKilled}}
容器运行时的错误信息{{.State.Error}}
容器启动时间{{.State.StartedAt}}
容器结束时间{{.State.FinishedAt}}
宿主机和容器之间的挂载路径{{.HostConfig.Binds}}
容器网络模式{{.HostConfig.NetworkMode}}
容器的重启策略{{.HostConfig.RestartPolicy.Name}}
容器内的工作目录{{.GraphDriver.Data.MergedDir}}
所有挂载源路径{{range .Mounts}}{{.Source}} {{end}}
容器的主机名{{.Config.Hostname}}
容器的环境变量{{.Config.Env}}
{{index .Config.Env 0}}
容器使用的镜像名称{{.Config.Image}}
容器默认的工作路径{{.Config.WorkingDir}}
容器端口映射{{range $p,$c := .NetworkSettings.Ports}}{{$p}}->{{(index $c 0).HostPort}}{{end}}
{{.NetworkSettings.Ports}}
容器 网关 地址{{.NetworkSettings.Gateway}}
{{range .NetworkSettings.Networks}}{{.Gateway}}{{end}}
容器 IP 地址{{.NetworkSettings.IPAddress}}
{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}
容器 mac 地址{{.NetworkSettings.MacAddress}}
{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}
  • 更多简便的查询命令([过滤],相对与使用如上命令简单点):
需求命令
查看容器:使用镜像、运行时长、容器名、
启动命令、容器ID、运行状态、端口映射
docker ps -a | grep 容器名
查看容器的创建时间docker inspect 容器名 | grep -i created
查看容器是否因内存不足被杀死docker inspect 容器名 | grep -i OOMKilled
查看容器启动时间docker inspect 容器名 | grep -i StartedAt
查看容器结束时间docker inspect 容器名 | grep -i FinishedAt
查看容器的网络模式docker inspect 容器名 | grep -i NetworkMode
查看容器内的工作目录docker inspect 容器名 | grep -i MergedDir
查看容器外映射路径docker inspect 容器名 | grep -i source
查看容器的主机名docker inspect 容器名 | grep -i hostname
查看进入容器默认工作路径docker inspect 容器名 | grep -i WorkingDir
查看容器的 IPdocker inspect 容器名 | grep -i ipaddress
查看容器的 mac 地址docker inspect 容器名 | grep -i macaddress
查看容器的 网关 地址docker inspect 容器名 | grep -i gateway

4️⃣ 口诀速记

嵌套一路点到底,数组切片 index,map 切片 range,数组或map过多用join连接,模板单引号包起来。

http://www.xdnf.cn/news/18902.html

相关文章:

  • 免费开源图片压缩工具|绿色版本地运行,支持批量压缩+格式转换,不上传数据,隐私安全有保障!
  • 毕业项目推荐:27-基于yolov8/yolov5/yolo11的电塔缺陷检测识别系统(Python+卷积神经网络)
  • 软件测试工程师面试题(含答案)
  • 重写BeanFactory初始化方法并行加载Bean
  • 6年前抄写的某品牌集成灶-蒸汽炉
  • Linux笔记10——shell编程基础-4
  • GraphRAG——v0.3.6版本使用详细教程、GraphRAG数据写入Neo4j图数据库、GraphRAG与Dify集成
  • 图像增强和评价
  • 脑电分析——学习笔记
  • 【系统架构设计(一)】系统工程与信息系统基础上:系统工程基础概念
  • 【Ubuntu系统实战】一站式部署与管理MySQL、MongoDB、Redis三大数据库
  • 负载均衡之平滑加权轮询(Smooth Weighted Round Robin)详解与实现
  • MIME类型与文件上传漏洞 - 网络安全视角
  • AI解决生活小事系列——用AI给我的电脑做一次“深度体检”
  • Windows下的异步IO通知模型
  • 一款基于 .NET 开源、功能强大的 Windows 搜索工具
  • C# .NET支持多线程并发的压缩组件
  • 2026 济南玉米深加工展:探索淀粉技术突破与可持续发展解决方案
  • 你真的了解操作系统吗?
  • Feign 调用为服务报 `HardCodedTarget(type=xxxClient, name=xxxfile, url=http://file)`异常
  • 大模型入门实战 | 基于 YOLO 数据集微调 Qwen2.5-VL-3B-Instruct 的目标检测任务
  • YggJS RButton 按钮组件 v1.0.0 使用教程
  • 【vue eslint】报错:Component name “xxxx“ should always be multi-word
  • 云上“安全管家”|移动云以云安全中心为企业数字化升级保驾护航
  • 科技信息差(8.26)
  • 【软考论文】论静态测试方法及其应用
  • PortSwigger靶场之Blind SQL injection with out-of-band interaction通关秘籍
  • 软考-系统架构设计师 计算机系统基础知识详细讲解
  • 【46页PPT】AI智能中台用ABC+IOT重新定义制造(附下载方式)
  • 相机Camera日志实例分析之十五:相机Camx【照片后置HDR拍照】单帧流程日志详解