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

6
docker version 1.9.1
swarm version 1.0.1

当将3个VM(桥接网络)连接到Swarm时,“docker info”会显示所有节点。

状态待定。

其中1个主机是管理器,所有输出都来自于此主机。我不知道该去哪里查找。

运行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

心跳排序 - 在后台运行,检查端口、名称解析和是否可从管理器ping通。

5个回答

8
Docker守护进程可以监听三种不同类型的Socket:unixtcpfd
默认情况下,Docker守护进程只监听unix socket。
如果您需要远程访问Docker守护进程,则需要启用tcp socket。
在创建Docker Swarm集群时,Swarm管理器需要远程访问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 文档:docker daemon
  2. Docker 文档:创建用于开发的 swarm

3

配置方法因运行Docker的主机操作系统而异。

请参阅Docker守护程序配置说明(向下滚动以查找您的主机操作系统)
Docker配置文档

我正在运行Red Hat Enterprise Linux 7.2:因此,我按照上述链接中我的操作系统的配置说明进行了以下操作:

  1. mkdir /etc/systemd/system/docker.service.d
  2. Create a docker.conf file
    vi /etc/systemd/system/docker.service.d/docker.conf
  3. Add the following to the docker.conf file then save.

    [Service]
    ExecStart=
    ExecStart=/usr/bin/docker daemon -D -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
    
  4. Flush Changes

    systemctl daemon-reload
    
  5. Restart 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 Socket
  • -H tcp://0.0.0.0:2375:在所有网络接口上创建一个监听端口为 2375 的 tcp Docker Socket

更改后,我重新启动了我的 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 错误。


3
我已经在/etc/default/docker中添加了DOCKER_OPTS值。
DOCKER_OPTS="-H <>主机IP<>:2375 -H unix:///var/run/docker.sock"
更精确地说,<< 主机IP >> 是您正在编辑/etc/default/docker文件的同一主机IP。
也许这会帮助某些人。

1
根据您的环境,保护守护进程套接字是明智的选择。https://docs.docker.com/engine/security/https/ - KumZ

2

通过在Swarm工作节点服务配置文件/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

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

1
我尝试了这个线程中提到的解决方案。编辑/etc/default/docker对我无效。
最终的解决方案是以下内容。
编辑/lib/systemd/system/docker.service文件 找到以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

如果一切正常,下面的命令应该返回一个JSON。
要进行远程测试,请使用Docker主机的计算机名称或IP地址。

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