确定为什么 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 请求并将它们转发给 rpcproxy 翻译 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.11rpc 的结果,但我不确定 :53 的来源。

docker service ls test_rpc0/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,因为网络上没有这样的服务 运行 并且gatewayrpc 的 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。这表明它应该在连接到容器的所有接口上本地侦听传入请求。