首先明确一下docker 为什么需要WSL,WSL是一个Windows下的Linux子系统,Docker服务(Windows版)需要使用一个Linux子系统,构建自己的容器。 WSL里面可以管理,创建Linux子系统。
遇到问题一开始是在,vscode中,试图用docker运行一个容器,失败,
`docker:error during connect: the error may indicate that the docker daemon is not running: Post "http://"
system cannot find the file specfied.
经查询是docker服务没开启,然后尝试打开docker服务,(启动docker desktop),依旧报错。
deploying WSL2 distributions
provisioning docker WSL distros: ensuring main distro is deployed: deploying "docker-desktop": importing WSL distro "无法配置 networkingMode Nat)(网络。若要禁用网络,请在C:\\Users\\abc\\.wslconfig中设置“wsl2.networkingMode=None”\r\nError code: Wsl/Service/RegisterDistro/CreateVm/ConfigureNetworking/HNS/ERROR_NOT_FOUND\r\n" output="docker-desktop": exit code: 4294967295: running WSL command wsl.exe C:\WINDOWS\System32\wsl.exe --import docker-desktop <HOME>\AppData\Local\Docker\wsl\main C:\Program Files\Docker\Docker\resources\wsl\wsl-bootstrap.tar --version 2: 无法配置 networkingMode Nat)(网络。若要禁用网络,请在<HOME>\.wslconfig中设置“wsl2.networkingMode=None”
报错的问题是没有配置网络,提示要禁用一下网络,我觉得不行,因为docker pull request 类似于git 都需要网络。(后来发现问题就是这么解决的),但我当时不信,就采用了。
问题依旧没有解决。又尝试了,依旧是原问题。
这时候从docker的官方论坛上找到了一个回答,还是外文,看的我很激动。但是要删除所有的镜像和库,我觉得可以,数据都有保存下来。遂尝试。
这时候问题就开始broken了。起因是这条命令清除了,
wsl中的 docker-desktop-data 的distros。
而docker就是依托这个distros 和另一个初始化的distros 提供服务。
问题开始变成, 在powershell中,输入wsl命令,没有反应,很久才提示,
docker 的报错变成了
provisioning docker WSL distros: getting WSL distro list: running WSL command wsl.exe C:\WINDOWS\System32\wsl.exe -l -v --all: context deadline exceeded
checking if isocache exists: CreateFile \\wsl$\docker-desktop-data\isocache\: The network name cannot be found.
经多方查证,第一句关键一些,说明wsl提供服务超时。
问题这时候来到wsl出问题了,wsl的重装和卸载在 官方文档中并没有。
但是我们可以查到,是取消 功能中的 Windows for Linux 服务,以及 虚拟机平台。 重启电脑,再开启,重启电脑。
wsl --install好像是需要挂梯子的,详见另外的帖子。
重装服务之后,因为之前的distros 被我删完了,所以重装ubuntu子系统(主要是通过在store里面 添加ubuntu系统,然后点进系统出现问题)。 重装遇到问题,
正在启动Ubuntu,
但是
wslregisterdistribution failed with error ! 0x80070470
好好好,这个问题。
找到一个看起来有点东西的解答(实际上遇到这个问题的不多)
尝试,但是失败。很有问题。最终是在github中的issues查到了一个可行的解决办法。
(此时已经重装or重启 n次电脑)
https://github.com/microsoft/WSL/issues/11044
在windows 下面的在windows下面的%UserProfile%文件夹里面,创建一个.wlsconfig,写入以下内容。解决到wsl -l -v能出现结果。
[wsl2]
networkingMode=none