如何访问另一个堆栈中的服务?

如何访问另一个堆栈中的服务?

我有一个 docker swarm 配置,在其中部署了两个堆栈(mainmon),我可以在一个堆栈中公开一个端口,并且可以从另一个堆栈引用它。但是,我试图找到一种不这样做的方法,而是让它使用 127.0.0.11 DNS 访问它。

mon有一个名为grafana

使用https://docs.docker.com/docker-cloud/apps/service-links/#discovering-services-or-containers-on-another-stack这表明我可以使用堆栈名称来引用它,但当我尝试它时它不起作用,ping grafana.mon只是返回无效的主机名。

答案1

要做到这一点,你只需要让它使用同一个网络,然后它们就会可见。在我的例子中,我定义了一个名为 的网络public,它被我的所有堆栈在外部引用

docker network create -d overlay --attachable public

从那里在我的docker-compose.yml文件中我有

networks:
  public:
    external:
      name: public

要访问它,只需使用服务名称。

答案2

您需要允许两个堆栈通过覆盖网络类型进行连接,然后允许两个堆栈使用(至少在所需的服务上)在两个堆栈外部创建的覆盖网络。

覆盖网络应该在堆栈启动之前创建,以便需要连接的服务可以“附加”到它。

像这样创建网络

docker network create --driver overlay --attachable 

然后在你的环境文件中引用服务名称,你可以检查你的服务调用了什么名称

docker service ls

ID              NAME                     MODE          REPLICAS      IMAGE                  PORTS
vkz5vccbmce7    foo-stack_por-service    replicated    1/1           por-service:1.0.0      *:33065->3306/tcp
sjpnrkm1iiha    foo-stack_vic-service    replicated    1/1           vic-service:1.0.0      *:8081->80/tcp
0capavl31oab    bar-stack_tar-service    replicated    1/1           tar-service:1.0.0      *:33066->3306/tcp
9vohh24jt6hy    bar-stack_zen-service    replicated    1/1           zen-service:1.0.0      *:8082->80/tcp

现在从 NAME 列获取服务名称。例如:bar-stack_tar-服务

请注意,您的服务以部署时提供的堆栈名称为前缀

docker stack ls

NAME                SERVICES            ORCHESTRATOR
foo-stack           2                   Swarm
bar-stack           2                   Swarm

相关内容