在群集上部署应用程序但无法成功访问它

时间:2017-07-04 09:54:30

标签: docker-swarm

我现在正在学习使用docker跟随get-started documents,但在第4部分 - Swarms我遇到了一些问题。那就是在群集上部署我的应用程序时,我无法成功访问它。

docker@myvm1:~$ docker stack ps getstartedlab
ID                  NAME                  IMAGE                     NODE                DESIRED STATE       CURRENT STATE              ERROR               PORTS
gsueb9ejeur5        getstartedlab_web.1   zhugw/get-started:first   myvm1               Running             Preparing 11 seconds ago
ku13wfrjp9wt        getstartedlab_web.2   zhugw/get-started:first   myvm2               Running             Preparing 11 seconds ago
vzof1ybvavj3        getstartedlab_web.3   zhugw/get-started:first   myvm1               Running             Preparing 11 seconds ago
lkr6rqtqbe6n        getstartedlab_web.4   zhugw/get-started:first   myvm2               Running             Preparing 11 seconds ago
cpg91o8lmslo        getstartedlab_web.5   zhugw/get-started:first   myvm2               Running             Preparing 11 seconds ago

docker@myvm1:~$ curl 'http://localhost'
curl: (7) Failed to connect to localhost port 80: Connection refused

➜  ~ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
myvm1   -        virtualbox   Running   tcp://192.168.99.101:2376           v17.06.0-ce
myvm2   -        virtualbox   Running   tcp://192.168.99.100:2376           v17.06.0-ce

➜  ~ curl 'http://192.168.99.101'
curl: (7) Failed to connect to 192.168.99.101 port 80: Connection refused

出了什么问题?

另外,很奇怪。在docker-compose.yml中添加以下内容后,我发现上述问题已自动解决

visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet

但这次新添加的visualizer不起作用

docker@myvm1:~$ docker stack ps getstartedlab
ID                  NAME                         IMAGE                             NODE                DESIRED STATE       CURRENT STATE             ERROR               PORTS
xomsv2l5nc8x        getstartedlab_web.1          zhugw/get-started:first           myvm1               Running             Running 7 minutes ago
ncp0rljod4rc        getstartedlab_visualizer.1   dockersamples/visualizer:stable   myvm1               Running             Preparing 7 minutes ago
hxddan48i1dt        getstartedlab_web.2          zhugw/get-started:first           myvm2               Running             Running 7 minutes ago
dzsianc8h7oz        getstartedlab_web.3          zhugw/get-started:first           myvm1               Running             Running 7 minutes ago
zpb6dc79anlz        getstartedlab_web.4          zhugw/get-started:first           myvm2               Running             Running 7 minutes ago
pg96ix9hbbfs        getstartedlab_web.5          zhugw/get-started:first           myvm2               Running             Running 7 minutes ago

从上面你知道它总是在准备。

我的整个docker-compose.yml

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: zhugw/get-started:first
    deploy:
      replicas: 5
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "80:80"
    networks:
      - webnet
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet
networks:
  webnet:

6 个答案:

答案 0 :(得分:3)

在学习的同时遇到这个问题。

这是因为您的非聚集映像仍在从步骤2运行,而刚刚部署的聚簇映像在docker-compose.yml文件中使用相同的端口映射(4000:80)。

您有两种选择:

  1. 进入docker-compose.yml并将端口映射更改为其他内容,例如4010:80,然后使用更新重新部署群集。然后尝试:http://localhost:4010

  2. 删除您在指南的第2步中创建的容器,该容器仍在运行并使用端口映射4000:80

答案 1 :(得分:0)

卷:        - " /var/run/docker.sock:/var/run/docker.sock"

应该是

卷:        - /var/run/docker.sock:/var/run/docker.sock

这是码头工人导师的错误

答案 2 :(得分:0)

在群集节点之间打开端口7946 TCP / UDP和端口4789 UDP。使用入口网络。如果有效,请告诉我,谢谢。

答案 3 :(得分:0)

让我可以运行可视化工具的原因是将可视化工具图片代码从stable更改为latest

答案 4 :(得分:0)

如果您在Mac上使用Docker工具箱,则应将this签出。

答案 5 :(得分:0)

我有同样的问题。正如在tutorial中所说的(请参阅“是否有连接问题?”),需要打开以下端口:

  • 用于容器网络发现的端口7946 TCP / UDP。
  • 用于容器入口网络的端口4789 UDP。

所以我在群集初始化之前(在创建myvm1和myvm2之后)执行了之前,然后可以访问该服务,例如在浏览器中使用IP_node:4000

$ docker-machine ssh myvm1 "sudo iptables -I INPUT -p tcp --dport 7946 --syn -j ACCEPT"
$ docker-machine ssh myvm2 "sudo iptables -I INPUT -p tcp --dport 7946 --syn -j ACCEPT"
$ docker-machine ssh myvm1 "sudo iptables -I INPUT -p udp --dport 7946 -j ACCEPT"
$ docker-machine ssh myvm2 "sudo iptables -I INPUT -p udp --dport 7946 -j ACCEPT"
$ docker-machine ssh myvm1 "sudo iptables -I INPUT -p udp --dport 4789 -j ACCEPT"
$ docker-machine ssh myvm2 "sudo iptables -I INPUT -p udp --dport 4789 -j ACCEPT"

希望对别人有帮助。