AboutDockerProfessional illustrations
Docker Inspect 基礎指令詳解
好喇,等我哋深入淺出咁講解下 Docker Inspect 基礎指令 點用。呢個指令可以話係 Docker CLI 入面嘅「X光機」,無論係一個 容器 定係一個 鏡像,佢哋入面所有嘅 配置 同 低層信息,都可以用 docker inspect 一覽無遺。簡單嚟講,你 run 緊一個 container,想知佢嘅 網絡設置、端口綁定 咗去邊,或者係 卷掛載 咗啲咩目錄出嚟,呢個指令就係你嘅最佳拍檔。
最基本嘅用法就係 docker inspect <容器名或ID>。例如你 run 咗個叫 my-web 嘅 container,打 docker inspect my-web,佢就會嘔一大段 JSON格式 嘅資料出嚟。呢段 JSON 就係呢個 容器 嘅完整身世證,由佢嘅創建時間、運行狀態 (容器狀態)、環境變數、用到嘅鏡像,到所有 網絡、卷、端口映射 嘅細節,全部齊晒。不過,成段 JSON 出晒嚟,有時真係睇到眼花,尤其係你想搵某個特定資訊嘅時候。
所以,就要學識點樣 格式化輸出。呢度就要請出個好幫手:--format 參數。呢個參數可以讓你用 Go模板語法 去提取同整理你只想睇嘅資訊。舉個實例,如果你只係想知個容器嘅 IP 地址,你可以咁打:docker inspect --format='{{.NetworkSettings.IPAddress}}' my-web。個指令就會淨係輸出個 IP,唔使你再係大段 JSON 入面慢慢搵。Go模板語法 初頭睇可能覺得有啲奇怪,但用慣咗就知佢好強大,可以做到 循環遍歷 陣列、條件判斷等等,幫你精準攞資料。
對於進階用家,想深入分析 容器配置,--format 就更加不可或缺。例如你想一次過列出個容器所有嘅 端口綁定 關係,你可以用模板去抽出 NetworkSettings.Ports 呢部分。又或者,你想檢查個 卷掛載 得啱唔啱,可以專注睇 Mounts 部分。呢種 格式化輸出 嘅方式,令到 容器信息查詢 變得高效同有針對性,特別係當你要寫 bash 腳本去自動化管理一堆容器嘅時候,識得用 Go 模板就事半功倍。
當然,如果你係想攞晒所有資料去做程式分析,直接要完整嘅 JSON格式輸出 就最方便。你可以將輸出導去一個檔案,再用其他程式 (例如 Python、jq) 去處理。呢個方法喺 Stack Overflow 或者好多技術論壇都好常見,當大家分享一啲複雜嘅 容器 設定問題時,貼出 docker inspect 嘅完整 JSON 輸出,就好似醫生睇 X 光片一樣,讓其他人可以清楚診斷到問題所在。
總括呢段基礎指令詳解,記住 docker inspect 就係你查看 Docker 對象詳細信息 嘅瑞士軍刀。由最簡單嘅睇全部資訊,到用 --format參數 配合 Go模板 做精準 對象檢查,都係日常管理 Docker 必備嘅技能。熟練之後,無論係 debug 定係純粹了解個 container 嘅運行環境,你都可以快速攞到想要嘅答案,唔使再估估下。
About容器Professional illustrations
點樣解析容器完整資訊
好啦,講到要點樣解析容器完整資訊,我哋就一定要請出Docker CLI入面嘅「萬能鎖匙」——docker inspect呢個指令。好多新手可能淨係識用docker ps睇下容器行緊未,但當你真係要深入查詢容器狀態、睇清楚佢嘅網絡設置、端口綁定情況,甚至係卷掛載嘅詳細路徑,咁就非用docker inspect不可啦。呢個指令嘅核心,就係將一個運行緊或者已經停止咗嘅容器(或者鏡像)嘅所有低層信息,以JSON格式完整噉攤晒出嚟俾你睇。你可以理解成,Docker將個容器嘅所有配置,由出生到而家,全部變成一個結構化嘅數據對象,而docker inspect就係幫你檢查對象詳細信息嘅工具。
不過,成抽JSON輸出直接dump出嚟,真係會睇到眼花。所以,我哋就要學識點樣去格式化輸出,等我可以快速摷到想要嘅資訊。最基本嘅用法,就係直接跟容器名或者ID,例如docker inspect my_container。咁佢就會出咗一大段標準嘅JSON格式輸出。如果你想集中睇某一部分,例如淨係想知個容器嘅IP地址同網絡設定,你可以用--format或者-f呢個命令語法參數,配合Go模板語法去提取。舉個例,你想拎個容器嘅IP地址,可以打docker inspect --format='{{.NetworkSettings.IPAddress}}' my_container。呢度嘅--format參數就係關鍵,等你可以好似用緊篩咁,濾走唔需要嘅資訊,直接拎到目標值。
Go模板語法初頭睇可能覺得有啲複雜,但其實好有用。除咗直接拎屬性,你仲可以用佢來做簡單嘅循環遍歷同判斷。例如,個容器可能掛載咗幾個卷(Volume),你想一次過列出晒所有掛載點同來源目錄,就可以用類似{{range .Mounts}}{{.Source}} -> {{.Destination}}{{end}}呢種寫法。又或者,你想睇清楚個容器嘅端口映射,即係Host邊個Port駁去Container邊個Port,都可以用Go模板整齊噉列出來。呢啲技巧喺寫bash script自動化檢查嗰陣,真係幫到手。網上好多資源,好似Stack Overflow或者菜鳥教程,都有好多實戰例子參考,幫你掌握點樣用模板語法去查詢容器信息。
當然,除咗容器,docker inspect一樣可以用喺鏡像上面。譬如你拉咗個tutum/lamp呢類現成鏡像落嚟,想知佢入面預設嘅環境變數有咩、個Entrypoint係點設定,用docker inspect tutum/lamp就一清二楚。呢個對於調試或者了解一個鏡像嘅行為好重要。另外,有時我哋需要將成個檢查結果拎去第二度做分析,咁就可以將JSON輸出直接重定向去一個檔案,再用jq呢類工具去處理,咁就更加靈活。記住,docker inspect俾出嚟嘅係最原始、最完整嘅對象詳細信息,由個容器嘅ID、創建時間、行緊咩命令、到資源限制、網絡配置、卷嘅設定等等,全部喺度。學識點樣有效噉解析呢啲資訊,絕對係你由Docker新手進階到熟手嘅必經之路。
About鏡像Professional illustrations
實戰範例:查看容器配置
好啦,講咗咁多理論,係時候要落手落腳睇下點樣用 docker inspect 嚟做啲實際嘢啦。呢個「實戰範例:查看容器配置」就係要將啲命令語法變成你真係會用嘅工具。假設你而家手上有個運行緊嘅 container,可能係個 Web Server 或者 Database,你想知道佢裏面嘅詳細設定,docker inspect 就係你嘅 X 光機。
最直接嘅方法,就係用個 container ID 或者個名,打句「docker inspect 你個容器名」落去。咁佢就會嘔一大抽 JSON 格式嘅資料出嚟,裏面包羅萬有,由個容器嘅底層信息,例如佢用緊邊個鏡像、個 ID 係咩,到佢嘅運行狀態、網絡設置、卷掛載點,同埋最重要嘅配置,例如環境變數同命令,全部一目了然。不過,成抽 JSON 睇落可能好似好亂,尤其係當你只係想搵某一樣特定資料嘅時候。呢個時候,你就需要學識點樣去格式化輸出。
Docker CLI 提供咗個好犀利嘅功能,就係用 --format 參數,配合 Go模板語法 去篩選同整理你只想睇嘅資訊。Go模板語法 初初睇可能覺得有啲複雜,但係用熟咗之後真係好強大。舉個例,如果你只係想知個容器嘅 IP 地址,你可以用「docker inspect --format='{{.NetworkSettings.IPAddress}}' 你個容器名」。咁個輸出就會乾淨俐落,只係得個 IP,方便你拎去其他 script 或者工具度用。又或者你想一次過睇晒個容器嘅名、狀態同埋 IP,你可以用模板去循環遍歷或者組合唔同嘅字段,例如「docker inspect --format='容器: {{.Name}} 狀態: {{.State.Status}} IP: {{.NetworkSettings.IPAddress}}' 你個容器名」。呢種格式化輸出 嘅技巧,對於自動化或者寫 bash script 嚟管理容器真係不可或缺。
等我哋再睇個具體啲嘅例子。假設你用一個叫 tutum/lamp 嘅舊鏡像(呢度只係舉例,實際請用更新嘅鏡像)起咗個容器,你想檢查吓佢嘅端口綁定情況同埋卷掛載設定。你可以直接運行 docker inspect 去睇晒所有 JSON 輸出,然後喺裏面搵 "PortBindings" 同 "Mounts" 呢啲部分。但更精準嘅做法係用 --format 參數去直接提取。對於端口映射,你可以試下用「docker inspect --format='{{json .NetworkSettings.Ports}}' 你個容器名」,佢會以 JSON格式輸出 所有端口設定,你睇到佢係點樣將容器內嘅 80 端口映射去宿主機嘅某個端口。至於卷掛載,就可以用「docker inspect --format='{{range .Mounts}}{{.Source}}:{{.Destination}} {{end}}'」嚟列出所有掛載點嘅來源同目標路徑。呢啲命令可以幫你快速確認配置係咪同你預期一樣,尤其當你個應用涉及數據持久化或者對外服務嘅時候。
另外,有時你唔單止想睇靜態配置,仲想了解個容器嘅即時狀態,例如佢係咪真係運行緊、幾時開始運行、個進程有冇出錯等等。呢啲都屬於容器狀態 嘅查詢。你可以用「docker inspect --format='{{.State.Status}}'」嚟睇狀態,或者用「docker inspect --format='{{.State.StartedAt}}'」嚟睇啟動時間。呢啲低層信息 對於故障排查同監控非常有價值。如果你喺 Stack Overflow 或者 菜鳥教程 度搵解決方案,好多時都會見到人哋用呢啲命令去診斷問題。
最後都要提提,雖然 JSON格式 係標準同機器易讀,但係我哋人類睇一大段 JSON 始終冇咁舒服。所以,除咗用 Go模板 去提取特定字段,你亦可以考慮用啲外部工具去美化個 JSON 輸出,例如 pipe 去「jq」呢類命令度。不過,純粹用 Docker CLI 內置嘅 --format 已經可以應付大部分日常需要。記住,docker inspect 嘅強大之處,在於佢可以比你深入任何一個容器對象嘅詳細信息,進行徹底嘅對象檢查。無論係想睇網絡設定、卷配置、環境變數,定係只係想拎個特定值出嚟做後續處理,熟練運用 docker inspect 同 Go模板語法 絕對會令你管理 Docker 容器時事半功倍。下次當你對個容器嘅內部配置有疑問時,唔使估估下,直接 inspect 佢就最實際。
AboutinspectProfessional illustrations
JSON 輸出格式全面解讀
好啦,而家我哋就深入啲,拆解下 docker inspect 命令最核心嘅部分:JSON 輸出格式全面解讀。當你乜嘢參數都唔加,直接打 docker inspect <容器名> 嘅時候,終端機就會彈出一大段密密麻麻嘅 JSON格式 文字出嚟。好多新手望到呢嚿 JSON 可能即刻頭都大埋,覺得好似睇緊天書咁,但其實呢嚿嘢就係一個寶藏,入面包含咗個 容器 或者 鏡像 嘅所有 低層信息 同 配置,由 網絡設置、端口映射 到 卷掛載 嘅詳細資料,全部一覽無遺。
呢段 JSON輸出 結構非常之嚴謹,佢係一個巢狀式嘅對象,你可以將佢理解成一個好詳細嘅調查報告。最頂層通常會係一個數組,入面每一個元素就係一個 容器 或者 鏡像 嘅完整描述對象。我哋可以逐層剝落嚟睇。例如,你想知道個容器嘅運行狀態,就可以喺 JSON 入面搵 "State" 呢個對象,裏面會清楚列明個容器係 "Running" 定係 "Exited",仲有開始時間、進程ID、健康狀態檢查結果等等,呢啲就係所謂嘅 容器狀態。又例如,你想睇清楚個容器嘅 網絡設置,就要搵 "NetworkSettings" 呢部分,裏面會詳細列出 IP 地址、Mac 地址、Gateway,同埋最緊要嘅 端口綁定 情況,即係 "Ports" 呢個欄位,佢會話你知容器內部嘅 80 端口到底係咪綁定咗去宿主機嘅某個特定端口(例如 8080),定係隨機分配咗一個端口,對於排查網站點解訪問唔到呢類問題,呢度嘅資訊就係關鍵。
再講下 卷掛載 嘅資訊點樣睇。喺 JSON 裏面,你會搵到一個 "Mounts" 嘅數組,呢度就記錄咗所有掛載入個容器嘅 卷 或者 bind mount。每一項都會顯示來源(即係宿主機嘅路徑)、目標(即係容器內部嘅路徑)、同埋掛載模式(例如係讀寫 "rw" 定係只讀 "ro")。如果你發現容器裏面寫唔到檔案,第一時間就應該嚟呢度檢查下個掛載點係咪設定成只讀模式。呢啲 對象詳細信息 對於日常管理同故障排查嚟講,係不可或缺嘅。
不過,成段 JSON 咁長,點樣先可以快速拎到我想要嘅特定資訊呢?呢個時候,Docker CLI 提供嘅 --format參數 就大派用場啦。你可以用 Go模板語法 去自定義你想提取嘅內容,而唔使係咁意喺成嚿 JSON 入面搵到眼都花。舉個簡單例子,如果你只係想拎到個容器嘅 IP 地址,你可以用命令 docker inspect --format='{{.NetworkSettings.IPAddress}}' <容器名>,佢就會直接淨係輸出個 IP 地址,乾淨俐落。Go模板 嘅功能好強大,支援條件判斷、循環遍歷 數組,甚至定義自定義函數。例如,你想一次過列出所有容器嘅名同埋狀態,就可以用一個 loop 去 循環遍歷 所有容器對象,然後提取 {{.Name}} 同 {{.State.Status}},呢種 格式化輸出 嘅方式,對於寫自動化腳本(例如用 bash)去監控容器健康狀況,真係非常方便。
當然,學習 Go模板語法 初期可能會覺得有啲複雜,好似點樣正確咁引用巢狀對象嘅屬性,或者處理可能係空值嘅欄位。呢個時候,你可以去 Stack Overflow 或者一啲技術論壇度搵下例子,好多資深用家都會分享佢哋常用嘅 格式化輸出 模板。記住,唔好死記硬背成段 JSON 結構,而係要理解佢嘅層次,然後用 --format 呢個工具去精準提煉你需要嘅資料。當你熟練之後,無論係想檢查 端口映射 有冇錯,定係想批量導出所有容器嘅配置用嚟備份,docker inspect 配合 Go模板 都會係你最強嘅 容器信息查詢 工具,幫你徹底掌握每一個 容器 嘅內部運作細節。
AboutGo模板Professional illustrations
點樣過濾特定 inspect 數據
好啦,講到點樣過濾特定 inspect 數據,呢個真係Docker CLI高手必學嘅技巧。成日對住docker inspect輸出嗰大段密密麻麻嘅JSON格式數據,真係睇到眼都花,其實我哋完全唔使咁辛苦。Docker 內置咗一個好強大嘅功能,就係用 Go模板 來格式化輸出,等你可以精準拎到你想要嗰一忽容器配置或者鏡像資訊,唔使係咁搵。
最核心嘅武器就係個 --format參數(或者簡寫做 -f)。佢嘅基本命令語法係「docker inspect --format='你的Go模板語法' 容器名或ID」。個模板入面,你可以用點號(.)來訪問JSON入面嘅不同層級。例如,你淨係想睇個容器嘅IP地址,唔想睇晒成個網絡設置,咁你就可以打「docker inspect --format='{{.NetworkSettings.IPAddress}}' 我個容器」。一執行,terminal即刻淨係彈個IP出嚟,爽快俐落。呢個方法對於寫bash script來自動化處理容器狀態或者配置,真係幫到手。
當然,實際應用會複雜少少,因為好多時你想要嘅資訊係嵌套喺好幾層之下。例如,你想檢查吓個容器嘅端口綁定情況,即係端口映射咗去宿主機邊個埠。呢啲資料藏喺 .NetworkSettings.Ports 呢個對象裏面。如果你就咁用「{{.NetworkSettings.Ports}}」,佢會出返段JSON俾你,都係唔夠直接。呢個時候,Go模板嘅循環遍歷功能就大派用場。你可以寫個模板,叫佢逐個port拎出嚟顯示,例如「--format='{{range $p, $conf := .NetworkSettings.Ports}}{{$p}} -> {{(index $conf 0).HostPort}}{{end}}'」。咁樣一來,輸出就會係「80/tcp -> 8080」呢類清晰嘅格式,一眼睇晒所有映射關係。
另一個常見需求係拎卷掛載(volume mounting)嘅資訊。當你個容器好似 tutum/lamp 呢類,或者自己設定咗好多卷(volume)嘅時候,想快速知道宿主機嘅路徑同容器內路徑點對應,用Go模板過濾就最方便。你可以用類似「{{range .Mounts}}{{.Source}}:{{.Destination}}{{end}}」嘅語法,一次過列出所有掛載點。呢啲低層信息對於排查檔案問題或者備份數據好有用。
講到Go模板語法,初初睇可能會覺得有啲似外星文,但其實掌握幾個關鍵字就夠用九成情況。除咗上面提到嘅 range 用來循環遍歷列表或者map,仲有 if 條件判斷,例如只顯示某個狀態下嘅配置;同埋 index 函數,用來喺陣列或者map入面拎特定位置嘅值。有咗呢幾招,你基本上可以從容器信息查詢結果入面,抽取任何你想要嘅字段。唔明嘅話,去 Stack Overflow 或者 菜鳥教程 呢類網站搜下「docker inspect go template examples」,大把實戰例子參考,學得好快。
最後提多個實用技巧:有時你想將docker inspect嘅結果,以標準JSON格式輸出,但係只針對某一個特定部分,方便用其他好似 jq 呢類工具做二次處理。你可以結合 --format 參數,輸出一個結構完整嘅JSON片段。例如「--format='{{json .NetworkSettings}}'」,咁樣就會將網絡設定部分以完整JSON格式打印出嚟,之後你就可以用管道(pipe)傳去其他命令做進一步分析。總括來講,識得用 --format 參數同Go模板來過濾docker inspect數據,係你由Docker新手進階到中階管理員嘅重要一步,慳返大量時間之餘,處理容器同鏡像嘅對象詳細信息亦都會更加得心應手。
AboutDockerProfessional illustrations
網絡同掛載點檢查技巧
好啦,講完基本嘢,我哋深入啲睇下點樣用 docker inspect 嚟檢查容器嘅網絡同掛載點(Volume Mounting)。呢兩樣嘢對於確保你個容器行得正常、數據有無正確掛載、網絡通唔通真係好關鍵。好多時喺 Stack Overflow 見到人問點解個服務連唔到數據庫,或者啲檔案無咗,好多時就係網絡配置或者卷掛載出咗問題。用 docker inspect 呢個命令,你就可以直接睇到容器嘅低層信息,唔使估估下。
首先講網絡檢查。當你運行一個容器,例如係一個 tutum/lamp 呢類嘅鏡像,你可能會做端口映射(Port Binding),將容器嘅 80 端口綁定去宿主機嘅 8080。咁點樣確認真係綁定咗呢?直接用 docker inspect 睇個容器嘅詳細配置就得。默認佢會輸出好長嘅 JSON 格式,你可以直接搵 "NetworkSettings" 呢個部分。不過,成嚿 JSON 睇落眼都花,所以我哋通常會用 --format 參數配合 Go模板語法 嚟格式化輸出,只抽出想要嘅信息。例如,你想睇個容器嘅 IP 地址同埋端口綁定情況,你可以用個命令類似咁樣:docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 你個容器名。咁就會淨係輸出個 IP。如果想睇晒所有端口映射,就可以用 Go模板 去循環遍歷個 "Ports" 對象。呢種格式化輸出嘅技巧,對於寫 bash 腳本自動化檢查好有用,唔使再用 grep 同 awk 喺大嚿 JSON 入面慢慢摷。
至於掛載點檢查,就更加常用啦。尤其係當你個容器要用到持久化數據,例如係資料庫嘅數據文件或者網站嘅 upload 目錄,你必須確保個卷(Volume)有正確掛載入容器嘅指定路徑。用 docker inspect 嚟檢查卷掛載,你可以清楚見到宿主機嘅源路徑(Source)同容器內嘅目標路徑(Destination),仲有掛載模式係讀寫定係只讀。同樣地,用番 --format 參數會清晰好多。你可以用 Go模板語法 去抽出 "Mounts" 呢個數組嘅信息。例如,一個簡單嘅模板可以係 '{{json .Mounts}}',佢會將掛載信息以 JSON格式輸出,方便你再用其他工具處理。如果你發現個容器入面無你預期嘅檔案,第一時間就應該用呢個方法檢查下係咪掛載路徑寫錯咗,或者個源卷根本唔存在。呢啲都係容器配置嘅核心部分,掌握點樣快速查詢,可以幫你慳返好多除錯時間。
最後提多個實用技巧。有時你可能想一次過檢查幾個運行緊(running container)嘅容器嘅網絡或者掛載狀態,你可以結合 docker exec 同 docker inspect 嚟做。不過,直接查詢 inspection 數據已經好足夠。記住,docker inspect 出嚟嘅 JSON格式輸出 係一個寶庫,入面包含晒容器狀態、網絡設置、卷掛載、環境變數等等所有配置細節。學識點樣用 Go模板 呢個強大工具去提取你要嘅字段,你就等於有咗一把鎖匙,可以隨時打開任何容器嘅黑盒,睇清入面嘅對象詳細信息。唔好再靠估啦,實實在在噉檢查清楚網絡同掛載點,你嘅 Docker 管理功力即刻會提升一個層次。
AboutGo模板語法Professional illustrations
容器狀態監控實用方法
講到容器狀態監控實用方法,我哋就一定要識用 docker inspect 呢個強力工具。好多新手可能只係識用 docker ps 睇吓容器行緊定停咗,但係如果想深入監控同分析一個 container 嘅實時狀態、配置細節,甚至係低層信息,咁 docker inspect 就係你嘅瑞士軍刀。佢可以話係 Docker CLI 入面最詳細嘅「容器信息查詢」指令,能夠將一個容器或者鏡像嘅所有配置,由端口綁定、卷掛載、網絡設置,到環境變數、啟動命令,全部以結構化嘅方式挖晒出嚟。呢啲信息對於日常監控、故障排查,或者係想了解某個現成鏡像(例如 tutum/lamp)嘅內部結構,都係不可或缺嘅。
咁點樣用先至最有效率呢?最基本嘅用法就係直接打 docker inspect <容器名>,佢預設會輸出一大段 JSON 格式嘅內容。呢段 JSON 輸出雖然完整,但係睇落去可能會眼花繚亂。所以,第一個實用方法就係學識點樣馴服呢段 JSON。你可以將輸出導向去一個檔案,再用啲 JSON 處理工具(例如 jq)去慢慢分析,咁樣對於自動化腳本或者深入檢查某個特定配置(例如係咪有 volume mounting 錯誤)好有用。不過,對於日常快速監控狀態,我哋可以用 docker inspect 內置嘅格式化輸出功能,呢個就係靠 --format 參數同 Go模板語法 啦。
Go模板語法 係關鍵所在,佢可以讓你自定義輸出嘅格式,只提取你關心嘅信息。例如你想集中監控容器嘅運行狀態、IP地址同埋綁定咗嘅端口,你可以用類似咁嘅命令語法:docker inspect --format='{{.State.Status}} {{.NetworkSettings.IPAddress}} {{range $p, $conf := .NetworkSettings.Ports}}{{$p}} {{end}}' <容器名>。呢個命令就會精簡地輸出狀態、IP同端口,一目了然,非常適合放入監控儀表板或者定期檢查嘅 script 入面。你仲可以用佢來循環遍歷一啲陣列信息,例如掛載咗嘅卷或者環境變數,做到高度定制化嘅狀態報告。
另外一個超實用嘅場景係監控容器嘅健康狀況同資源使用。雖然 docker inspect 唔會直接顯示實時 CPU 或記憶體用量(呢啲要用 docker stats),但佢可以揭示容器嘅底層配置,例如有冇設定資源限制(CPU shares, memory limit)、重啟策略(RestartPolicy)等等。呢啲配置直接影響容器嘅運行狀態同穩定性。你可以用 --format 參數配合 Go模板,快速列出所有容器嘅重啟策略同資源限制,方便你一眼睇晒邊啲容器係「脆弱」嘅,需要加強監控。
對於網絡問題嘅排查,docker inspect 提供嘅 網絡設置 信息就更加寶貴。你可以詳細睇到個容器連接咗去邊個 Docker 網絡、佢嘅 MAC 地址、IP 地址、網關,以及好重要嘅端口映射 詳細清單。當你發現某個服務訪問唔到嘅時候,用呢個命令檢查下端口綁定係咪正確(係咪綁定咗去 0.0.0.0 定係只係 127.0.0.1),好多時候問題即刻就浮現。你可以專門用一個格式化輸出命令來監控所有容器嘅網絡模式同映射端口,對於管理複雜多容器應用極有幫助。
最後,想提一提點樣將呢啲監控方法自動化。你可以寫一個簡單嘅 bash script,用循環遍歷所有 running container,然後對每一個容器執行你自定義嘅 docker inspect --format 命令,將關鍵狀態信息(例如狀態、主要IP、關鍵端口)收集起來,輸出成一個簡潔嘅報告,甚至發送告警電郵。呢種方法比單純睇 docker ps 詳細好多,又比直接睇成段 JSON 輸出高效,係進階使用者必學嘅容器狀態監控實用方法。記住,熟練運用 docker inspect 同 Go模板語法,就等於擁有咗 X 光眼,可以隨時睇透你 Docker 環境入面每一個容器嘅五臟六腑。
AboutJSONProfessional illustrations
2026 年最新 Flag 參數攻略
講到 docker inspect 呢個強勁工具,2026 年嘅最新玩法,一定要識得靈活運用佢啲 Flag 參數,尤其係 --format 呢個神級 flag,可以話係將 Docker CLI 嘅威力提升到另一個層次。好多香港嘅開發兄弟,可能仲係慣咗成日去 Stack Overflow 或者 菜鳥教程 搵啲舊命令,但係而家已經 2026 年,Docker 嘅功能同用法都有唔少進化。最基本嘅,你齋打 docker inspect
咁點樣用 --format 先至最有效率呢?首先你要明,docker inspect 拎到嘅係一個結構化嘅 JSON 格式 數據,而 Go模板 就係一把鋒利嘅刀,幫你精準切出你想要嘅部分。例如,你淨係想睇個 容器 嘅 IP 地址同埋佢綁定咗喺主機邊個 端口,你可以用類似噉嘅 命令語法:docker inspect --format='{{.NetworkSettings.IPAddress}} {{range $p, $conf := .NetworkSettings.Ports}}{{$p}} -> {{(index $conf 0).HostPort}} {{end}}'
除咗拎基本資訊,2026 年我哋更要識得深入查詢 低層信息。例如,你想一次過檢查晒所有運行緊嘅 容器 佢哋用緊咩 鏡像 同埋 配置 咗咩 卷掛載 點,你可以結合 docker ps -q 同 xargs 呢啲 bash 技巧,再配搭 --format 去做批量查詢。呢種方法對於做 容器狀態 嘅健康檢查或者審計好有用。又例如,你想知道某個 卷 具體掛載咗去容器裡面邊個路徑,以及佢嘅讀寫權限,就可以用模板去抽取 Mounts 呢個 對象詳細信息 嘅欄位。記住,docker inspect 唔單止用喺 running container 身上,連停止咗嘅 容器、鏡像、甚至網絡同卷呢啲 對象檢查 都可以用到,係一個萬用嘅診斷工具。
另外,有個進階技巧係利用 JSON 格式輸出 去做二次處理。你可以加個 --format='{{json .Config}}' 噉樣,佢就會將 容器 嘅 Config 呢個完整 對象詳細信息 以標準 JSON 格式輸出。之後你就可以用 jq 呢類專業嘅 JSON 處理器去進一步篩選同分析,呢個工作流喺編寫自動化腳本嘅時候特別強大。譬如你要批量搵出所有源自 tutum/lamp 呢個舊 鏡像 嘅 容器 有邊啲,就可以透過呢種管道式處理快速達成。
總而言之,2026 年掌握 docker inspect 嘅 Flag 參數攻略,核心就係精通 --format 同 Go模板語法,將佢由一個單純嘅 容器信息查詢 工具,變成一個可以精準提取 網絡設置、端口映射、卷掛載、容器配置 等關鍵資料嘅瑞士軍刀。唔好再齋睇預設嘅冗長輸出,學識自定義 格式化輸出,你對 Docker 底層運作嘅洞察力會即時提升幾個檔次,處理問題自然更加得心應手。
AboutJSON格式Professional illustrations
鏡像 Metadata 深入剖析
好啦,今次我哋就深入啲,拆解吓點樣用 docker inspect 去剖析鏡像嘅 Metadata。好多香港嘅開發者,尤其係啱啱開始玩 Docker 嘅朋友,可能淨係識用 docker inspect 睇吓個容器嘅 IP 地址或者狀態就算。但其實呢個命令嘅威力,尤其係用嚟挖出鏡像本身嘅詳細配置同低層信息,真係好強大。當你拉咗一個好似 tutum/lamp 呢類現成鏡像落嚟,你知唔知佢入面預設咗啲乜嘢配置?預設開咗咩端口?啲卷掛載點又設咗喺邊?呢啲通通都收埋喺鏡像嘅 Metadata 裏面,而 docker inspect 就係你嘅萬能鎖匙。
點樣先可以有效率咁抽出呢啲信息?關鍵就喺識得用 --format 參數同 Go模板語法。我知,一聽到「模板語法」可能有人會想瞓覺,但其實對於我哋日常操作嚟講,學識幾招簡單嘅就已經好夠用,唔使去到 Stack Overflow 嗰啲複雜例子咁深。Docker CLI 用 Go模板 嚟做格式化輸出,最基本就係直接叫佢輸出 JSON。你打 docker inspect --format='{{json .Config}}' <鏡像名>,佢就會將鏡像配置部分,例如預設嘅環境變數、工作目錄、入口點命令等等,以原汁原味嘅 JSON格式輸出 俾你睇。呢個 JSON格式輸出 好有用,因為結構清晰,又可以拎去俾其他工具做進一步處理。
不過,成嚿 JSON 睇落可能太「肉酸」,如果你想集中睇某一兩樣嘢,就要學吓點用 Go模板語法 去循環遍歷同提取。舉個實用例子,我想知個鏡像預設暴露咗咩端口,即係 Dockerfile 入面 EXPOSE 咗啲乜。你可以咁打:docker inspect --format='{{range $p, $conf := .Config.ExposedPorts}}{{ $p }}{{end}}' <鏡像名>。呢句嘢嘅意思就係,去 .Config.ExposedPorts 呢個 map 裏面,逐個 key(即係端口號)拎出嚟顯示。又或者,我想一次過睇晒鏡像嘅幾個重要配置,例如入口點、命令同工作目錄,你可以自定義個輸出格式:docker inspect --format='入口點: {{.Config.Entrypoint}}\n命令: {{.Config.Cmd}}\n工作目錄: {{.Config.WorkingDir}}' <鏡像名>。咁樣出嚟嘅結果就乾淨俐落好多,唔使喺大段 JSON 裏面搵餐懵。
對於進階少少嘅用家,尤其係要寫 script 自動化處理嘅時候,掌握 Go模板語法 嘅條件判斷同函數就更重要。例如,你可以檢查個鏡像有冇設定某個特定嘅標籤(Label),或者將某啲配置值轉成大楷先輸出。呢啲技巧可以幫你喺 bash script 裏面,更精準地做容器信息查詢 同決策。記住,docker inspect 唔單止用喺運行緊嘅容器(running container)身上,對住鏡像 ID 或者名一樣用得,專門用嚟睇鏡像構建時已經定好咗、唔會點變嘅元數據。
總而言之,將 docker inspect 配合 --format參數 嚟用,就好似將一個普通嘅「資料庫查詢」變成咗一個強大嘅「報表生成工具」。你唔使再人手喺 terminal 度 copy 同 paste 一大段嘢,亦唔使下下走去菜鳥教程 度搵答案。直接喺 command line 度,用一兩句命令,就可以即時、精準咁拎到你想要嘅鏡像 Metadata,無論係為咗 debug、為咗了解第三方鏡像嘅底細,定係為咗自己構建鏡像時做參考,都係極之實用嘅技能。下次當你對住一個陌生鏡像,唔好再估估吓,試吓用呢招深入剖析 佢啦,保證你會發現好多之前忽略咗嘅配置細節。
AboutOverflowProfessional illustrations
自動化腳本整合應用
講到自動化腳本整合應用,Docker inspect 就真係一個神兵利器,可以幫你將一大堆繁瑣嘅檢查同配置工作,全部變成自動波。我哋成日講 DevOps 要自動化,但係點樣將 Docker CLI 入面嘅資訊,變成腳本可以理解同處理嘅數據呢?關鍵就係點樣用 docker inspect 拎到結構化嘅數據,然後用 bash 或者其他腳本語言去處理。例如,你想定時監控公司幾十個 container 嘅狀態,睇下佢哋嘅網絡設置、端口綁定有冇出錯,又或者卷掛載係咪正常,你總唔會人手逐個入去睇掛?呢個時候,寫個自動化腳本就係唯一出路。
首先,你要識得點樣從 docker inspect 度拎到你想要嘅資訊。最直接嘅方法當然係用 JSON 格式輸出啦。你打 docker inspect
咁點樣具體整合落自動化腳本呢?我舉個實際例子。假設你公司用緊一個叫 tutum/lamp 嘅鏡像行咗個 web service,你需要定期檢查佢嘅端口映射有冇被意外改動,同埋個 volume 掛載嘅路徑係咪正確。你可以寫一個 bash script,先用 docker ps 拎到運行緊嘅容器名單,然後用循環遍歷,對每一個 running container 執行 docker inspect,配合 Go模板抽出你需要嘅配置信息。譬如,用 --format 去拎 HostPort 同埋容器入面嘅 Mounts 資料。拎到呢啲數據之後,你就可以同你預期嘅標準配置做對比,如果發現有唔同,就自動發個 alert 去 teams 或者 slack 度,等工程師即刻知。呢個過程完全唔使人手介入,真正實現自動化監控。
另外,自動化部署或者配置同步都好常用到。想像下,你有個新環境要部署,需要參考另一個現有容器嘅詳細配置,例如網絡模式、環境變數等等。你可以用 docker inspect 將呢個「模範容器」嘅配置,以 JSON格式輸出到一個檔案,然後用腳本去解析呢個 JSON 檔案,再將需要嘅部分套用到新容器嘅 docker run 命令或者 docker-compose.yml 檔案度。咁樣就可以確保配置一致性,減少人手抄寫出錯。尤其係當配置好複雜,有好多卷、網絡設置嗰陣,呢個方法可以話係救星。
當然,用 Go模板語法嘅 --format 參數,初頭睇可能會覺得有啲複雜,同直接睇 JSON 唔同。但係佢嘅好處係格式化輸出非常靈活。你可以自定義輸出嘅樣式,甚至將幾個字段組合埋一齊出。好似你想一次過睇容器名、狀態、同埋 IP,就可以寫成 --format '{{.Name}} {{.State.Status}} {{.NetworkSettings.IPAddress}}'。對於寫自動化腳本來講,能夠控制輸出格式,就等於減少後期處理嘅功夫,令腳本更加簡潔。有唔明嘅話,上 Stack Overflow 或者睇下官方文檔,都有好多關於 Go模板語法嘅實例參考。
最後都要提提,自動化嘅目的係提升效率同減少錯誤。當你將 docker inspect 命令語法融入你嘅 CI/CD pipeline 或者日常運維腳本之後,你對成個 Docker 環境嘅掌控力就會大大增強。無論係批量查詢容器信息、自動生成報告、定係做配置漂移檢測,呢個 command 都係不可或缺嘅核心工具。記住,關鍵在於點樣將佢輸出嘅數據(無論係純文字、JSON定係自定義格式),變成你腳本邏輯裏面可以流動同決策嘅一部分,咁先至係真正嘅自動化腳本整合應用。
AboutbashProfessional illustrations
疑難排錯必用 Inspect 命令
講到疑難排錯,Docker 嘅 docker inspect 命令真係必備嘅神器,尤其係當你個容器無端端死咗,或者啲設定唔知點解行唔到嘅時候。好多新手一遇到問題,可能即刻衝上 Stack Overflow 問人,或者去 菜鳥教程 搵答案,但其實好多時答案就喺你自己部機入面。docker inspect 就係俾你深入容器同 鏡像 嘅內部,挖出所有 低層信息 嘅終極工具。呢個命令會將指定 容器 或者 鏡像 嘅所有 配置 同 狀態,以 JSON格式 完整噉 dump 出嚟,等你一眼睇清晒所有設定,包括 網絡設置、卷掛載、端口映射 等等,對於排錯嚟講,簡直就係開咗個金手指。
咁點用先至最有效呢?最基本就係直接 docker inspect
Go模板語法 初頭睇可能有啲複雜,但掌握幾個基本操作就已經好夠用。最基本嘅 {{.Field}} 係用嚟訪問 JSON 對象嘅字段。如果個字段本身又係個對象或者陣列,你就可以用點號 . 一路深入落去,例如 {{.NetworkSettings.Networks.bridge.IPAddress}} 就可以直接拎到個容器喺 bridge 網絡入面嘅 IP。另一個超常用嘅係 range 動作,用嚟 循環遍歷 陣列。好似檢查一個容器掛載咗幾多隻 卷,你就可以用 {{range .Mounts}}{{.Source}} -> {{.Destination}}{{end}} 呢類模板,將每個掛載點嘅來源同目標清晰列出。記住,Docker CLI 嘅 --format 參數係你嘅好朋友,花少少時間學識基本 命令語法,之後排錯嘅速度會快幾倍。
實際排錯時,docker inspect 可以點幫到手呢?舉幾個常見場景。首先係網絡問題,例如你明明用 -p 8080:80 起咗個容器,但係用 browser 打 localhost:8080 完全無反應。除咗檢查防火牆,你應該即刻用 docker inspect 去驗證個 端口映射 係咪真係生效。用 --format 抽出 HostConfig.PortBindings 同 NetworkSettings.Ports 對比下,可能發現容器嘅 80 端口其實係 bind 咗去主機另一個奇怪嘅端口,或者根本無 bind 到。其次係 卷掛載 相關嘅權限或者路徑錯誤。有時你喺主機改咗個檔案,但容器入面完全無更新,好可能係掛載路徑錯咗,變成咗一個空目錄掛入去,覆蓋咗容器原本嘅資料。用 inspect 命令仔細睇清楚 Mounts 裏面嘅 Source(主機路徑)同 Destination(容器路徑),好多時就即刻搵到問題根源。另外,檢查一個 running container 嘅實際環境變數、啟動命令 (Config.Cmd)、同埋佢當前嘅狀態 (State.Running, State.Error 等),對於理解點解個容器起唔到,或者起咗但即刻退出,都非常有用。
最後提多個進階技巧,就係將 docker inspect 同其他命令,例如 docker exec 或者 bash 腳本,結合埋一齊用。例如,你可以寫個簡單嘅 bash 腳本,先用 docker inspect 拎到一堆容器嘅 ID 同名,再 循環遍歷 佢哋,檢查每個容器嘅特定配置,好似有無用某個特定 鏡像,或者網絡模式係咪 host。又或者,當你需要將某個容器嘅複雜配置(例如網絡設定)匯出嚟做備份或者參考時,你可以用 docker inspect --format='{{json .NetworkSettings}}' my_container,咁樣就會得到一個乾淨嘅 JSON輸出,可以直接儲低或者掟去第二度分析。總而言之,將 docker inspect 當成你日常 Docker 管理同 疑難排錯 嘅核心工具,花心機學識點樣用 Go模板 精準提取信息,咁樣無論遇到咩奇難雜症,你都能夠快速搵到線索,自己解決問題,唔使下下都要問人。
AboutcontainerProfessional illustrations
同 Docker API 點樣協作
好啦,講到 docker inspect 呢個咁強大嘅命令,好多時我哋都係喺 Docker CLI 度直接打指令,攞啲 JSON格式 嘅 容器配置 出嚟睇。但係如果你要將 Docker 整合落自己寫嘅程式或者自動化腳本度,淨係識用命令行就唔夠㗎喇,呢個時候就要識得點樣同 Docker API 協作喇。簡單啲講,docker inspect 命令本身其實就係一個調用 Docker API 嘅前端工具,佢背後係透過 API 去問 Docker Daemon 拎資料。所以,當你喺 bash 入面打 docker inspect
咁點樣直接同 Docker API 協作呢?最直接嘅方法就係用 curl 呢類工具。Docker Daemon 預設會開一個 Unix Socket(通常係 /var/run/docker.sock)或者一個 TCP 端口嚟聽 API 請求。例如,你想唔經 Docker CLI 直接查一個運行緊嘅 容器 嘅 低層信息,你可以用類似 curl --unix-socket /var//run/docker.sock http://localhost/v1.45/containers/<容器ID>/json 嘅命令。留意番,上面條路徑嘅 v1.45 係 API 版本,喺 2026 年可能已經更新咗,你要根據自己環境嘅 Docker 版本去調整。直接調用 API 嘅好處係,你可以完全控制個請求同回應,尤其係當你需要喺程式裏面 循環遍歷 好多個 容器 嘅信息,或者要將呢啲信息即時插入去第二個系統度嘅時候,就非常方便。
不過,直接對住個 Socket 用 curl 可能對初學者嚟講有啲複雜,尤其係要處理 JSON 嘅時候。所以,另一個更常見、更實用嘅協作方法,就係利用 docker inspect 本身嘅 格式化輸出 功能,將佢變成一個為 API 或者你嘅腳本準備數據嘅工具。點做到呢?關鍵就係個 --format 參數。你可以用 Go模板語法 去指定你想抽出嚟嘅資料,然後輸出一個乾淨、結構化嘅文本,方便其他程式讀取。舉個例,如果你嘅自動化腳本只需要知道某個 容器 嘅 IP 地址 同埋 端口綁定 情況,你唔需要攞成大段 JSON格式 嘅 對象詳細信息 再慢慢拆解。你可以直接用 docker inspect --format='{{.NetworkSettings.IPAddress}} {{range $p, $conf := .NetworkSettings.Ports}}{{$p}} {{end}}' <容器ID>。咁樣輸出嚟嘅結果就係一兩行文字,你個 bash 腳本或者程式就好易處理啦。
講到 Go模板語法,佢真係打通咗 docker inspect 同 Docker API 協作嘅任督二脈。佢唔單止可以拎簡單數值,仲可以做到條件判斷、循環遍歷 陣列同 Map,勁有用。譬如個 容器 掛載咗幾個 卷,你想列出晒所有 卷掛載 嘅源頭路徑,你就可以用模板去 循環遍歷 .Mounts 呢個數組。又或者,你想檢查個 容器 嘅 網絡設置,睇下佢連住邊個自定義網絡,用模板語法都可以好精準咁抽到出嚟。呢啲經過格式化嘅輸出,對於開發者嚟講,就係一種同 Docker 後台 API 互動嘅高層次介面,省卻咗自己直接解析複雜 JSON 嘅功夫。
當然啦,實際應用上,我哋可能會將呢啲技巧用喺監控、自動化部署或者故障排查嘅場景。例如,你可以寫個定時運行嘅腳本,用 docker inspect 加 Go模板 去抽查一堆 容器 嘅 狀態 同 配置,睇下有冇 端口映射 出錯,或者 卷 嘅掛載點係咪正常。然後將呢啲格式化咗嘅數據直接 push 去你嘅監控系統度。又或者,當你需要備份某個 容器 嘅完整 配置 時,你可以直接用 docker inspect <容器ID> 攞到完整嘅 JSON格式 定義,呢份定義其實就係 Docker API 裏面 容器 嘅 對象詳細信息 嘅快照,你可以儲起佢,甚至用嚟喺另一部機度重建一個配置一模一樣嘅 容器。所以話,精通 docker inspect 同 Go模板語法,基本上就等於你識得用一個更靈活、更強大嘅方式去駕馭 Docker API,將 Docker 管理嘅自動化程度提升到另一個層次。
AbouttutumProfessional illustrations
安全檢查:睇清容器設定
好啦,各位IT老友記,講到Docker安全檢查,真係唔可以求求其其。你哋成日run咗個container就算數?咁就大鑊喇!想真真正正「睇清容器設定」,docker inspect呢個指令就係你嘅「照妖鏡」。佢唔單止係基本嘅容器信息查詢工具,直頭可以幫你深入容器配置嘅骨髓,睇清楚有冇暗藏漏洞或者設定錯誤。點解咁講?因為一個container入面嘅所有低層信息,例如卷掛載(volume mounting)、網絡設置、端口綁定等等,全部都可以用呢個指令挖晒出嚟。尤其係而家啲攻擊手法日新月異,你掛載咗個volume入去,權限set錯咗,分分鐘成個host機俾人拎咗控制權。又或者個端口映射亂咁開,將內部服務暴露喺唔應該暴露嘅網絡介面,咁就同打開大門請賊入屋冇分別。
咁點樣用好呢支「照妖鏡」呢?最基本梗係直接用 Docker CLI 打 docker inspect [CONTAINER_ID] 啦。默認情況下,佢會吐出一大段JSON格式嘅資料出嚟,密密麻麻,新手睇到實頭暈。呢舊JSON輸出就係成個容器嘅完整定義同即時狀態,由個鏡像係邊個,到而家行緊乜嘢命令、環境變數係咩、網絡點樣連、有冇卷掛載住,全部一目了然。但係問題就喺度,資訊太多反而難搵重點。所以,我哋就要識得用 --format參數 去撈特定嘅資料出嚟。呢個參數用嘅就係 Go模板語法,可以話係將docker inspect變成強大搜尋器嘅關鍵。
舉個實際例子,你懷疑有個行緊嘅running container(例如一個叫 tutum/lamp 嘅舊鏡像)嘅端口綁定有問題,唔想睇成噸JSON,你就可以用格式化輸出功能,淨係抽出網絡設定嚟睇。個命令語法大概係 docker inspect --format='{{json .NetworkSettings.Ports}}' [CONTAINER_ID]。咁樣佢就會淨係輸出端口映射相關嘅JSON格式輸出,清晰好多。又或者,你想檢查吓有冇啲危險嘅掛載,可以針對 Mounts 呢個欄位去做循環遍歷,睇下每個掛載點嘅來源同權限。呢啲就係安全檢查嘅精髓:唔係望兩眼就算,而要精準咁對象檢查,拎出對象詳細信息。
對於進階用家,掌握Go模板就更加如虎添翼。你可以寫一啲複雜少少嘅模板,一次過檢查多個關鍵配置位。例如,一次過列出容器入面所有嘅環境變數、掛載卷嘅路徑同模式、同埋暴露嘅端口。呢種自定義嘅格式化輸出,絕對比你去Stack Overflow或者菜鳥教程搵答案再人手檢查嚟得有效率同可靠。記住,自動化檢查先係長遠之道,你可以將呢啲指令寫入bash script,定期掃描你啲container,確保冇人改過啲設定。
最後都要提提,docker inspect睇到嘅嘢,同docker exec入到容器內部見到嘅,可以互相印證。例如你喺inspect度見到掛載咗某個host路徑,就可以exec入去睇下個路徑入面嘅檔案權限係咪真係安全。總而言之,將docker inspect配合 --format參數同Go模板語法,你就等於有咗一副高解像度嘅X光眼鏡,能夠深入容器狀態同設定,任何唔妥當嘅網絡設定、過寬嘅卷掛載、或者唔必要嘅端口綁定都無所遁形。養成每次部署新容器或者定期做審計時,都做一次深度inspect嘅習慣,咁先至算係對得住「安全」兩個字。
About卷Professional illustrations
效能優化點樣搵關鍵數據
講到用 Docker 做效能優化,好多人都會諗,點樣喺一大堆容器入面搵出關鍵數據嚟診斷問題呢?呢個時候,docker inspect 就係你嘅神兵利器啦。呢個命令可以話係 Docker CLI 裡面最強嘅診斷工具之一,佢唔係淨係俾你睇吓個 container 行緊定係停咗咁簡單,而係可以挖出個容器由頂層到底層嘅所有配置同狀態,對於想搵出效能瓶頸嘅師兄嚟講,簡直係寶藏嚟。點解咁講?因為所有影響效能嘅設定,例如網絡設置、端口綁定、卷掛載嘅方式同路徑,甚至係資源限制,全部都以 JSON 格式嘅低層信息,收埋喺 docker inspect 嘅輸出入面。你識得點樣用正確嘅命令語法去查詢,就等於有咗張詳細地圖,可以直接去問題根源,唔使估估下。
咁點樣用 docker inspect 嚟做效能優化嘅數據挖掘呢?第一件事,你要識得點樣精準咁問佢拎資料。默認情況下,你打 docker inspect [CONTAINER_ID] 佢會倒晒成個 JSON 對象詳細信息出嚟,成幾百行,睇到眼花。對於效能調校,我哋好多時只係關心某幾個特定配置。呢個時候,就要出動 Go模板 同 --format參數 啦。Go模板語法 就係幫你過濾同格式化輸出嘅強大工具。舉個實用例子,假設你懷疑某個 container 嘅網絡設置有問題,導致回應慢,你可以用呢個命令:docker inspect --format='{{json .NetworkSettings}}' [CONTAINER_ID]。佢就會淨係抽出網絡設置呢部分,以 JSON格式輸出,即刻清晰晒,你可以檢查 IP 地址、網關、端口映射有冇錯。又或者,你想睇吓個容器掛載咗邊啲卷,因為磁碟 I/O 好多時係效能殺手,你就可以用模板去拎 Volume mounting 嘅資訊出嚟重點分析。
講到具體搵關鍵數據,我哋可以分幾個層面去諗。首先係資源層面,雖然 docker inspect 唔直接顯示 CPU、記憶體即時使用量(呢啲要用 docker stats),但佢會顯示個容器創建時有冇設定資源限制,例如 Memory 上限係幾多。你喺 JSON 輸出入面搵 “HostConfig” 下面嘅 “Memory”、 “NanoCpus” 呢啲欄位就睇到。如果冇設限制,個容器有可能食爆主機資源,拖慢其他服務。第二係網絡層面,之前提過用模板抽 NetworkSettings,你要特別留意 “PortBindings”,睇吓主機端口同容器端口嘅映射有冇衝突或者設定錯誤,錯誤嘅綁定會導致服務連唔到,變相「冇反應」好似好慢咁。第三就係儲存 I/O,喺 “Mounts” 部分,你可以清楚見到每個卷嘅來源(Source,即係主機路徑)同目標(Destination,即係容器內路徑),仲有讀寫模式。如果你發現某個經常讀寫嘅目錄,原來掛載咗去一個好慢嘅網絡磁碟(NFS)度,咁成個應用慢就唔出奇啦。用 Go模板 可以好輕鬆咁循環遍歷呢啲掛載點逐一檢查。
當然,齋睇數據唔識分析都冇用。我哋要將 docker inspect 拎到嘅配置資訊,同實際嘅效能表現連結起嚟。例如,你喺 Stack Overflow 或者 菜鳥教程 睇到有人話 tutum/lamp 呢個鏡像嘅某個版本有已知嘅效能問題,你就可以用 docker inspect 去確認自己個容器係咪用緊呢個有問題嘅鏡像,睇吓 “Config” 下面嘅 “Image” 欄位。又或者,你發現個應用好食 CPU,就可以檢查下 “HostConfig” 入面嘅 “CpuShares” 同 “CpusetCpus”,睇吓個容器嘅 CPU 親和性同優先權點樣設定,會唔會同其他重要容器爭資源。有時,一個配置上嘅小錯誤,就好似港口得一個泊位但嚟咗十隻船(端口綁定衝突),或者貨車要兜遠路先入到倉(卷掛載路徑唔理想),都會做成樽頸。docker inspect 就係幫你發現呢啲「規劃失誤」嘅審計工具。
最後提多個進階技巧,就係將 docker inspect 同其他命令一齊用,形成一個診斷流程。例如,你可以先用 docker exec 入去個 running container 度,用 top 或者 iotop 呢啲命令睇即時資源消耗,鎖定疑似問題。然後再用 docker inspect 去深挖對應嘅配置源頭。又或者,你可以用 bash 腳本,將 docker inspect 配合 Go模板 拎到嘅關鍵數據(例如所有容器嘅 IP 同端口),自動化咁生成一個配置報告,定期檢視,咁就可以防患於未然。記住,效能優化唔係一次過嘅動作,而係一個持續監察同微調嘅過程。識得靈活運用 docker inspect 呢個對象檢查工具,從佢提供嘅容器信息查詢同容器配置細節入面提取有用情報,你就已經行咗成功嘅第一步。
About格式化輸出Professional illustrations
進階技巧:自訂輸出格式
講到 docker inspect 呢個指令,好多朋友仔可能只係識得用預設嗰大段 JSON 格式輸出,睇到眼花繚亂,想搵個特定資訊都要搵半日。咁就嘥時間啦!其實 Docker CLI 內置咗一個好強大嘅功能,就係可以用 --format 參數配合 Go模板語法 來自訂輸出格式,等你可以精準提取想要嘅 容器配置 或者 鏡像 詳細資料,唔使再係 JSON 海入面撈針。呢個絕對係管理同埋除錯嘅 進階技巧,熟練之後工作效率會快好多。
點樣用呢個自訂格式功能呢?其實個核心就係個 --format 參數。你喺打 docker inspect 之後,加個 --format,然後用雙引號包住一段 Go 模板語句就得。例如,你淨係想睇一個 容器 嘅名字同埋狀態,就可以打 docker inspect --format='{{.Name}} - {{.State.Status}}' 你個容器ID。個輸出就會係簡潔嘅一行字,例如 /my_container - running,係咪清楚直接好多呢?呢個方法對於寫 bash 腳本嚟自動化檢查 容器狀態 特別有用,你可以將輸出直接存入變數做進一步處理。
Go模板語法本身有啲似程式邏輯,但用嚟做 docker inspect 嘅格式化輸出其實唔難掌握。最基本就係用兩個大括號 {{ }} 包住要輸出嘅字段路徑。Docker 將每個 容器 或者 鏡像 視為一個對象,入面有好多層級嘅屬性。例如,你想拎個 容器 嘅 IP 地址,個路徑就係 {{.NetworkSettings.Networks.IPAddress}}。記住,開頭個點號好重要,代表當前對象。除咗單純輸出字段,Go模板仲支援條件判斷同循環遍歷,令輸出更靈活。譬如,一個 容器 可能綁定咗多個 端口映射,你可以用 {{range .NetworkSettings.Ports}} 呢個語句去循環遍歷每一個端口綁定設定,然後逐個輸出佢嘅宿主機端口同容器端口,咁樣就可以一次過清晰列出所有 網絡設置。
對於中意用 JSON格式 但又嫌預設輸出太長嘅朋友,--format 參數一樣可以幫到你。你可以用 json 函數將某部分資料以 JSON格式輸出。例如 docker inspect --format='{{json .NetworkSettings}}' 容器名,咁樣就會淨係輸出網絡設置部分,而且保持住 JSON 結構,方便你再用 jq 呢類工具做二次解析。呢個技巧喺你想深入分析某個特定配置,例如係 卷掛載 嘅詳細路徑或者 網絡 嘅詳細設定時,非常之好用。
舉個實際例子俾你感受下威力。假設你公司用緊一個類似 tutum/lamp 咁樣嘅鏡像去行服務,而你想定期檢查所有運行緊嘅 容器 入面,邊個有特別嘅 卷 掛載,同埋佢哋綁定咗去宿主機邊個端口。你可以設計一個咁樣嘅 格式化輸出 命令:docker inspect --format='容器: {{.Name}}, 鏡像: {{.Config.Image}}, 狀態: {{.State.Status}}, 卷掛載: {{range .Mounts}}{{.Source}}:{{.Destination}} {{end}}, 端口: {{range $p, $conf := .NetworkSettings.Ports}}{{$p}} -> {{(index $conf 0).HostPort}} {{end}}' 容器ID。呢個命令會輸出一行整合晒多個關鍵資訊嘅結果,讓你一眼睇晒 低層信息,做監控同記錄就方便好多。
當然,初學 Go模板語法 可能會遇到唔少問題,例如唔記得字段名點打,或者個循環遍歷寫錯咗。呢個時候,最好嘅朋友就係 Docker 官方文檔同埋 Stack Overflow 呢類開發者社區。你亦可以先去 菜鳥教程 之類嘅入門網站睇吓 Go 模板嘅基礎,理解下點樣用 if/else、range 同埋 with 呢啲控制結構。記住,練習係最重要,你唔使一次過學識所有複雜語法,由最簡單嘅 {{.Id}}、{{.State}} 開始輸出,慢慢加上去,好快你就會掌握點樣 自訂輸出格式 呢個神技,將 docker inspect 呢個 容器信息查詢 工具用到出神入化,無論係檢查 配置、網絡 定係 卷,都變得又快又準。