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守护进程可以侦听三种不同类型的套接字:unix、tcp 和 fd。
默认情况下,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 守护程序。
参考文献:
配置方法因您所在的主机 OS 而异 运行 Docker.
请参阅 Docker 守护程序配置说明 (向下滚动以找到您的主机 OS):
Docker Configuration Documentation
我是 运行 Red Hat Enterprise Linux 7.2 :因此我按照 OS 的配置说明从 link 并执行以下操作:
mkdir /etc/systemd/system/docker.service.d
- 创建 docker.conf 文件
vi /etc/systemd/system/docker.service.d/docker.conf
将以下内容添加到 docker.conf 文件然后保存。
[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon -D -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
刷新更改
systemctl daemon-reload
重启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 地址。
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守护进程可以侦听三种不同类型的套接字:unix、tcp 和 fd。
默认情况下,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 守护程序。
参考文献:
配置方法因您所在的主机 OS 而异 运行 Docker.
请参阅 Docker 守护程序配置说明 (向下滚动以找到您的主机 OS):
Docker Configuration Documentation
我是 运行 Red Hat Enterprise Linux 7.2 :因此我按照 OS 的配置说明从 link 并执行以下操作:
mkdir /etc/systemd/system/docker.service.d
- 创建 docker.conf 文件
vi /etc/systemd/system/docker.service.d/docker.conf
将以下内容添加到 docker.conf 文件然后保存。
[Service] ExecStart= ExecStart=/usr/bin/docker daemon -D -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
刷新更改
systemctl daemon-reload
重启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 地址。