Docker集群和容器之间的通信

时间:2019-02-02 11:59:39

标签: docker dockerfile docker-swarm spring-cloud-sleuth zipkin

我遇到了一个很大的问题,困扰了3天。

我在远程服务器上使用docker swarm。 在同一网络NetA和堆栈StackA中有20个微服务。

现在,我想将Zipkin和Sleuth添加到我的微服务中以跟踪所有请求。

所有微服务均由docker-compose文件制成,如下所示:

version: '3'

services:
  myservice1:
    image: myImage1
    depends_on:
      - myService2
      - myService3
    ports:
      - "8081:80"
    environment:
      - TZ=Europe/Warsaw


  myservice3:
    image: myImage2
    environment:
      - profile=${MY_PROFILE}
      - TZ=Europe/Warsaw

...

现在的问题是-如何添加Zipkin服务器?

我已经从Docker Hub Image中添加了Zipkin服务器。

现在我的ZIpkin服务是: -在单独的网络ZIPN中 -在单独的堆栈ZIPST中

我应该如何通过所有微服务发送数据到Zipkin? 我应该在属性文件中发送什么URL: spring.zipkin.base-url = http://zipkinserver_network_zipkin_server:9411/

也许是: -容器名称(如my_zipkin_server)-但是我使用了swarm,因此容器名称会动态更改? -网络名称?

我在Zipkin容​​器中添加了一个额外的网络NetA,但它没有解决我的问题-Zipkin UI中没有任何痕迹。

请帮助我,我花了4天的时间解决此问题,但没有成功。

Zipkin服务器应放在单独的堆栈中,因为它将由不同的应用程序使用。

Zipkin工作时只有一种情况:当我设置Zipkin容​​器名称时:

spring.zipkin.base-url=http://zipkinserver_container_name:9411/

2 个答案:

答案 0 :(得分:1)

首先指定您自己的覆盖网络(请参见下面的代码底部)并将其用于您的服务。

version: '3'

services:
  myservice1:
    image: myImage1
    depends_on:
      - myService2
      - myService3
    ports:
      - "8081:80"
    environment:
      - TZ=Europe/Warsaw
    networks:
      - backbone

  myservice3:
    image: myImage2
    environment:
      - profile=${MY_PROFILE}
      - TZ=Europe/Warsaw
    networks:
      - backbone

networks:
  backbone:
   driver: overlay

然后在用于其他服务(例如ZIpkin)的撰写文件中,将backbone网络添加到其列表中。例如:

version: '3'

services:
  ZIpkin:
    image: myZImage
    networks:
      - ZIPN
      - backbone

networks:
  backbone:
   external:
     name:  PROJ_backbone

请注意,在第一个撰写文件之外,您需要为网络的 project 名称添加前缀。除非你设置环境变量COMPOSE_PROJECT_NAME这将是撰写文件所在的目录名。做一个docker network ls找出网络使用的全名。

答案 1 :(得分:0)

好的,所以我仅使用docker-compose文件解决了我的问题。 通过Portainer,我将我的第二个docker-compose文件粘贴到了Stack部分(创建了新Stack):

version: '3'
services:

  my_name_zipkin: --> THIS NAME SHOULD WE USE WHEN WE'D LIKE TO COMMUNICATE WITH CONTAINER
    image: openzipkin/zipkin
    ports:
      - "9411:9411"
    networks:
      - zipkin
      - my_old_network_with_services
networks:
  zipkin:
  my_old_network_with_services:
    external: true

现在,我们应该使用“ my_name_zipkin”名称与此服务进行通信。服务名称是我们用于在容器之间进行通信的名称。

因此在属性文件中设置:

spring.zipkin.base-url=http://zipkin:9411/