1

我正在尝试使用 docker 设置一个 swarm,但我在容器之间进行通信时遇到了问题。我有 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

我正在部署运行 swarm 使用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

- - 编辑 - -

我也试过卷曲。没用。 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

但这并没有真正帮助我。

4

3 回答 3

3

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

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

于 2017-10-24T15:10:29.730 回答
1

我设法让它工作使用curl http://tasks.splash:8050or http://tasks.myapp_splash:8050

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

于 2017-10-25T10:02:10.963 回答
0

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

值得一提的是,名称 like<stackname>_<service name>也可以解析和 ping 通,但 IP 地址不正确。这令人沮丧。

(例如,如果你这样做docker stack deploy -c my.yml AA,你会得到这样的名字AA_myservice,它将解析为不正确的地址)

添加到上面的答案。从网络的角度来看 curl 和 ping 做同样的事情。两者都将尝试解析传递给它们的名称,然后 curl 将尝试使用指定的协议进行连接(http 是上面的示例),ping 将发送 ICMP 回显请求。

于 2019-02-06T01:02:15.563 回答