无法连接到 Ubuntu Windows 上 bash 上的 Docker 守护程序

Posted

技术标签:

【中文标题】无法连接到 Ubuntu Windows 上 bash 上的 Docker 守护程序【英文标题】:Cannot connect to the Docker daemon on bash on Ubuntu windows 【发布时间】:2018-06-11 09:10:39 【问题描述】:

我可以安装 docker、docker-compose 和 docker-machine

但是当我尝试运行时

root@DESKTOP-51NFMIM:~# docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

有解决这个问题的建议吗?

【问题讨论】:

你确定 Docker 正在运行 是的,当我运行 docker --version 它返回版本 Docker 版本 17.12.0-ce, build c97c6d6 你试过运行 systemctl restart docker 吗? 你使用 WSL 还是 WSL2? 用于从 WSL 连接到本地 Docker for Windows:***.com/questions/42516777/… 【参考方案1】:

注意:如果您使用的是来自WSL (Windows Subsystem for Linux) 的 Ubuntu,请务必了解 docker 客户端正在运行,而不是 docker 服务器(守护程序)。

请参阅 Microsoft/WSL issue 2114 和 this thread。

对于服务器,您仍然只需要使用 Docker for Windows 及其 Hyper-V 虚拟机。

然后,Microsoft/WSL issue 2102 补充道:

通过将DOCKER_CERT_PATH 环境变量(我从运行eval $(docker-machine.exe env --shell bash) 获得)从“C:\C:\Users\mmarchini\.docker\machine\machines\default”更改为“/mnt/c/Users/mmarchini/.docker/machine/machines/default/”,我能够在 WSL 内部使 TLS 工作。 至少 docker build 现在似乎可以工作了,我稍后会尝试使用docker-compose

请参阅 this script(来自 Matheus Marchini)以使用正确的设置启动 docker-machine bash:

#!/usr/bin/env python3

from subprocess import run, PIPE

completed_process = run(["docker-machine.exe", "env", "--shell", "bash"], stdout=PIPE)

docker_env = completed_process.stdout.decode("ascii")

for line in docker_env.split("\n"):
    if "DOCKER_CERT_PATH" in line:
        env_var, path, _ = line.split('"')
        path = path.replace("\\", "/")
        drive, path = path.split(":", 1)
        path = "/mnt/".format(drive.lower(), path)
        line = '""'.format(env_var, path)
print(line)

【讨论】:

另见github.com/Microsoft/WSL/issues/2527,但我认为 :2375 上可用的 Docker API 不安全,因此默认情况下已关闭。【参考方案2】:

在这篇文章中找到了解决方案:https://blog.jayway.com/2017/04/19/running-docker-on-bash-on-windows/

针对不同机器上的引擎运行 docker 实际上非常简单,因为 Docker 可以公开 CLI 可以附加到的 TCP 端点。

这个 TCP 端点默认是关闭的;要激活它,请右键单击任务栏中的 Docker 图标并选择设置,然后勾选“Expose daemon on tcp://localhost:2375 without TLS”旁边的框。

完成后,我们需要做的就是指示 Bash 下的 CLI 连接到在 Windows 下运行的引擎,而不是连接到在 Bash 下运行的不存在的引擎,如下所示:

$ docker -H tcp://0.0.0.0:2375 images

有两种方法可以使其永久化 - 为上述命令添加别名或导出环境变量以指示 Docker 在哪里找到主机引擎(注意:确保在下面使用单撇号):

$ echo "export DOCKER_HOST='tcp://0.0.0.0:2375'" >> ~/.bashrc
$ source ~/.bashrc

现在,从 Bash 运行 docker 命令就像它们应该做的那样工作。

$ docker run hello-world

成功响应:

Hello from Docker!This message shows that your installation appears to be working correctly.

【讨论】:

50 个无用的 ***“答案”稍后,这个实际上解决了我的问题。甚至不知道 docker windows 应用程序中的设置。感谢您的回答! 感谢@AgmLauncher .. 也许 OP 可以将其标记为答案 :) 感谢@RamiSarieddine 的回答!终于明白了,Docker Engine 不能在 WSL 上运行,需要安装 Docker For Windows。我最终让 Docker 客户端在 Linux (WSL) 上运行Windows 上安装的 Docker Engine 守护进程发送命令 你是说 Docker Desktop 必须安装在 Windows 10 上,docker 命令才能在 Ubuntu-on-windows 中运行?我刚刚完成了这里的所有步骤https://docs.docker.com/engine/install/ubuntu/ ...在 ubuntu 子系统上安装 docker ...所以我认为它就在那里。没有“我的任务栏中的 docker 图标”,因为我没有在 windows 上安装它。【参考方案3】:

