Docker-swarm >> 无法连接到 docker 引擎端点

Docker-swarm >> Cannot connect to the docker engine endpoint

docker version 1.9.1
swarm version 1.0.1

为什么要将 3 个虚拟机(桥接网络)连接到 swarm。 "docker info" 显示所有节点

Status pending.

3 台主机中的 1 台是 manager 所有输出都来自此主机。我不知道去哪里找。

在 运行 swarm --debug manage token://XXXXX

输出 >>

*INFO[0000] Listening for HTTP addr=127.0.0.1:2375 proto=tcp

DEBU[0000] Failed to validate pending node: Cannot connect to the docker engine endpoint  Addr=10.32.1.38:2375

DEBU[0000] Failed to validate pending node: Cannot connect to the docker engine endpoint  Addr=10.32.1.4:2375

DEBU[0000] Failed to validate pending node: Cannot connect to the docker engine endpoint  Addr=10.32.1.33:2375

然后

root@ubuntu:~# ps -ef | grep swarm

root 2158  1391  0 12:28 pts/2 00:00:00 swarm join token://xxxxxxx --addr 10.32.1.4:2375

root 2407  1213  0 13:57 pts/1 00:00:00 swarm manage token://xxxxxxx -H 0.0.0.0:4243

root 2413  1391  0 13:57 pts/2    00:00:00 grep --color=auto swarm

然后

root@ubuntu:~# swarm list token://xxxxxxxxxxx

10.32.1.4:2375
10.32.1.33:2375
10.32.1.38:2375

然后

root@ubuntu:~# ps -ef | grep docker

root      2330     1  0 12:52 ?        00:00:00 /usr/bin/docker daemon

root      2421  1391  0 14:10 pts/2    00:00:00 grep --color=auto docker

heartbeat 排序 - 在后台运行,检查端口,名称解析,可从管理器 ping。

我在 /etc/default/docker

中添加了 DOCKER_OPTS 个值

DOCKER_OPTS="-H <>主机IP<>:2375 -H unix:///var/run/docker.sock"

更准确地说,<<主机 IP >> 与您编辑 /etc/default/docker 文件的主机 IP 相同。

也许它会对某人有所帮助。

docker守护进程可以侦听三种不同类型的套接字:unixtcpfd

默认情况下,docker 守护进程 只监听 unix 套接字。

如果需要远程访问Docker守护进程,需要开启tcp socket。

创建docker swarm集群时,swarm manager需要远程​​访问swarm代理节点的docker守护进程。

因此,您需要重新配置docker守护进程

vim /etc/default/docker

添加以下行:

DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

重新启动 docker 守护进程

sudo restart docker

通过这样做,可以远程访问 docker 守护程序

参考文献:

  1. Docker document: docker daemon
  2. Docker document: create a swarm for development

配置方法因您所在的主机 OS 而异 运行 Docker.

请参阅 Docker 守护程序配置说明 (向下滚动以找到您的主机 OS)
Docker Configuration Documentation

我是 运行 Red Hat Enterprise Linux 7.2 :因此我按照 OS 的配置说明从 link 并执行以下操作:

  1. mkdir /etc/systemd/system/docker.service.d
  2. 创建 docker.conf 文件
    vi /etc/systemd/system/docker.service.d/docker.conf
  3. 将以下内容添加到 docker.conf 文件然后保存。

    [Service]
    ExecStart=
    ExecStart=/usr/bin/docker daemon -D -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
    
  4. 刷新更改

    systemctl daemon-reload
    
  5. 重启Docker

    systemctl restart docker
    

配置的关键行(以及我与文档略有不同的地方)是:

ExecStart=/usr/bin/docker daemon -D -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375

让我们逐条分析:

  • /usr/bin/docker 从 docker 二进制文件开始
  • daemon 启动 Docker 守护进程
  • -D 以调试模式启动(不需要)
  • -H unix:///var/run/docker.sock 创建默认 Docker 套接字
  • -H tcp://0.0.0.0:2375 创建一个 tcp Docker 套接字在所有网络接口上侦听端口 2375

进行这些更改后,我重新启动了我的 docker swarm 容器(在我的情况下还有我的 Consul 容器)和 运行 docker -H tcp://<IP_OF_SWARM_MASTER>:<PORT_YOU_TOLD_SWARM_MASTER_TO_LISTEN_ON> info 看看我是否不再得到Cannot connect to the docker engine endpoint 错误。

通过添加 swarm worker 服务配置 /usr/lib/systemd/system/docker.service 为我工作,其中 ExecStart 位于此行:

ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375

刷新更改并重新启动 Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker.service

但此方法不受保护,需要额外的安全配置。

我厌倦了这个线程中提到的解决方案。编辑 /etc/default/docker 对我不起作用。

最后是下面的解决方法。

编辑/lib/systemd/system/docker.服务文件 找到以 ExecStart 开头的行并添加 -H=tcp://0.0.0.0:2375 使其看起来像

ExecStart=/usr/bin/docker daemon -H=fd:// -H=tcp://0.0.0.0:2375

保存修改后的文件 重新加载 docker 守护程序

systemctl daemon-reload

重启容器

sudo service docker restart

使用以下命令测试它是否正常工作

curl http://localhost:2375/images/json

如果一切正常,下面的命令应该 return a JSON.

要进行远程测试,请使用 Docker 主机的 PC 名称或 IP 地址。