共用方式為


故障排除

設定您的電腦或執行容器時遇到問題? 我們建立了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.exe

用法:

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支援要求時,這些才有用。

下載 HcsTraceProfile.wprp

# 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 給您的支持聯繫人。