Windows 10上启动Docker桌面版崩溃

13

我通过“Docker Desktop Installer”在Windows 10上安装了Docker桌面版。

安装后,我注销并登录。过了一段时间后启动时崩溃,并显示以下信息:

Docker.Core.Backend.BackendDestroyException:
One or more errors occurred.
   at Docker.Core.Pipe.NamedPipeClient.<TrySendAsync>d__5.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Docker.Core.Pipe.NamedPipeClient.Send(String action, Object[] parameters)
   at Docker.Actions.DoStart(SynchronizationContext syncCtx, Boolean showWelcomeWindow, Boolean withNotifications)
   at Docker.Actions.<>c__DisplayClass26_0.<StartAsync>b__0()
   at Docker.ApiServices.TaskQueuing.TaskQueue.<>c__DisplayClass18_0.<.ctor>b__1()

  System.AggregateException:
  One or more errors occurred.
     at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
     at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
     at Docker.Backend.LifecycleClient.DockerStart()
     at Docker.Backend.ContainerEngine.Linux.DoStart(Settings settings, String daemonOptions, Credential credential)
     at Docker.Backend.ContainerEngine.Linux.Start(Settings settings, String daemonOptions, Credential credential)

     Docker.Core.HttpBadResponseException:
     unable to fetch daemon.json: Get http://unix/engine/daemon.json: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
        at Docker.Backend.HttpClientExtensions.<ParseResponseBodyAsJsonAsync>d__2`1.MoveNext()
     --- End of stack trace from previous location where exception was thrown ---
        at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
        at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
        at Docker.Backend.HttpClientExtensions.<GetJsonAsync>d__0`1.MoveNext()

我卸载了Docker,重新启动了我的电脑并选择了“Windows容器”安装。然后在重新启动后检查是否正在运行docker。它成功地启动了。但是当我切换到Linux容器时,它再次以相同的错误消息失败。

我卸载、重启电脑、并选择“Windows容器”安装。重新启动后,检查是否正在运行Docker,它成功启动了。但是,当我切换到Linux容器时,它仍然以相同的错误信息失败。


你是否启用了虚拟化程序?同时,你确定在切换到Linux容器时没有尝试运行Windows容器吗? - A_kat
我以管理员身份运行它并解决了我的问题。 - Ali Sohrabi
7个回答

16

解决此问题的主要目标是:

  1. 按下Windows的“开始”按钮
  2. 通过键盘输入services + enter
  3. 找到两个服务: “Hyper-V虚拟机管理”和“Hyper-V主机计算机服务”
  4. (对于每个服务)鼠标右键单击,选择“属性”,在打开的窗口中将“启动类型”更改为“手动”,然后点击“确定”按钮。
  5. 再次右键单击每个鼠标,选择启动
  6. 按下Windows的“开始”按钮,输入“hyper-v”,它将显示超级管理器,请打开它
  7. 在超级管理器中选择“连接到服务器”,从弹出窗口中选择“本地计算机”
  8. 运行您的桌面docker,现在它可能已经可以正常工作了,没有崩溃和异常。

15
我在我的服务列表中没有看到Hyper-V虚拟机管理。您能告诉我如何解决这个问题吗? - JM217
3
请前往控制面板并选择“打开或关闭Windows功能”,然后搜索Hyper-v,在其中启用Hyper-v服务。 - Ali Sohrabi
谢谢!这个方法解决了我的问题。今天早上我连续遇到了3次崩溃,但在尝试了您的建议后,崩溃问题得以解决。似乎微软最近的Windows 10安装默认没有包含Hyper-V管理工具,但可以通过打开“启用或关闭Windows功能”并启用Hyper-V > Hyper-V管理工具来轻松解决。 - Colin
@JalilMarkel 并非所有计算机都可以运行Hyper-V,特别是那些具有旧CPU架构且不支持SLAT的旧计算机。请检查您的CPU是否支持SLAT,因为运行Hyper-V需要它。如果不支持,请改用WSL2。 - Mizile

1
  1. 点击开始按钮
  2. 然后输入services
  3. 搜索 Docker Desktop Services
  4. 点击它
  5. 在左上角点击 停止服务
  6. 然后点击 启动服务

现在以管理员身份打开Windows PowerShell
输入docker
这将显示命令列表
之后输入docker images
这将显示以下错误

error during connect: This error may indicate that the docker daemon is not running.

之后运行此命令

& 'C:\Program Files\Docker\Docker\DockerCli.exe' -SwitchDaemon

然后运行以下命令

docker images

这将解决您的问题


5
没有任何效果。另外了解这应该做什么以及为什么它有助于会更加有帮助。 - MorganGalpin

0

其他答案已经提供了帮助,我只是尝试更具体地避免一些陷阱,通过在路径中使用环境变量并附加一些细节和核心问题的推理:

首先,请确保“Docker Desktop Service”正在运行,这应该是在安装后直接注销并重新登录或重新启动系统后的情况。要检查服务的状态,请单击/按下/触摸“开始”按钮/Windows键以启动集成的桌面搜索,并键入:

services

或者输入

services.msc

