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:8050
或 http://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 回显请求。
我正在尝试使用 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:8050
或 http://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 回显请求。