故障 排除
设置计算机或运行容器时遇到问题? 我们创建了一个 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 --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 详细跟踪
通常,这些仅在微软支持部门请求时才有用。
# 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
。