如果您运行的是 Windows 10 版本 1803 或更高版本,现在可以在没有 Docker Desktop for Windows 的情况下纯粹在 WSL 中安装和运行 Docker 客户端和服务器。我让它在以下 WSL 上工作:

OS: Ubuntu 18.04 bionic [Ubuntu on Windows 10]
Kernel: x86_64 Linux 4.4.0-17763-Microsoft

只需按照相同的instructions 在 Ubuntu 上安装,但请确保选择要安装的特定版本。目前,18.06.1~ce~3-0~ubuntu 版本运行良好,但 5:18.09.6~3-0~ubuntu-bionic 之后的版本具有启动容器的问题。以下命令将安装最新的工作版本:

apt-get install docker-ce=18.06.1~ce~3-0~ubuntu

要在安装后让 Docker 服务器在 WSL 中运行,请关闭所有打开的终端并以管理员身份启动一个新的 Ubuntu 终端(即,右键单击 Ubuntu 快捷方式并单击“以管理员身份运行”)。最后,运行以下命令:

sudo cgroupfs-mount
sudo service docker start

sudo service docker start 必须在每次重新启动 Windows 时运行。但是,如果您希望避免这种情况,您可以按照here 列出的步骤使用任务计划程序和 shell 脚本自动执行此操作。

测试一切是否正常使用:

docker run hello-world

参考: https://medium.com/faun/docker-running-seamlessly-in-windows-subsystem-linux-6ef8412377aa

【讨论】:

今天刚刚尝试了整个过程 - 不起作用,我收到“无法在 tcp://0.0.0.0:2375 连接到 Docker 守护进程。docker 守护进程是否正在运行?”错误 我遇到了与@kpollock 相同的问题,所有这些在线文章都提到了大部分相同的步骤,但是当设置 Docker for Desktop 以公开其守护进程时,它在 WSL 内部不起作用,它无论如何我都无法连接到它。 有趣的是,如果我在运行命令时设置环境变量,它可以工作,但如果它在我的.bashrc 中,它不会。例如这对我有用DOCKER_HOST=tcp://localhost:2375 docker info @kpolllock 我建议尝试重新安装您的 Ubuntu WSL 并重新开始该过程。确保您运行的是最新的 Windows 10 版本(我使用的是 1809),这将启用使用 cgroups。命令在具有提升权限的终端中运行也很重要。在没有安装 Docker Desktop for Windows 的情况下,我能够在另一个运行 Windows 10 版本 1809 的系统上运行它。 今天我能够完全在 WSL 2 中安装和运行 最新的 docker 版本。我只需要手动启动docker sudo service docker start.【参考方案4】:

对我来说,这适用于 Windows 的 WSL:

1> 转到:打开或关闭 Windows 功能 2> 取消选择“Hyper-V”,重新启动, 3> 再次转到“打开或关闭 Windows 功能”, 4> 再次选择“Hyper-V” 并重新启动最后一次。之后 docker 又可以访问了。

假设您已经安装了 docker desktop for windows 和 Settings->General->Expose daemon on tcp://localhost:2375 without TLS 被勾选

【讨论】:

非常感谢,已经搞定了【参考方案5】:

如果您在 windows 上使用 docker 桌面(并且不需要 TLS 进行连接),请转到 docker 桌面设置的常规部分并启用复选框“在 tcp://localhost:2375 上不使用 TLS 公开守护程序”。

更新:在较新的 Docker 桌面版本中,WSL 集成已移至资源部分。

【讨论】:

【参考方案6】:

只需要在你的系统中添加一个环境变量

【讨论】:

【参考方案7】:

除了已经说过的内容之外,我想与您分享一些我在设置时遇到的问题以及最终让我能够开始使用 WSL2/Docker 桌面组合的解决方案。 这不是完整的指南,只是故障排除的另一个来源!

我的目标是

    开始试验 Docker。 设置我的环境,使其符合建议且最舒适。 基本上是为了能够在使用 Docker Desktop 的同时在 Linux 环境中工作。

