故障排除
设置计算机或运行容器时遇到问题? 我们创建了一个 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 --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 支持请求时才有用。
# 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
。