如何修复因HNS错误无法重启的Docker Daemon(Windows Server环境)
修复Windows Server上Docker Daemon启动失败(HNS错误0x80080005)的方案
先确认下你的环境信息:
- Docker for Windows Server
- Windows Server 1709版本(带容器功能)
- Docker版本17.06.2-ee-6,构建版本e75fdb8
- Swarm模式工作节点,归属Ubuntu主节点组成的集群
从你提供的日志来看,核心错误是Error initializing network controller: hnsCall failed in Win32: Server execution failed (0x80080005)——这说明Windows的HNS(Host Networking Service)网络配置已经损坏,Docker在尝试恢复之前的overlay网络时无法和HNS正常交互。下面是具体的修复步骤:
步骤1:停止相关服务
打开管理员权限的PowerShell,先停掉Docker和HNS服务:
Stop-Service docker Stop-Service hns
步骤2:清理损坏的HNS配置
HNS的网络状态存储在本地文件和注册表中,这些配置已经损坏,需要彻底清理:
- 删除HNS的状态数据文件:
Remove-Item -Path "C:\ProgramData\Microsoft\Windows\HNS\HNS.data" -Force - 清理HNS对应的注册表项(修改注册表前建议先备份相关项):
reg delete "HKLM\SYSTEM\CurrentControlSet\Services\hns\State" /f
步骤3:重启服务并验证Docker启动
重新启动HNS和Docker服务:
Start-Service hns Start-Service docker
执行docker version命令,确认Docker Daemon已经正常启动。
步骤4:重新加入Swarm集群
因为清理了HNS配置,节点的Swarm集群信息也会丢失,需要从你的Ubuntu主节点获取worker节点的加入命令:
在Ubuntu主节点执行:
docker swarm join-token worker
把输出的完整命令复制到Windows节点的PowerShell中执行,重新加入Swarm集群。
步骤5:验证overlay网络功能
启动Docker后,先查看网络列表确认overlay网络存在:
docker network ls
然后可以启动一个测试容器连接到目标overlay网络,验证网络通信是否正常:
docker run -it --rm --network <你的overlay网络名称> mcr.microsoft.com/windows/servercore:1709 ping -t 8.8.8.8
额外建议
- 你的Docker EE版本17.06.2已经停止维护,建议升级到支持Windows Server 1709的最新兼容EE版本,能避免很多旧版本的网络bug;
- 后续尽量避免直接强制重启服务器,先执行
Stop-Service docker停止Docker服务后再重启服务器,减少HNS配置损坏的概率; - 检查Swarm集群主节点和Windows工作节点之间的网络连通性,确保TCP 2377、7946、4789端口始终畅通,避免overlay网络配置同步异常。
内容的提问来源于stack exchange,提问作者Ouananiche
相关产品推荐
相关产品推荐

