无法连接到 docker 守护进程。是 docker 守护进程 运行?

Cannot Connect to docker daemon. is docker daemon running?

我在本地 Mac Machine 上的 Docker 上使用 Jenkins。 我是 运行 VirtualBox 上的另一个 Docker。所以现在,有 2 docker mac 海因斯。一个在我的 mac machine 上,一个在我的 Ubuntu VirtualBox machine 上。我是 运行 詹金斯 Mac Docker。现在在 Jenkins 管道中,我想在我的 ubuntu machine 上构建一个图像。 我已经配置了 Jenkins docker 云,并且在 docker 主机 URL 中,它连接到 ubuntu docker-machine。 但是在构建新图像时,我遇到了错误。无法连接到位于 unix:///var/run/docker.sock 的 Docker 守护进程。 docker 守护程序是 运行 吗?

我什至尝试添加 ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock 在 /lib/systemd/system/docker.service

当我检查 ps -aux 时,

有人可以帮帮我吗? 感谢帮助。

首先,如果我有这样的设置,我就不会费心连接到远程 docker,而只会在 ubuntu 机器上安装一个 Jenkins 代理,并让它与 Jenkins master 通信.

但是如果你想按照他们的方式去做,你现在就设置好我们 Jenkins 从一个 docker 主机到另一个 docker 主机,我建议查看以下内容:

  1. 你的 Jenkins master 和 ubuntu 机器非常孤立,它们可能在不同的机器上,甚至不在同一个房间里。 Unix 域套接字,由 unix://* 标识的套接字用于在单个本地 OS 内核中进行通信,试图将它们桥接到远程机器将导致灾难。

  2. 因此,Jenkins 与远程主机通信的唯一方式是通过远程协议(如 TCP)。大多数情况下,当您使用默认设置安装 docker 时,它甚至根本不监听 TCP,主要是出于安全原因。

  3. 您应该做的第一件事是在 ubuntu 机器内部配置一个 docker 以侦听 TCP 端口并接受来自远程主机的连接。您可以使用 netstat -nat 查看是否有任何东西正在侦听 TCP 4243。如果配置正确,您会在 nestat

    的输出中看到带有 0.0.0.0:4243 或类似内容的统计行
  4. 其次,您需要确保 Ubuntu 主机上的 firewalls/iptables/netfilter 配置允许来自外部的连接。一个很好的尝试是从 Mac.

    上的终端会话 telnet <ubuntu-ip> 4243
  5. 然后您需要确保 docker 网络配置正确,以便来自 运行ning Jenkins 容器内部的连接最终到达您的 ubuntu盒子。要进行测试,您需要 exec -it 进入您的 jenkins 容器并重复 telnet 测试。在现代 linux 上,通常不会安装 telnet,因此您可以使用 curl -vvv,它总是会以错误结束,因此只需查看详细输出以查看错误是否是因为无法通信(超时、连接重置等)或者错误发生是因为您的 curl 试图与 docker 进行 HTTP 通信并得到乱码响应。在后一种情况下,您可以考虑正确设置。

  6. 最后你需要告诉 Jenkins Docker 通过 TCP 与远程 docker 通信。通常这是在命令行上给你的 docker 运行, docker ps, docker exec

我已经通过在我的 Jenkins 管道中定义从标签来配置它。 Jenkins 代理 运行 在各种不同的环境中,例如物理机、虚拟机、Kubernetes 集群和 Docker 图像。 在您的 Jenkins 管道或您的 JenkinsFile 中,您必须根据您使用的 Docker 图像或任何虚拟机使用的内容相应地设置代理。 也非常感谢@Vlad,你告诉我的所有事情都非常有帮助。