👨?🎓博主簡介
??🏅CSDN博客專家
??🏅云計算領域優質創作者
??🏅華為云開發者社區專家博主
??🏅阿里云開發者社區專家博主
💊交流社區:運維交流社區 歡迎大家的加入!
🐋 希望大家多多支持,我們一起進步!😄
🎉如果文章對你有幫助的話,歡迎 點贊 👍🏻 評論 💬 收藏 ?? 加關注+💗
文章目錄
0?? 前言
① docker inspect
是做什么的?
? ?答:
docker inspect
是用來查看容器/鏡像/卷/網絡等詳細 JSON 配置的命令,比如可以查找容器的映射路徑、端口、網絡模式、重啟模式等等;
docker inspect
參數:
參數 | 說明 | 示例 |
---|---|---|
-f, --format | 用 Go模板 格式化輸出 | 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 里,零依賴、跨平臺、一條命令搞定。
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 |
以下為簡單的幾種轉換:
JSON | Go 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[鍵值對集合] 用 index
或 range
數組/map | JSON | Go 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}} | 遍歷多組掛載路徑 |
? 高級:輔助函數
函數 | JSON | Go 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 |
查看容器的 IP | docker inspect 容器名 | grep -i ipaddress |
查看容器的 mac 地址 | docker inspect 容器名 | grep -i macaddress |
查看容器的 網關 地址 | docker inspect 容器名 | grep -i gateway |
4?? 口訣速記
嵌套一路點到底,數組切片
index
,map 切片range
,數組或map過多用join
連接,模板單引號包起來。