故障 排除

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

可以在 Log Monitor 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 详细跟踪

通常,这些仅在微软支持部门请求时才有用。

下载 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