docker 堆栈在容器之间通信

docker stack communicate between containers

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

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

myapp 必须在 4 个 worker 上

redis, splash just on the manager

myapp 必须能够与 redis 和 splash 通信

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

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

我正在使用 docker stack

部署 运行 集群

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

但这并没有真正帮助我。

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

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

我设法使用 curl http://tasks.splash:8050http://tasks.myapp_splash:8050 使其正常工作。

不过我不知道是什么原因导致了这个问题。欢迎评论回答。

似乎堆栈中的容器名为 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 回显请求。