Share via


疑難排解

您有設定電腦或執行容器方面的問題嗎? 我們建立了一份 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;

記錄監視器會啟動包裝的應用程式作為子進程,並監視應用程式的 STDOUT 輸出。

請注意,在 SHELL 使用模式中,CMD/ENTRYPOINT 指令應該在 SHELL 表單中指定,而不是 exec 表單。 使用 CMD/ENTRYPOINT 指令的 exec 形式時,不會啟動 SHELL,而且不會在容器內開機記錄監視器工具。

如需詳細資訊,請參閱 記錄監視器 Wiki。 您可以在 github 存放庫中找到主要 Windows 容器案例 (IIS 等) 範例組態檔。 您可以在此 部落格文章中找到其他內容。

Docker 引擎

Docker 引擎會將事件記錄至 Windows 應用程式事件記錄檔,而不是記錄至檔案。 您可以使用 Windows PowerShell,輕鬆讀取、排序和篩選這些記錄檔

比方說,這會顯示 Docker 引擎前 5 分鐘的記錄檔,並從最舊的開始排序。

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 Engine 啟用偵錯層級記錄。 當標準記錄檔的詳細資料不足時,這可能會很有幫助。

首先,請開啟提升權限的命令提示字元,然後執行 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

Usage :

docker-signal --pid=$((Get-Process dockerd).Id)

輸出檔案會位於執行中的資料根目錄 Docker 中。 預設目錄為 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 給支援連絡人。