找不到带有 docker 的 Ubuntu WSL

Posted

技术标签:

【中文标题】找不到带有 docker 的 Ubuntu WSL【英文标题】:Ubuntu WSL with docker could not be found 【发布时间】:2020-12-09 08:50:41 【问题描述】:

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

详情请见https://docs.docker.com/docker-for-windows/wsl/。

无法更改为 WSL2 且无法安装 docker:

【问题讨论】:

您是否在 WSL 环境中使用了 apt install docker?您将需要为您的 Windows 操作系统安装完整的 docker,然后在您的 WSL 环境中安装 docker CLI 工具,将 WSL 的 docker 指向您主机的 docker 端口。这应该会有所帮助:nickjanetakis.com/blog/… 【参考方案1】:

正如 Taylor 在他的评论中所写,您需要从 WSL 连接到 docker 桌面。 在您附加的图像中有一个复选框expose daemon on ... 选中此框。 现在你需要 docker cli,你可以安装 Linux vm,然后在你刚刚安装的那个 Linux vm 中安装 docker。 然后运行which docker 并将此文件复制到您的Windows 计算机。 将 docker 可执行文件复制到 WSL 上的 /usr/local/bin。 现在在 WSL 中运行以下命令

echo "export DOCKER_HOST=tcp://localhost:2375" >> ~/.bashrc
. ~/.bashrc

这在 WSL 1 上对我有用。

Here is guide I found on the all process

【讨论】:

【参考方案2】:

我按照以下步骤操作:https://docs.microsoft.com/en-us/windows/wsl/install-win10

另外,对于 docker 进入 ubuntu,我在 docker 资源中启用它作为最后一步。 设置 > 资源 > WSL 集成。 来自:https://docs.docker.com/docker-for-windows/wsl/

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考【参考方案3】:

假设您的系统中已经有 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.

【讨论】:

如果您有多个版本,您可能还想将其设置为默认发行版:wsl --set-default Ubuntu-20.04【参考方案4】:

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

【讨论】:

这个+乔伊的回答对我有用。谢谢大家。 仅在安装wsl_update_x64.msi 后有效。请参阅此处的第 3 步 docs.docker.com/docker-for-windows/wsl/#prerequisites 我的 Docker 桌面应用程序上没有 WSL 集成,是否必须升级 Docker 桌面才能获得 WSL 集成功能? @pushStack 我有同样的问题。我在此发布日期同时安装了 WSL 2 和 Docker 桌面,但它仍然拒绝出现。 这对其他人来说可能很明显,但是除了您选择的 Fedora/Ubuntu/XXX Linux 发行版之外,Docker 还会安装/创建 WSL 发行版:【参考方案5】:

我的问题似乎是一样的,尽管集成 WSL 自安装以来已启用。

在 Windows 外壳中:

> 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://docs.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 桌面应用程序。

在 windows shell 中测试:

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

【讨论】:

我必须右键单击 docker 图标(系统任务栏)并选择 Restart Docker... 我一直发现在 docker 桌面上恢复出厂设置是唯一有效的方法 这也适用于我,但我几乎每天都必须这样做。有其他人经历过吗? 蓝鲸右键没有重启菜单项。但是,错误(疑难解答)图标中有重新启动。但是重启对我不起作用。 这是唯一对我有帮助的方法【参考方案6】:

您需要以 Admin 身份运行 WSL 控制台。 如果不是,可能无法识别 docker 命令。

【讨论】:

【参考方案7】:

对我来说,除此之外没有任何效果:右键单击正在运行的 Docker 图标(时钟旁边)并选择“切换到 Linux 容器”

我们开始吧!现在我可以使用菜单设置 > 资源 > WSL 集成。

【讨论】:

【参考方案8】:

Fabrício Pereiras 的回答对我有用,但我不得不经常这样做,这仍然很烦人。 结果表明启动顺序系统也很重要。

先启动Docker,然后启动WSL2

我不使用 Windows 启动 Docker Desktop,通常已经在 WSL 中打开了一个终端。然后找不到Docker。 Fabricios 的答案对我有用,因为我关闭了 WSL2,然后在 Docker 已经运行时再次启动它。

【讨论】:

这正是我所做的,但是如果我正在运行 wsl 并且无法为 docker 重新启动,我来这里是为了寻找另一个解决方案?有吗?【参考方案9】:

对于那些仍然有这个问题的人,我的一些符号链接神奇地消失了,并且重新安装没有任何帮助。

确保您的 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

【讨论】:

【参考方案10】:

我遇到了这个问题,我正在跑步

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

根据this answer 显示了所有正确的符号链接,但是我看到了以下内容:

which docker
/mnt/c/Program Files/Docker/Docker/resources/bin/docker

解决方法是简单地将PATH 变量设置为将/user/bin 作为第一个条目

PATH="/usr/bin:$PATH"

从众多的答案来看,似乎有很多事情会导致这个错误,所以你的里程可能会有所不同。


要检查的另一件好事是 Docker 桌面实际上正在运行。如果不是,which docker 将导致上述/mnt/c/... 目录。

【讨论】:

【参考方案11】:

删除 Ubuntu 18.04 并安装 20.04 后,我遇到了这个错误。

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

这对我有用,转到设置 --> 资源并切换“Ubuntu”然后错误消失:)

【讨论】:

【参考方案12】:

确保您的发行版与 wsl2 兼容:

https://ubuntu.com/wsl

【讨论】:

【参考方案13】:

在我的情况下,在 docker-app 中正确设置了集成,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

【讨论】:

以上是关于找不到带有 docker 的 Ubuntu WSL的主要内容,如果未能解决你的问题,请参考以下文章

docker-compose 构建失败,找不到文件但文件实际存在

Vue WSL Ubuntu - 在新应用程序中删除 HelloWorld.vue 组件时找不到“HelloWorld.vue”依赖项”

为啥在 FreeCommander 中双击启动批处理文件时 CMD 找不到 wsl 命令?

在Windows 10中启动WSL2 并安装Linux( Ubuntu 为例)并运行docker

WSL2 子系统迁移(docker&ubuntu)

开始:此命令无法运行,因为错误:系统找不到指定的文件