docker stack在容器

时间:2017-10-24 14:37:58

标签: docker docker-swarm docker-stack

我试图使用docker设置一个群,但我在容器之间进行通信时遇到问题。 我有5个节点的集群。 1名经理和4名工人。

3个应用程序:redis,splash,myapp

myapp必须是4名工作人员

redis,只关注经理

myapp必须能够与redis和splash进行通信

我尝试使用容器名称,但它不起作用。它将容器名称解析为不同的IP。

ping splash # return a different ip than the container actually has

我正在部署使用docker stack

运行swarm

docker stack deploy -c docker-stack.yml myapp

在它们之间链接容器也不起作用。 有任何想法吗 ?我错过了什么吗?

root@swarm-manager:~# docker version
Client:
 Version:      17.09.0-ce
 API version:  1.32
 Go version:   go1.8.3
 Git commit:   afdb6d4
 Built:        Tue Sep 26 22:42:18 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.09.0-ce
 API version:  1.32 (minimum version 1.12)
 Go version:   go1.8.3
 Git commit:   afdb6d4
 Built:        Tue Sep 26 22:40:56 2017
 OS/Arch:      linux/amd64
 Experimental: false

docker-stack.yml包含:

version: "3"
services:
    splash:
        container_name: splash
        image: scrapinghub/splash
        ports:
            - 8050:8050
            - 5023:5023
        deploy:
            mode: global
            placement:
                constraints:
                    - node.role == manager

    redis:
        container_name: redis
        image: redis
        ports:
            - 6379:6379
        deploy:
            mode: global
            placement:
                constraints:
                    - node.role == manager

    myapp:
        container_name: myapp
        image: myapp_image:latest
        environment:
            REDIS_ENDPOINT: redis:6379
            SPLASH_ENDPOINT: splash:8050
        deploy:
            mode: global
            placement:
                constraints:
                    - node.role == worker
        entrypoint:
            - ping google.com

----编辑----

我也尝试过curl。没有工作。 docker stack deploy -c docker-stack.yml myapp

Creating network myapp_default
Creating service myapp_splash
Creating service myapp_redis
Creating service myapp_myapp

curl http://myapp_splash:8050

curl: (7) Failed to connect to myapp_splash port 8050: No route to host

curl http://splash:8050

curl: (7) Failed to connect to splash port 8050: No route to host

获取splash的实际容器名称是有效的,这是一些随机生成的字符串。

curl http://myapp_splash.d7bn0dpei9ijpba4q41vpl4zz.tuk1cimht99at9g0au8vj9lkz:8050

但这对我没有帮助。

3 个答案:

答案 0 :(得分:2)

Ping不是尝试连接服务的正确工具。出于某种原因,它不适用于docker网络。请尝试卷曲http://serviceName

除此之外:使用堆栈部署时无法命名容器,而是使用您的服务名称(巧合地相同)来访问其他服务。

答案 1 :(得分:1)

我设法使用curl http://tasks.splash:8050http://tasks.myapp_splash:8050

使其正常运行

我不知道什么导致了这个问题。随意回答评论。

答案 2 :(得分:0)

似乎堆栈中的容器名为tasks.<service name>,所以命令ping tasks.myservice对我有用!

反复指出,<stackname>_<service name>之类的名称也可以解析并可以ping',但IP地址不正确。这真令人沮丧。

(例如,如果您进行docker stack deploy -c my.yml AA,将得到AA_myservice之类的名称,它将解析为错误的地址)

要添加到以上答案中。从网络角度来看,curl和ping会执行相同的操作。两者都将尝试解析传递给他们的名称,然后curl将尝试使用指定的协议(上面的示例为http)进行连接,并且ping将发送ICMP回显请求。