Docker swarm 节点无法检测到来自 swarm 中另一台主机的服务
Docker swarm node unable to detect service from another host in swarm
我的目标是在一组 3 linux (ubuntu) 个物理工作站和 运行 一个 dask 集群上设置一个 docker swarm
$ docker --version
Docker version 17.06.0-ce, build 02c1d87
我能够初始化 docker 群并将所有机器添加到群中。
cordoba$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
j8k3hm87w1vxizfv7f1bu3nfg box1 Ready Active
twg112y4m5tkeyi5s5vtlgrap box2 Ready Active
upkr459m75au0vnq64v5k5euh * box3 Ready Active Leader
我然后 运行 docker stack deploy -c docker-compose.yml dask-cluster
在 Leader 框上。
这里是docker-compose.yml
:
version: "3"
services:
dscheduler:
image: richardbrks/dask-cluster
ports:
- "8786:8786"
- "9786:9786"
- "8787:8787"
command: dask-scheduler
networks:
- distributed
deploy:
replicas: 1
restart_policy:
condition: on-failure
placement:
constraints: [node.role == manager]
dworker:
image: richardbrks/dask-cluster
command: dask-worker dscheduler:8786
environment:
- "affinity:container!=dworker*"
networks:
- distributed
depends_on:
- dscheduler
deploy:
replicas: 3
restart_policy:
condition: on-failure
networks:
distributed:
这里是 richardbrks/dask-cluster
:
# Official python base image
FROM python:2.7
# update apt-repository
RUN apt-get update
# only install enough library to run dask on a cluster (with monitoring)
RUN pip install --no-cache-dir \
psutil \
dask[complete]==0.15.2 \
bokeh
当我部署 swarm 时,dworker
节点与 dscheduler
不在同一台机器上
不知道 dscheduler
是什么。我 ssh 进入其中一个节点并查看了环境,
dscheduler
不在那里。我还尝试 ping dscheduler
,得到 "ping: unknown host".
我认为docker应该提供一个基于服务发现的内部dns
这样调用 dscheduler
将带我到 dschedler
节点的地址。
我的计算机是否缺少某些设置?还是我的任何文件丢失了什么?
根据 this issue 在 swarm 中:
Because of some networking limitations (I think related to virtual
IPs), the ping tool will not work with overlay networking. Are you
service names resolvable with other tools like dig?
就我个人而言,我总是可以使用 curl 从一项服务连接到另一项服务。您的设置似乎正确,您的服务应该能够通信。
FYI 依赖在 swarm 中不受支持
更新 2:我认为您没有使用该端口。服务名称不能替代端口。您需要使用容器内部知道的端口。
dask 或 docker swarm 都没有问题。问题是路由器固件坏了。在我回到以前版本的路由器固件后,集群工作正常。
我的目标是在一组 3 linux (ubuntu) 个物理工作站和 运行 一个 dask 集群上设置一个 docker swarm
$ docker --version
Docker version 17.06.0-ce, build 02c1d87
我能够初始化 docker 群并将所有机器添加到群中。
cordoba$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
j8k3hm87w1vxizfv7f1bu3nfg box1 Ready Active
twg112y4m5tkeyi5s5vtlgrap box2 Ready Active
upkr459m75au0vnq64v5k5euh * box3 Ready Active Leader
我然后 运行 docker stack deploy -c docker-compose.yml dask-cluster
在 Leader 框上。
这里是docker-compose.yml
:
version: "3"
services:
dscheduler:
image: richardbrks/dask-cluster
ports:
- "8786:8786"
- "9786:9786"
- "8787:8787"
command: dask-scheduler
networks:
- distributed
deploy:
replicas: 1
restart_policy:
condition: on-failure
placement:
constraints: [node.role == manager]
dworker:
image: richardbrks/dask-cluster
command: dask-worker dscheduler:8786
environment:
- "affinity:container!=dworker*"
networks:
- distributed
depends_on:
- dscheduler
deploy:
replicas: 3
restart_policy:
condition: on-failure
networks:
distributed:
这里是 richardbrks/dask-cluster
:
# Official python base image
FROM python:2.7
# update apt-repository
RUN apt-get update
# only install enough library to run dask on a cluster (with monitoring)
RUN pip install --no-cache-dir \
psutil \
dask[complete]==0.15.2 \
bokeh
当我部署 swarm 时,dworker
节点与 dscheduler
不在同一台机器上
不知道 dscheduler
是什么。我 ssh 进入其中一个节点并查看了环境,
dscheduler
不在那里。我还尝试 ping dscheduler
,得到 "ping: unknown host".
我认为docker应该提供一个基于服务发现的内部dns
这样调用 dscheduler
将带我到 dschedler
节点的地址。
我的计算机是否缺少某些设置?还是我的任何文件丢失了什么?
根据 this issue 在 swarm 中:
Because of some networking limitations (I think related to virtual IPs), the ping tool will not work with overlay networking. Are you service names resolvable with other tools like dig?
就我个人而言,我总是可以使用 curl 从一项服务连接到另一项服务。您的设置似乎正确,您的服务应该能够通信。
FYI 依赖在 swarm 中不受支持
更新 2:我认为您没有使用该端口。服务名称不能替代端口。您需要使用容器内部知道的端口。
dask 或 docker swarm 都没有问题。问题是路由器固件坏了。在我回到以前版本的路由器固件后,集群工作正常。