那么,我实际上在问什么?

那么,我实际上在问什么?

我一直在尝试在 Windows VM 上安装并运行 Docker,以便更好地了解下游工作的运行时,但在启动容器时遇到了问题hello-world

环境:

  • VMWare 虚拟硬件:
    • 4 GB 内存
    • Intel Xenon CPU(双核)
  • Windows Server 2016 标准版(版本 1607)
  • 一些防病毒和防火墙注意事项(我正在获取更多相关信息)

输出自docker version

Client:
 Version:      17.06.2-ee-6
 API version:  1.30
 Go version:   go1.8.3
 Git commit:   e75fdb8
 Built:        Mon Nov 27 22:46:09 2017
 OS/Arch:      windows/amd64

Server:
 Version:      17.06.2-ee-6
 API version:  1.30 (minimum version 1.24)
 Go version:   go1.8.3
 Git commit:   e75fdb8
 Built:        Mon Nov 27 22:55:16 2017
 OS/Arch:      windows/amd64
 Experimental: false

有效的方法:

尚未实现的:

运行任何容器。我们尝试了一些:

  • hello-world:nanoserver
  • hello-world:latest
  • microsoft/nanoserver:latest
  • microsoft/windowsservercore:latest

我已经尝试过什么(但没有成功):

  • 放宽组策略设置
  • 启用 Hyper-V Windows 可选组件

实际情况:

当我尝试使用启动容器时docker run {container-name-here},PowerShell 会挂起相当长的时间(几分钟)并打印以下消息:

C:\Program Files\docker\docker.exe: Error response from daemon: container
    {container-id-here} encountered an error during Start: failure in a
    Windows system call: This operation returned because the timeout
    period expired. (0x5b4).

docker events日志中,我同时收到以下消息:

2018-04-18T09:36:27.881680400-04:00 container create {container-id-here} (image=hello-world:nanoserver, name=confident_ardinghelli)
2018-04-18T09:36:27.883680800-04:00 container attach {container-id-here} (image=hello-world:nanoserver, name=confident_ardinghelli)
2018-04-18T09:36:28.753726900-04:00 network connect {network-id-here} (container={container-id-here}, name=nat, type=nat)
2018-04-18T09:40:21.373395500-04:00 network disconnect {network-id-here}(container={container-id-here}, name=nat, type=nat)

network connect我们收到了和之间的超时消息network disconnect

我在搜索中找到的参考资料(这里, 和这里) 表明这可能是防病毒问题,但我无法找到任何文档来确认这是防病毒问题或哪个防病毒组件可能是问题所在,除非禁用防病毒软件并重试。我正在努力联系有权访问系统该部分的人并重试,我会更新结果。

那么,我实际上在问什么?

  • 之前有其他人遇到过此问题或类似问题吗?您采取了哪些步骤来诊断根本原因?您的问题最终是什么?
  • 我是否应该查看其他 Docker 或 Windows 日志以更好地诊断问题的原因?
  • 我们还应该尝试其他“盲目尝试”吗?完成安全调试后,我们就没什么主意了。

更新(2018-4-20):

我们与安全团队进行了交流,并启用和禁用了各种防病毒组件。当我们关闭 McAfee Host IPS (HIPS) 时,我们能够启动任何容器,正如预期的那样。当我们重新打开它时,容器又坏了!我们在 HIPS 日志中发现了一个拒绝注册表读取的警报,该警报在时间上与我们的调试会话相匹配,并且我们使用以下代码将该注册表访问追溯到 docker.exe 进程:Microsoft Sysinternals 的进程监视器。看来我们找到罪魁祸首了!

在我们为该规则添加白名单条目并确认修复后,我会报告。

答案1

解决方案

在这种情况下,McAfee 主机入侵防御服务 (HIPS) 是阻止 Docker 运行的问题。McAfee HIPS 提供了许多入侵监控规则,其中一条阻止未经授权的注册表访问的规则被触发。我们禁用了该规则docker.exe,从此一切顺利!

调试步骤

我们通过调试 Docker 发现了这个问题,方法是禁用各个安全组件,直到 Docker 能够正常运行,然后重新启用除 HIPS 之外的所有组件,以验证没有其他组件干扰。然后,我们重新启用 HIPS,重现该问题,并检查 HIPS 日志以查找与时间匹配的警报。

Docker CLI 尝试访问以下注册表项但被拒绝访问:

HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\docker.exe

我们用了Microsoft Sysinternals 的进程监视器验证注册表访问是否与 docker.exe 关联。

最后,我们禁用了该 HIPS 规则docker.exe,现在我们可以成功运行任意容器。

相关内容