我试图使用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
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
但这对我没有帮助。
答案 0 :(得分:2)
Ping不是尝试连接服务的正确工具。出于某种原因,它不适用于docker网络。请尝试卷曲http://serviceName。
除此之外:使用堆栈部署时无法命名容器,而是使用您的服务名称(巧合地相同)来访问其他服务。
答案 1 :(得分:1)
我设法使用curl http://tasks.splash:8050
或http://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回显请求。