在桌面搜索中,或按住“Windows键”和“R键”打开运行对话框,然后松开按键。在“运行对话框”中输入

services.msc

使用命令行界面(CLI)工具"DockerCli.exe",并使用属性/选项"SwitchDaemon"。为此,您需要打开一个命令行,可以是PowerShell或CommandShell,您可以通过单击/按下/触摸开始按钮/Windows键来启动集成桌面搜索,并输入以下内容:
cmd

对于命令行界面或PowerShell:

powershell

或者您可以像之前提到的那样在桌面搜索中键入 "cmd.exe" 或 "powershell.exe",也可以按住 "Windows" 键和 "R" 键打开 "运行" 对话框,然后释放键。在 "运行" 对话框中键入 "cmd.exe" 或 "powershell.exe"。

要实际切换 Docker 服务操作模式,请使用以下命令:

如果您在命令提示符/cmd.exe中,请键入:

cmd -C "%ProgramFiles%\Docker\Docker\DockerCli.exe -SwitchDaemon"

如果您在使用 PowerShell,请输入:

& "Env:ProgramFiles\Docker\Docker\DockerCli.exe -SwitchDaemon"

如果您觉得这一切太复杂,想尝试“点火即忘”的方法——基于 Docker-Desktop-Service 已经在运行的假设,因为您在安装后已经注销并重新登录或者已经重启了系统,那么您可以使用运行对话框(通过 Win+R 打开)并粘贴以下命令:

powershell.exe & "$Env:ProgramFiles/Docker/Docker/DockerCli.exe -SwitchDaemon"

这个命令可以正常工作,因为它显式地执行 PowerShell(它是 Windows 10 的一部分,而 Docker Desktop 只能在 Windows 10 上运行),并将命令 DockerCli.exe -SwitchDaemon 传递给 PowerShell。路径通过 System-Environment-Variable ProgramFiles 确定,它会解析到您的系统根目录和 Program-Files 目录(在大多数情况下为“C:\Program Files”,但也可能位于手动设置的驱动器号上,例如“B:”(通常用于嵌入式系统以防止自动创建交换文件),在这种情况下为“B:\Program Files”。

它依赖于 Windows 10 系统上 Docker Desktop 的标准安装路径,如果您更改了该路径,则必须相应地调整路径。您将没有任何反馈。在从 Run 对话框中粘贴并执行命令后,请从“开始菜单”启动“Docker Desktop”。

所有示例中的路径都设置在引号("")中,以保证可以执行。如果您例如想要为首次部署后的第一次使用准备桌面上的快捷方式,标题为“运行此一次(如果 Docker Desktop 无法启动)”,则这也是必需的。这样,您就可以将其作为已预装 Docker 的映像的一部分。

请注意,主要问题在于Docker使用WSL2来提供其基于Linux的容器(仅适用于Windows 10 Home),而要运行Windows容器,需要启用Hyper-V,不幸的是后者与Windows 10桌面操作系统上的WSL2相矛盾。您可以随后通过Windows 10功能启用Hyper-V,Virtual-Machine-Services和Windows-Containers,但不能保证它们能够与WSL2一起正常工作。

0

对我来说,解决方案是在我的计算机BIOS中启用CPU的虚拟化。Docker依赖于虚拟化来使容器工作。对我来说,当它被禁用时,Docker桌面版一直崩溃、重启,并且没有给我太多有用的信息。

这里有一个有用的页面,其中包含一些关于如何启用虚拟化的详细信息: https://bce.berkeley.edu/enabling-virtualization-in-your-pc-bios.html

简要说明如下:

  1. 重新启动计算机。
  2. 按DEL或F2或您的计算机所需的任何键进入BIOS。
  3. 查找CPU设置,然后找到称为VT-x、AMD-V、SVM或Vanderpool的东西。启用它。
  4. 保存设置并重新启动计算机。

0

您应该打开Hyper-V部分。没有Hyper-V,Docker无法工作。

如何打开Hyper-V部分:

  1. 右键单击Windows按钮,选择“应用程序和功能”。
  2. 在相关设置下,在右侧选择“程序和功能”。
  3. 选择“打开或关闭Windows功能”。 选择Hyper-V并单击确定。

0

问题很简单...

如果您正在使用Windows版Docker桌面应用程序,请前往Windows屏幕右下角的系统托盘,右键单击Docker鲸标,然后在弹出的Docker设置中选择切换到Windows容器...

enter image description here

如果您没有安装和运行像在HyperVisor下运行的Moby VM这样的Linux容器主机VM以及安装和运行Docker Daemons及其所有依赖项,则无法使用Linux容器。

我建议您使用Windows容器。否则,您需要在Windows计算机上进行更大的设置。


-1
更新我的Windows版本似乎可以解决这个问题。我遇到了同样的错误,但是在更新Windows后,Docker运作得很好。

2
欢迎来到 Stack Overflow!请抽出时间阅读关于页面,并访问如何撰写好答案,以便不仅帮助提问者,还能帮助更多遇到类似问题的用户。 - Will R.O.F.
1
你使用的是哪个版本的Windows来解决这个问题?如果你不知道,打开cmd.exe并输入winver - Will R.O.F.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接