我是怎么做的

    我将 PC 从 Win 10 Home 升级到 Win 10 Pro,以避免我读到人们在使用 Home 版时遇到的各种问题。 我安装了 Docker Toolbox,然后删除了它以及我在 PC 上安装的 Oracle VM。我遇到了各种小问题,网上阅读说最好也删除 Oracle VM。 我安装了 Docker Desktop。

问题及其解决方案

    1. 旧 Docker Tools 安装中的一些环境变量仍然存在。 这导致 Docker Desktop 行为不端。 解决方案:我都删除了。 (任何提到 Docker 的变量名)
    2. 尝试通过 Ubuntu WSL2 连接到 localhost:2375 上的 Docker 时,出现著名的“... docker 是否正在运行”错误。 值得一提的是,在这个阶段,在 cmd docker 上工作正常。 解决方案:
- 清除我之前在 Ubuntu WSL2 上安装的 Docker。 - 确保在我的 ubuntu WSL2 上删除所有提及 Docker 的环境变量。 - 停止 Hyper-v,重新启动,在 Windows 上重新启动 Hyper-V。 - 通过 `apt-get` 安装最新版本的 Docker。

现在在 Ubuntu WSL2 上运行“docker context ls”来检查我的设置应该会导致:

名称 描述 Docker 端点 Kubernetes 端点编排器 默认 * 当前基于 DOCKER_HOST 的配置 unix:///var/run/docker.sock swarm

从 Ubuntu WSL2 运行 Docker 信息:

客户: 上下文:默认 调试模式:假 插件: 应用程序:Docker 应用程序(Docker Inc.,v0.9.1-beta3) buildx:使用 BuildKit 构建(Docker Inc.,v0.5.0-docker) 扫描:Docker 扫描(Docker Inc.,v0.5.0) 服务器: 容器:3 运行:0 暂停:0 停止:3 图片:3...

【讨论】:

【参考方案8】:

我遇到了同样的问题,花了我这么多小时才弄清楚,我意识到在没有 root 权限的情况下运行 docker ps 会出现此错误,如果其他人遇到同样的问题,您可以尝试 sudo docker ps 它对我有用

【讨论】:

【参考方案9】:

请勿在最新的 Docker 桌面中使用其他方法

尝试在 WSL2 中使用 docker 时,我遇到了同样的“无法连接到 Docker 守护程序”问题。

我相信这在最新版本的 Docker Desktop 中变得更简单了。

参考:https://docs.microsoft.com/en-us/windows/wsl/tutorials/wsl-containers

更新到最新版本(我的是 Docker Desktop 4.3.2 (72729))

可能适用于早期版本,尚未检查该功能的确切发布时间。

启用基于 WSL 2 的引擎:Settings > General > Use the WSL 2 based engine

Settings > Resources > WSL Integration 中启用 WSL 集成 (附上一张图片,因为不同版本的菜单设置可能会有所不同)

注意:奇怪的是,即使我的默认 WSL 发行版是 Ubuntu,我也必须为 Ubuntu 明确启用它才能正常工作 可能需要重启 Docker Desktop 我也不需要打开“在没有 TLS 的情况下在 tcp://localhost:2375 上公开守护程序”以使其工作

注意:我最初尝试按照其他 posts 中的建议添加 3 个 env 变量的旧方法。

但是,使用最新的 Docker Desktop,这不是必需的,并从 .bashrc 中删除了 3 个变量
$ echo >> ~/.bashrc <<EOF
# Connect to Docker on Windows
export DOCKER_CERT_PATH=/mnt/c/Users/YOUR_USERNAME/.docker/machine/certs
export DOCKER_TLS_VERIFY=1
export DOCKER_HOST='tcp://0.0.0.0:2375'
EOF
$ source ~/.bashrc

【讨论】:

以上是关于无法连接到 Ubuntu Windows 上 bash 上的 Docker 守护程序的主要内容,如果未能解决你的问题,请参考以下文章

linux系统如何连接到大学校园网?

在 openfoam 中,paraview 无法连接到 X 服务器

无法从 Ubuntu 服务器上的外部站点连接到 phpMyAdmin

无法连接到lockdownd。在 Ubuntu 上退出

在 Ubuntu 20.04 上无法连接到 mongodb,连接被拒绝

无法使用 Ubuntu 连接到在 Wine 中部署的 MySQL for .NET 应用程序