确定为什么 docker 图像在 swarm 模式下无法 运行 但可以通过使用相同的 yml 文件进行组合
Determine why docker image fails to run in swarm mode but works via compose with the same yml file
我有以下 docker-compose.yml
:
version: '3.7'
services:
gateway:
image: rmilejcz/kalos-gateway:latest
deploy:
replicas: 1
ports:
- '443:443'
networks:
- rpcnet
rpc:
image: rmilejcz/kalos-rpc:latest
deploy:
replicas: 1
ports:
- '8418:8418'
networks:
- rpcnet
proxy:
image: rmilejcz/grpcwebproxy:latest
deploy:
replicas: 1
ports:
- '8080:8080'
networks:
- rpcnet
networks:
rpcnet:
它本质上是一个 rpc
服务器,带有两个独立的反向代理,gateway
翻译普通的 HTTP 请求并将它们转发给 rpc
,proxy
翻译 gRPC-web 请求并将它们转发给 rpc
.
当我通过 docker-compose up
运行 它按预期工作时,运行ning 很容易确认这一点:
curl localhost:443/v1/lookup/vendor
然而,当我尝试 运行 成群结队时:
docker swarm init
docker deploy --compose-file docker-compose.yml test
# OR
docker stack deploy --compose-file docker-compose.yml test
以前工作的curl
例子returns:
all SubConns are in TransientFailure, latest connection error: connection error: desc = \"transport: Error while dialing dial tcp: lookup rpc on 127.0.0.11:53: no such host\"
表示rpc
服务不可用。不确定 127.0.0.11:53
的来源,我猜 127.0.0.11
是 rpc
的结果,但我不确定 :53
的来源。
docker service ls test_rpc
在 0/1
处显示 REPLICAS
。我几乎可以肯定,无论出于何种原因,rpc
服务无法绑定到 rpc:8418
因为如果我将其更改为 localhost:8418
和 运行 docker service ls test_rpc
我可以看到 REPLICAS
位于 1/1
,但是由于上述相同的错误(所有子连接都处于暂时性故障)
,我仍然无法通过任一代理与该服务通信
我是否对 docker 群内的容器通信做了错误的假设?有没有什么方法可以让我从 rpc
服务中获取详细的错误信息,以确定它失败的确切原因?如果我 运行 docker-compose up
我可以在终端中看到服务标准输出,docker swarm 是否有类似的功能?
127.0.0.11:53
为DNS服务器地址。 rpc
服务不知何故崩溃/无法启动,因此 'gateway' 服务无法将请求转发到主机 rpc
,因为网络上没有这样的服务 运行 并且gateway
对 rpc
的 DNS 查找返回 "no such host".
docker service ls test_rpc
shows REPLICAS
at 0/1
. I'm almost certain that for whatever reason, the rpc service fails to bind to rpc:8418
because if I change that to localhost:8418
and run docker service ls test_rpc
I can see that REPLICAS
is at 1/1
这听起来像是在谈论绑定到端口的应用程序。它不应绑定到 rcp:8418
,因为在 Swarm 模式下,默认情况下,它将解析为路由到每个健康容器的 VIP。相反,将您的应用程序配置为绑定到 0.0.0.0:8418
。这表明它应该在连接到容器的所有接口上本地侦听传入请求。
我有以下 docker-compose.yml
:
version: '3.7'
services:
gateway:
image: rmilejcz/kalos-gateway:latest
deploy:
replicas: 1
ports:
- '443:443'
networks:
- rpcnet
rpc:
image: rmilejcz/kalos-rpc:latest
deploy:
replicas: 1
ports:
- '8418:8418'
networks:
- rpcnet
proxy:
image: rmilejcz/grpcwebproxy:latest
deploy:
replicas: 1
ports:
- '8080:8080'
networks:
- rpcnet
networks:
rpcnet:
它本质上是一个 rpc
服务器,带有两个独立的反向代理,gateway
翻译普通的 HTTP 请求并将它们转发给 rpc
,proxy
翻译 gRPC-web 请求并将它们转发给 rpc
.
当我通过 docker-compose up
运行 它按预期工作时,运行ning 很容易确认这一点:
curl localhost:443/v1/lookup/vendor
然而,当我尝试 运行 成群结队时:
docker swarm init
docker deploy --compose-file docker-compose.yml test
# OR
docker stack deploy --compose-file docker-compose.yml test
以前工作的curl
例子returns:
all SubConns are in TransientFailure, latest connection error: connection error: desc = \"transport: Error while dialing dial tcp: lookup rpc on 127.0.0.11:53: no such host\"
表示rpc
服务不可用。不确定 127.0.0.11:53
的来源,我猜 127.0.0.11
是 rpc
的结果,但我不确定 :53
的来源。
docker service ls test_rpc
在 0/1
处显示 REPLICAS
。我几乎可以肯定,无论出于何种原因,rpc
服务无法绑定到 rpc:8418
因为如果我将其更改为 localhost:8418
和 运行 docker service ls test_rpc
我可以看到 REPLICAS
位于 1/1
,但是由于上述相同的错误(所有子连接都处于暂时性故障)
我是否对 docker 群内的容器通信做了错误的假设?有没有什么方法可以让我从 rpc
服务中获取详细的错误信息,以确定它失败的确切原因?如果我 运行 docker-compose up
我可以在终端中看到服务标准输出,docker swarm 是否有类似的功能?
127.0.0.11:53
为DNS服务器地址。 rpc
服务不知何故崩溃/无法启动,因此 'gateway' 服务无法将请求转发到主机 rpc
,因为网络上没有这样的服务 运行 并且gateway
对 rpc
的 DNS 查找返回 "no such host".
docker service ls test_rpc
showsREPLICAS
at0/1
. I'm almost certain that for whatever reason, the rpc service fails to bind torpc:8418
because if I change that tolocalhost:8418
and rundocker service ls test_rpc
I can see thatREPLICAS
is at1/1
这听起来像是在谈论绑定到端口的应用程序。它不应绑定到 rcp:8418
,因为在 Swarm 模式下,默认情况下,它将解析为路由到每个健康容器的 VIP。相反,将您的应用程序配置为绑定到 0.0.0.0:8418
。这表明它应该在连接到容器的所有接口上本地侦听传入请求。