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 节点的地址。

我的计算机是否缺少某些设置?还是我的任何文件丢失了什么?

所有这些代码也位于 https://github.com/MentalMasochist/dask-swarm

根据 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 都没有问题。问题是路由器固件坏了。在我回到以前版本的路由器固件后,集群工作正常。