Ubuntu WSL 中找不到 Docker。

159

在此 WSL 1 发行版中找不到命令 $ docker。 我们建议将此发行版转换为 WSL 2 并在 Docker Desktop 设置中激活 WSL 集成。

有关详细信息,请参见 https://docs.docker.com/docker-for-windows/wsl/

无法更改为 WSL2,也无法安装 docker:

docker wls


1
你在WSL环境中是否安装了apt install docker?你需要在Windows操作系统上安装完整的docker,然后在WSL环境中安装docker CLI工具,并将WSL的docker指向主机的docker端口。这应该会有所帮助:https://nickjanetakis.com/blog/setting-up-docker-for-windows-and-wsl-to-work-flawlessly - Taylor Reece
1
我偶尔会遇到相同的错误。问题总是在我进入Docker桌面并按下更新按钮后自行解决。也许这可以帮助其他人。 - java lava
我需要这个的原因是容器中的所有bash命令都非常慢。所以在我的情况下,我打开了“Windows的Ubuntu”并执行explorer.exe .,这打开了一个网络文件夹,在其中我必须从“c:\dev”即Windows文件系统中复制所有的项目。之后什么也不起作用了,Fabrício的答案拯救了一天。然后在Windows的Ubuntu中,我执行了cd dev/gitlab.mycompany.com/my-project/sub-project然后code .打开了VS Code中WSL版本的我的项目。重建Docker容器,现在一切都运行得很顺畅。 - s3c
经常导致我进行这个谷歌搜索的问题非常简单:我忘记启动Docker桌面版 :) - s3c
26个回答

246

您需要进入Docker桌面设置,并在“资源->WSL集成”中启用与您的发行版的集成。

输入图像描述


4
这个+Joey的回答对我有用。谢谢你们。 - element11
4
只有在安装了 wsl_update_x64.msi 后才能正常运行。请参考此处的第3步骤:https://docs.docker.com/docker-for-windows/wsl/#prerequisites - Dizzy
2
这对其他人可能很明显,但除了您选择的Fedora/Ubuntu/XXX Linux发行版之外,Docker还将安装/创建WSL发行版docker-desktop和docker-desktop-data。您可能需要在PowerShell中运行&C:\Program Files\Docker\Docker\DockerCli.exe' -SwitchDaemon。我不得不两次“SwitchDaemon”,第一次是为了让我能够进入Docker桌面设置,但它没有显示WSL集成。所以我再次运行了“SwitchDaemon”,它愿意显示WSL集成。我必须经历这个过程,因为某些恼人的系统更新。 - Woodsman
1
谢谢,这个可行! - times29
2
在我的Docker工作之前,我必须这么做:打开Docker桌面并单击右上角的“故障排除”图标。单击“清除/清除数据”,仅选择“WSL 2”,然后单击“删除”。重新启动Docker。在此之前,docker-desktop-data已停止。 - Superdooperhero
显示剩余4条评论

117

假设您的系统已经安装了wsl 2,请以管理员身份运行powershell:

运行wsl --list --verbose,将会给出您正在运行的wsl进程列表:

> wsl --list --verbose
  NAME                   STATE           VERSION
  Ubuntu-20.04           Running         1

然后使用 wsl --set-version <your proc> 2 命令进行切换:

> wsl --set-version Ubuntu-20.04 2
Conversion in progress, this may take a few minutes...
For information on key differences with WSL 2 please visit https://aka.ms/wsl2
Conversion complete.

7
如果你有多个版本,你可能想将其中一个版本设置为默认的发行版版本:wsl --set-default Ubuntu-20.04 - Wes
这个方法只有在重启电脑后才能生效。 - Dhia Djobbi
非常感谢,运行得很顺利。 - temo

99

尽管WSL已经启用,但我的问题似乎仍然存在。

在Windows shell中:

> wsl docker --version

The command 'docker' could not be found in this WSL 2 distro.
We recommend to activate the WSL integration in Docker Desktop settings.

See https://docs.docker.com/docker-for-windows/wsl/ for details.

