当 Hyper-V 容器无法启动时如何收集日志

解读

国内 Windows Server 2019/2022 与 Windows 10/11 生产环境大量采用 Hyper-V 隔离 的 Windows 容器。面试时,考官想确认你能否在 黑屏、ExitCode 137、0xC0000005、HCS 错误 等场景下,不靠图形界面就能 快速、完整、低侵入 地拿到排障证据,并给出后续闭环方案。回答必须覆盖 宿主机侧、容器侧、Hyper-V 侧、镜像侧 四条日志链路,并体现对 国内云主机(如阿里云 ECS、腾讯云 CVM)嵌套虚拟化限制 的警觉。

知识点

  1. Hyper-V 隔离 vs 进程隔离:前者多一层轻量 VM,日志路径完全不同。
  2. HCS (Host Compute Service):Windows 容器引擎,日志在 *C:\ProgramData\Microsoft\Windows\Containers*Event Viewer\Applications and Services Logs\Microsoft-Windows-Hyper-V-Compute
  3. docker-run 的 --isolation=hyperv 参数决定日志落点。
  4. docker logs 只能拿到 stdout/stderr,无法捕获 Hyper-V 启动阶段蓝屏或内核崩溃
  5. Windows 容器 = 镜像层 + 可写层 + 虚拟机芯片组配置,需同时收集 sandbox.vhdx 挂载异常vmwp.exe 崩溃转储
  6. 国内合规:日志可能含敏感业务数据,收集后需 AES-256 本地加密 再出宿主机,防止等保审计不通过。

答案

  1. 立即固化现场
    容器反复重启时先加 --restart=no 停止自动重试,防止日志滚动覆盖。

    docker update --restart=no <容器ID>
    
  2. 宿主机侧核心日志
    a) HCS 操作日志

    wevtutil epl Microsoft-Windows-Hyper-V-Compute/Operational C:\ops\hcs-oper.evtx
    

    b) Hyper-V 管理日志

    wevtutil epl Microsoft-Windows-Hyper-V-VMMS-Admin C:\ops\vmms-admin.evtx
    

    c) dockerd 服务日志(国内镜像源常因证书问题拉取失败)

    Get-WinEvent -FilterHashtable @{LogName='Application'; ID=1..9999} | 
    Where-Object Message -like "*docker*" | 
    Export-Clixml C:\ops\dockerd.xml
    
  3. 容器侧日志
    a) stdout/stderr

    docker logs <容器ID> &> C:\ops\container-stdout.log
    

    b) 容器内 Windows 事件日志(若已短暂启动)

    docker run --rm -v C:\ops:C:\out --isolation=hyperv <镜像> `
      powershell "Get-WinEvent -FilterHashtable @{LogName='System';Level=1,2} | Export-Clixml C:\out\container-system.xml"
    
  4. Hyper-V 虚拟机日志
    a) vmwp.exe 崩溃转储
    目录 C:\ProgramData\Microsoft\Windows\Hyper-V\Snapshots\CrashDumps,若存在 .dmp 立即打包。
    b) 虚拟机芯片组日志

    Get-VM | Get-VMIntegrationService | Select VMName, Name, Enabled, PrimaryStatusDescription > C:\ops\integration.log
    
  5. 镜像与存储驱动
    检查 sandbox.vhdx 是否被宿主机杀毒软件占用:

    handle64.exe C:\ProgramData\Docker\windowsfilter\*\sandbox.vhdx > C:\ops\vhdx-handle.log
    
  6. 一键收集脚本(国内面试加分项)
    把 1-5 封装成 Collect-HyperVContainerLog.ps1,输出 加密 zip

    Compress-Archive -Path C:\ops\* -DestinationPath C:\ops\$(Get-Date -Format yyyyMMddHHmm)_logs.zip
    
  7. 提交与闭环
    将加密 zip 上传到 内部 MinIO S3(内网地址),在 Jira 工单贴 对象存储预签名 URL,并给出 复现命令 + docker version + Windows 补丁号,方便后续研发还原现场。

拓展思考

  • 国内云厂商嵌套虚拟化限制:阿里云 ECS 只有 “增强型” 规格才暴露 Hyper-V 功能,若日志里出现 “Virtualization not enabled in the firmware”,需先 提交工单开启 CPU 虚拟化标志,再让客户重启实例。
  • 性能与合规权衡:Hyper-V 日志体积大,单节点 10 分钟可产生 2 GB,建议 本地先压缩再出宿主机,避免跨境传输触发 《数据出境安全评估办法》
  • 未来演进:Windows 容器正逐步放弃 Docker-Moby,转向 containerd + hcsshim;需提前熟悉 ctr-windowscontainerd 的 namespace=windows-lcow,日志路径将改为 **C:\ProgramData\containerd\root\io.containerd.runtime.v2.task\windows**,面试可主动提及,展示技术前瞻性。