学习笔记 · 2021年5月12日

Docker 启动 “Failed to set version to docker-desktop: exit code: -1” 问题解决

浏览:221

问题解析

对 Windows 版本 docker 进行安装的时候,碰到 Failed to set version to docker-desktop: exit code: -1 的启动错误,总是无法使用,错误如图:

docker 启动报错

经过分析,应该是 wsl 版本过低造成的,因为安装 docker 的时候,勾选了 wsl2 的支持。之前似乎也遇到过,但是记不起是怎么解决的了(论技术文档的重要性~😂)。现在就从头来一遍吧,首先,将 wsl1 升级为 wsl2 。

wsl1 -> wsl2

何为 wsl?其实就是 Microsoft Windows Subsystem Linux 的简称,wsl1 和 wsl2 为内核版本号。按以下步骤将 wsl1 升级为 wsl2:

1. 检查系统是否支持

在 PowerShell 中运行 winver 查看系统版本:

系统版本信息

若要更新到 WSL 2,需要运行 Windows 10。
对于 x64 系统:版本 1903 或更高版本,采用 内部版本 18362 或更高版本。
对于 ARM64 系统:版本 2004 或更高版本,采用 内部版本 19041 或更高版本。
低于 18362 的版本不支持 WSL 2。

2. 检查系统功能是否已经开启

以管理员身份打开 PowerShell 并运行:

# 启用 wsl 支持
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

# 启用虚拟化功能
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

3. 查看目前各子系统的版本号

以管理员身份打开 PowerShell 并运行 wsl -l -v

查看各子系统的版本号

可以看到,Ubuntu 的版本号是 1,而 docker-desktop 的版本号为 2,支持的版本不匹配导致 docker 无法启动。

4. 升级 wsl 版本

以管理员身份打开 PowerShell 并运行:

# 将 wsl2 设置为默认版本
wsl --set-default-version 2

# 将 Ubuntu 的版本设置为 wsl2
# wsl --set-version <distribution name> <versionNumber>
wsl --set-version Ubuntu 2

执行后会有一个转换时间,转换完成后,即可看到 Ubuntu 的内核已经升级成了 wsl2。

Ubuntu 升级内核为 wsl2

运行命令后如果看到此消息:WSL 2 requires an update to its kernel component. For information please visit https://aka.ms/wsl2kernel。 需要安装 MSI Linux 内核更新包。适用于 x64 计算机的 WSL2 Linux 内核更新包

解决 wsl 升级无法启动的问题

wsl 已经成功升级为 2 版本了,但是新的问题又来了,升级成功后的 Ubuntu 无法进入,报错如下:

参考的对象类型不支持尝试的操作。

[已退出进程,代码为 4294967295]

经过网上查找及分析,是因为 winsock 接口冲突引起的,在安装了 VPN 及 SS 等工具的电脑上出现的概率较高,具体讨论及分析过程感兴趣的可参考(含最终解决办法):https://github.com/microsoft/WSL/issues/4177

不想看分析过程的,可以直接看下面的解决办法:

首先,需要科学上网,下载 NoLsp.exe 程序:http://www.proxifier.com/tmp/Test20200228/NoLsp.exe 。嗯,知道大家都是好童鞋,所以我保存了一份,以备不时之需。点击下载

下载完成后,以管理员身份启动 CMD,执行:

NoLsp.exe c:\windows\system32\wsl.exe

执行完成后会返回 success,问题即可修复。

命令执行成功

Ubuntu 恢复登录

问题解决

完成 wsl 的升级,以及问题的修复后,docker-desktop 也如愿以偿地完成启动了,皆大欢喜。😄

docker-desktop 正常运行

命令行也能成功执行