重新安装Docker Desktop是解决此问题的一种选择(https://learn.microsoft.com/en-us/virtualization/windowscontainers/manage-docker/configure-docker-daemon#how-to-uninstall-docker),但不需要这样做。
以下步骤适用于我(我在https://github.com/docker/for-win/issues/7039找到了解决方法)。
打开Windows shell(可能需要管理员权限),并运行:
> wsl -t docker-desktop
> wsl --shutdown
> wsl --unregister docker-desktop

然后进入Windows服务,停止Docker桌面服务,或在以管理员身份运行的Windows shell中运行以下命令:

> Stop-Service -Name "com.docker.service"

最后,重新启动 Docker Desktop 应用程序。

在 Windows Shell 中进行测试:

> wsl docker --version
Docker version 20.10.2, build 2291f61

27
我需要右键点击Docker图标(系统任务栏),然后选择 **重启Docker...**。 - Fuhrmanator
1
我发现在 Docker Desktop 上进行恢复出厂设置是唯一可行的方法。 - doctorlove
1
这对我也有效,但我几乎每天都要这样做。还有其他人有这种经历吗? - MrSnoozles
2
当我右键单击蓝鲸时,没有重新启动菜单项。但是,在错误(故障排除)图标中有一个重新启动选项。但是重新启动对我无效。 - kiatng
4
这是唯一帮助过我的方法。 - bksi
显示剩余6条评论

18

我在升级操作系统从Ubuntu 18.04到20.04后遭遇了这个错误。

即使启用了WSL 2,我仍然遇到了这个错误。

这是对我有效的方法:进入“设置”-->“资源”,切换“Ubuntu”选项,然后错误就消失了 :)

显示图片描述


惊讶地发现在“常规”部分已经启用了“使用基于WSL 2的引擎”,还需要启用一个额外的Ubuntu标志。但问题已经解决了! - Ricardo stands with Ukraine
那对我有用,谢谢!! - undefined

12

对我来说,唯一有效的方法是右键单击正在运行的Docker图标(靠近时钟),然后选择“切换到Linux容器”。

输入图像描述

好了!现在我可以拥有“设置”菜单>“资源”>“WSL集成”选项。


这对我有效。 - Linar

11
对我来说,在wsl终端中运行以下命令有效:
sudo apt-get update
apt-cache policy docker-ce
sudo apt-get install -y docker-ce
sudo apt-get install docker-compose
sudo apt-get upgrade

来源:https://www.srcmake.com/home/fabric


1
软件包“docker-ce”没有安装候选项。 - Zenahr

7

在资源管理器下,我没有看到WSL(Windows Subsystem for Linux)集成的选项。

我需要在“常规设置”下取消勾选“使用基于WSL2的引擎”,点击应用,然后再次勾选它并点击应用。这样,在资源管理器下就可以看到WSL集成选项,并且可以单击Ubuntu滑块。


6

对于那些仍然遇到此问题的人,我的某些符号链接神奇地消失了,重新安装也没有用。

确保在您的WSL2安装中有以下符号链接:

$ ls -l /usr/bin/ | grep docker
lrwxrwxrwx 1 root   root          56 Jul 14 13:01 com.docker.cli -> /mnt/wsl/docker-desktop/cli-tools/usr/bin/com.docker.cli
lrwxrwxrwx 1 root   root          48 Jul 14 13:01 docker -> /mnt/wsl/docker-desktop/cli-tools/usr/bin/docker
lrwxrwxrwx 1 root   root          56 Jul 14 13:01 docker-compose -> /mnt/wsl/docker-desktop/cli-tools/usr/bin/docker-compose
lrwxrwxrwx 1 root   root          59 Jul 14 13:01 docker-compose-v1 -> /mnt/wsl/docker-desktop/cli-tools/usr/bin/docker-compose-v1
lrwxrwxrwx 1 root   root          71 Jul 14 13:01 docker-credential-desktop.exe -> /mnt/wsl/docker-desktop/cli-tools/usr/bin/docker-credential-desktop.exe
lrwxrwxrwx 1 root   root          50 Jul 14 13:01 hub-tool -> /mnt/wsl/docker-desktop/cli-tools/usr/bin/hub-tool
lrwxrwxrwx 1 root   root          48 Jun 29 09:27 notary -> /mnt/wsl/docker-desktop/cli-tools/usr/bin/notary

毕竟这就是问题。 - ata
你有任何想法为什么/如何发生这种情况吗?我不认为我的设置在/usr/bin下有符号链接,但显然这是一个解决方法。我阅读了docker(而不是docker.exe)文件/mnt/c/Program Files/...,它是一个shell脚本,检查/usr/bin中的docker。 - tijko
不好意思,我也不知道。我只是发现了上面缺失的符号链接,然后问题就解决了。 - agentgonzo

5

我遇到了这个问题,对我来说运行

$ ls -l /usr/bin/ | grep docker

根据此答案,所有正确的符号链接均已显示,但我看到了以下内容:
which docker
/mnt/c/Program Files/Docker/Docker/resources/bin/docker

解决方法很简单,只需将PATH变量的第一个条目设置为/usr/bin
PATH="/usr/bin:$PATH"

从众多的答案中看,似乎有很多因素会导致这个错误,所以你可能需要针对具体情况进行处理。


另一个要检查的好方法是确保Docker Desktop正在运行。如果它没有运行,which docker会返回上述/mnt/c/...目录。


4

在我的情况下,docker应用程序已正确设置集成,WSL2已正确设置为默认wsl,但我无法像其他答案中提到的那样取消注册wsl docker实例并重启docker服务。

过了一段时间后,我注意到命令docker-compose成功运行。问题仅限于docker命令。

我在目录usr/bin中寻找所有的docker命令,这是docker-compose所在的路径(which docker-compose),因此运行ls -l /usr/bin | grep docker,我发现

drwxrwxrwx  1 root   root          48 Nov 29 10:59 docker
lrwxrwxrwx  1 root   root          56 Nov 29 10:59 docker-compose -> /mnt/wsl/docker-desktop/cli-tools/usr/bin/docker-compose*
lrwxrwxrwx  1 root   root          59 Nov 29 10:59 docker-compose-v1 -> /mnt/wsl/docker-desktop/cli-tools/usr/bin/docker-compose-v1*
lrwxrwxrwx  1 root   root          71 Nov 29 10:59 docker-credential-desktop.exe -> /mnt/wsl/docker-desktop/cli-tools/usr/bin/docker-credential-desktop.exe*
lrwxrwxrwx  1 root   root          50 Nov 29 10:59 hub-tool -> /mnt/wsl/docker-desktop/cli-tools/usr/bin/hub-tool*

由于某些奇怪的原因,Docker不是符号链接,而是一个目录。

我通过删除该目录并手动重新创建符号链接来解决该问题:

rm -rf /usr/bin/docker
sudo ln -s /mnt/wsl/docker-desktop/cli-tools/usr/bin/docker /usr/bin/docker

很棒,它有所帮助,但我遇到了下一个问题,即使用exec命令时出现了“com.docker.cli可执行文件在$ path中找不到”的错误,可以通过使用备用命令来解决,将其指向cli com.docker.cli sudo ln -s /mnt/wsl/docker-desktop/cli-tools/usr/bin/com.docker.cli /usr/bin/docker - Andrzej Krawczuk

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