【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, --formatdocker inspect -f \'{{.NetworkSettings.IPAddress}}\' nginx--typedocker inspect --type=image nginx-s, --sizedocker 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 \'\' <对象>
可以是:容器名、容器 ID、镜像名/ID、卷名、网络名等等,常用的就是容器名或容器id。用 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 模板 的映射规则
\"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}}range\"Mounts\": [{...}]{{json .Config.Labels}}json\"HostConfig\": { \"Binds\": [ \"/home...:/usr/...\"]{{join .HostConfig.Binds \" \"}}join “ ”无{{printf \"%.2fMB\" .SizeRw}}printf\"Name\": \"/nginx\"{{lower .Name}}{{upper .Name}}lower 转大写
upper以下为简单的几种转换:
\"Id\": \"59c88ce44ce023f......\"{{.Id}}\"Created\": \"2025-07-22T03:15:24.968351115Z\"{{.Created}}\"State\": { \"Status\": \"running\" }{{.State.Status}}\"NetworkSettings\": { \"IPAddress\": \"172.17.0.2\" }{{.NetworkSettings.IPAddress}}✅ 进阶:数组 / map[键值对集合] 用 index 或 range
数组\"HostConfig\": { \"Binds\": [ \"/home...:/usr/...\"]{{.HostConfig.Binds}}取第一个值:
{{index .HostConfig.Binds 0}}数组\"Env\": [\"PATH=...\", \"FOO=bar\"]{{index .Config.Env 0}}map\"Mounts\": [{...}]{{range .Mounts}}{{.Source}}{{end}}✅ 高级:辅助函数
json\"Mounts\": [{...}]{{json .Mounts}}join \"拼接内容\" \"HostConfig\": { \"Binds\": [ \"/home...:/usr/...\"]{{join .HostConfig.Binds \" \"}}lower / upper\"Name\": \"/nginx\"{{lower .Name}}{{upper .Name}}转大写
printf无{{printf \"%.2f\" .SizeRw}}✅ 最终:组合成命令
############################ 基础 ############################# 查看容器iddocker 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 \'\' 容器名
{{.Id}}{{.Name}}{{.Path}} {{join .Args \" \"}}{{.Created}}{{.State.Status}}{{.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}}{{.NetworkSettings.IPAddress}} {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}{{.NetworkSettings.MacAddress}}{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}- 更多简便的查询命令([过滤],相对与使用如上命令简单点):
启动命令、容器ID、运行状态、端口映射
docker ps -a | grep 容器名docker inspect 容器名 | grep -i createddocker inspect 容器名 | grep -i OOMKilleddocker inspect 容器名 | grep -i StartedAtdocker inspect 容器名 | grep -i FinishedAtdocker inspect 容器名 | grep -i NetworkModedocker inspect 容器名 | grep -i MergedDirdocker inspect 容器名 | grep -i sourcedocker inspect 容器名 | grep -i hostnamedocker inspect 容器名 | grep -i WorkingDirdocker inspect 容器名 | grep -i ipaddressdocker inspect 容器名 | grep -i macaddressdocker inspect 容器名 | grep -i gateway4️⃣ 口诀速记
嵌套一路点到底,数组切片
index,map 切片range,数组或map过多用join连接,模板单引号包起来。


