故障排除
設定您的電腦或執行容器時遇到問題? 我們建立了PowerShell腳本來檢查常見問題。 請先試試看它找到的內容,並分享您的結果。
Invoke-WebRequest https://aka.ms/Debug-ContainerHost.ps1 -UseBasicParsing | Invoke-Expression
其與一般解決方案一起執行的所有測試清單位於腳本的 自述檔 中。
如果這對找到問題根源無濟於事,請接著在 容器論壇張貼腳本的輸出。 這是從社群取得協助的最佳位置,包括 Windows 測試人員和開發人員。
尋找記錄
有多個服務可用來管理 Windows 容器。 下一節顯示從哪裡取得每個服務的日誌。
Docker 容器記錄
docker logs
命令會從 STDOUT/STDERR 擷取容器的記錄,這是 Linux 應用程式的標準應用程式記錄儲存位置。 Windows 應用程式通常不會將記錄寫入 STDOUT/STDERR; 相反地,這些應用程式會記錄到 ETW、事件日誌或其他記錄檔等。
Log Monitor,Microsoft支援的開放原始碼工具,現已可在 github 上取得。 記錄監視器會將 Windows 應用程式記錄橋接至 STDOUT/STDERR。 記錄監視器是透過組態檔設定的。
記錄監視器使用方式
LogMonitor.exe 和 LogMonitorConfig.json 應同時包含在相同的LogMonitor目錄中。
記錄監視器可用於SHELL使用模式:
SHELL ["C:\\LogMonitor\\LogMonitor.exe", "cmd", "/S", "/C"]
CMD c:\windows\system32\ping.exe -n 20 localhost
或是 ENTRYPOINT 的使用模式:
ENTRYPOINT C:\LogMonitor\LogMonitor.exe c:\windows\system32\ping.exe -n 20 localhost
這兩個範例使用方式都會封裝 ping.exe 應用程式。 其他應用程式(例如 IIS.ServiceMonitor)可以以類似的方式與記錄監視器整合:
COPY LogMonitor.exe LogMonitorConfig.json C:\LogMonitor\
WORKDIR /LogMonitor
SHELL ["C:\\LogMonitor\\LogMonitor.exe", "powershell.exe"]
# Start IIS Remote Management and monitor IIS
ENTRYPOINT Start-Service WMSVC; `
C:\ServiceMonitor.exe w3svc;
Log Monitor 啟動封裝的應用程式作為子程序,並監控應用程式的 STDOUT 輸出。
請注意,在 SHELL 使用模式中,CMD/ENTRYPOINT 指令應該以 SHELL 格式指定,而不是以 exec 格式。 使用 CMD/ENTRYPOINT 指令的 exec 格式時,不會啟動 SHELL,而且不會在容器內啟動記錄監視器工具。
如需更多使用資訊,請參閱 記錄監視器 wiki。 您可以在 GitHub 儲存庫 中找到 IIS 等主要 Windows 容器案例的範例配置檔。 您可以在此 部落格文章中找到更多背景資訊,。
Docker 引擎
Docker 引擎會將日誌記錄到 Windows '應用程式' 事件日誌,而不是記錄到檔案。 您可以使用 Windows PowerShell 輕鬆地讀取、排序和篩選這些記錄
例如,這會顯示從最舊開始的最後 5 分鐘 Docker 引擎記錄。
Get-EventLog -LogName Application -Source Docker -After (Get-Date).AddMinutes(-5) | Sort-Object Time
這也可以輕鬆地將資料導出到 CSV 檔案,供其他工具或試算表讀取。
Get-EventLog -LogName Application -Source Docker -After (Get-Date).AddMinutes(-30) | Sort-Object Time | Export-CSV ~/last30minutes.CSV
啟用偵錯日誌
您也可以在 Docker 引擎上啟用偵錯層級記錄。 如果一般記錄沒有足夠的詳細數據,這可能有助於進行疑難解答。
首先,開啟提升許可權的命令提示符,然後執行 sc.exe qc docker
以取得 Docker 服務的當前命令列。
例:
C:\> sc.exe qc docker
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: docker
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : "C:\Program Files\Docker\dockerd.exe" --run-service
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : Docker Engine
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem
取得目前的 BINARY_PATH_NAME
,然後進行修改:
- 將 -D 新增至結尾
- 使用 \ 逸出每個 ”
- 請用雙引號括住整個命令。
然後執行 sc.exe config docker binpath=
後面接著新的字串。 例如:
sc.exe config docker binpath= "\"C:\Program Files\Docker\dockerd.exe\" --run-service -D"
現在,重新啟動 Docker 服務
sc.exe stop docker
sc.exe start docker
這會將更多項目記錄到應用程式事件記錄檔中,因此在您完成疑難解答之後,最好移除 [-D
] 選項。 使用與上述相同步驟,但排除第 -D
步驟,然後重新啟動服務以停用偵錯記錄功能。
上述的另一個方式是以提升權限的 PowerShell 提示字元將 Docker 後台程序設為偵錯模式執行,直接將輸出捕捉到檔案中。
sc.exe stop docker
<path\to\>dockerd.exe -D > daemon.log 2>&1
取得堆疊傾印
一般而言,只有在 Microsoft 支援或 Docker 開發人員明確要求的情況下才有用。 它可用來協助診斷 Docker 似乎卡住不動的情況。
用法:
docker-signal --pid=$((Get-Process dockerd).Id)
輸出檔案將位於 Docker 執行的 data-root 目錄中。 預設目錄為 C:\ProgramData\Docker
。 您可以執行 docker info -f "{{.DockerRootDir}}"
來確認實際目錄。
檔案將會是 goroutine-stacks-<timestamp>.log
。
請注意,goroutine-stacks*.log
不包含個人資訊。
主機計算服務
Docker 引擎相依於 Windows 特定的主機計算服務。 它有個別的記錄:
- Microsoft-Windows-Hyper-V-Compute-Admin
- Microsoft-Windows-Hyper-V-Compute-Operational
它們會顯示在事件查看器中,也可能使用PowerShell進行查詢。
例如:
Get-WinEvent -LogName Microsoft-Windows-Hyper-V-Compute-Admin
Get-WinEvent -LogName Microsoft-Windows-Hyper-V-Compute-Operational
擷取 HCS 分析/偵錯記錄
若要開啟分析/偵錯記錄以供 Hyper-V 計算,並將其儲存至 hcslog.evtx
。
# Enable the analytic logs
wevtutil.exe sl Microsoft-Windows-Hyper-V-Compute-Analytic /e:true /q:true
# <reproduce your issue>
# Export to an evtx
wevtutil.exe epl Microsoft-Windows-Hyper-V-Compute-Analytic <hcslog.evtx>
# Disable
wevtutil.exe sl Microsoft-Windows-Hyper-V-Compute-Analytic /e:false /q:true
擷取 HCS 詳細信息追蹤
一般而言,只有在Microsoft支援要求時,這些才有用。
# Enable tracing
wpr.exe -start HcsTraceProfile.wprp!HcsArgon -filemode
# <reproduce your issue>
# Capture to HcsTrace.etl
wpr.exe -stop HcsTrace.etl "some description"
提供 HcsTrace.etl
給您的支持聯繫人。