故障排除

设置计算机或运行容器时遇到问题? 我们创建了一个 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 使用模式中,应在 SHELL 窗体而不是 exec 窗体中指定 CMD/ENTRYPOINT 指令。 使用 CMD/ENTRYPOINT 指令的 exec 形式时,不会启动 SHELL,并且不会在容器内启动日志监视器工具。

可以在 日志监视器 Wiki 上找到更多使用情况信息。 可在 github 存储库中找到关键 Windows 容器方案 (IIS 等) 的示例配置文件。 可在此 博客文章中找到其他上下文。

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 的数据根目录中。 默认目录是 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