Docker网络最佳实践

时间:2018-09-13 18:00:01

标签: docker rabbitmq microservices

我有大约4个微服务,一个Keycloak和一个我想通过Docker部署的RabbitMQ服务器。每个微服务都必须能够与Keycloak对话,而某些微服务必须与RabbitMQ对话。

为了保持整洁,我想为Keycloak创建一个docker-compose文件,为RabbitMQ创建一个,每个微服务创建一个。这是正确的方法吗? (每个微服务都有自己的数据库。)

Image Microservices Relations etc.

MS A,B,C,D必须能够呼叫Keycloak; MS C,D必须能够与RabbitMQ通话。

将所有微服务与Keycloak / RabbitMQ服务器连接的最佳方法是什么?一些微服务也需要能够彼此通信。

2 个答案:

答案 0 :(得分:3)

是的,可以通过为每个服务创建一个组合文件来按照您所说的进行操作,但是如果要保持文件的清洁,可以将它们放在一个文件中,如下所示:

version: '2'
services:  
  rabbitmq:
    image: rabbitmqImg
    networks:
      - rabbitmq
  keycloak:
    image: keycloakImg
    networks:
      - keycloak
  MS-A:
    image: MSImg
    networks:
      - keycloak
  MS-B:
    image: MSImg
    networks:
      - keycloak
  MS-C:
    image: MSImg
    networks:
      - keycloak
      - rabbitmq
  MS-D:
    image: MSImg
    networks:
      - keycloak
      - rabbitmq
networks:
  rabbitmq:
    external:
      name: rabbitmq
  keycloak:
    external:
      name: keycloak

使用此Yaml微服务可以通过keycloak网络相互通信,所有微服务都可以使用keycloak网络与keycloak服务器通信,并且MS-C,MS-D可以通过Rabbitmq网络与Rabbitmq通信。 但是,如果有或将有其他不需要与Rabbitmq或Keycloak对话的微服务,则应创建另一个网络,然后将微服务放入其中,然后根据需要将其放入其他网络中。

正如Anunay所说的,您可以使用群体模式或kubernetes,但如果您是初学者,请坚持使用docker-compose,之后再进行扩展和编排,则可以使用这些框架。

编辑: 对于数据库,有多种方法取决于您拥有的数据库体系结构。例如,如果每个MS都有一个数据库容器,则应该为每个MS创建一个网络,如下所示:

version: '2'
services:
# General Services      
  rabbitmq:
    image: rabbitmqImg
    networks:
      - rabbitmq
  keycloak:
    image: keycloakImg
    networks:
      - keycloak
  # Micro Services      
  MS-A:
    image: MSImg
    networks:
      - ms-a-net
      - keycloak
  MS-B:
    image: MSImg
    networks:
      - ms-b-net
      - keycloak
  MS-C:
    image: MSImg
    networks:
      - ms-c-net
      - keycloak
      - rabbitmq
  MS-D:
    image: MSImg
    networks:
      - ms-d-net
      - keycloak
      - rabbitmq

  # Database Services      

  DB-A:
    image: DBImg
    networks:
      - ms-a-net
  DB-B:
    image: DBImg
    networks:
      - ms-b-net
  DB-C:
    image: DBImg
    networks:
      - ms-c-net
  DB-D:
    image: DBImg
    networks:
      - ms-d-net

networks:
  rabbitmq:
    external:
      name: rabbitmq
  keycloak:
    external:
      name: keycloak

  # Services Network

  ms-a-net:
    external:
      name: ms-a-net
  ms-b-net:
    external:
      name: ms-b-net          
  ms-c-net:
    external:
      name: ms-c-net
  ms-d-net:
    external:
      name: ms-d-net                    

答案 1 :(得分:2)

您可以通过docker进行操作,但是您需要考虑以下事项,

  • 为什么要部署

如果答案是开发人员或测试人员,则可以使用docker compose。它可以帮助您从一个位置启动所有容器,并且可以将它们配置在一个文件中。 您可以通过docker compose将keycloak,rmq数据库和服务都设置在同一主机上,并且它们可以彼此通信

如果您想使用prod或env这样的产品,那么我们可以研究docker swarms。这是docker compose的增量更新,可让您在多个主机上部署容器。

如果只有四个服务,则可以使用它,但是如果有更多服务,或者您需要更好地控制服务的部署方式,运行并需要更多指标和接触点,请使用kubernetes。

如果您想将数据库保存在容器中,则我不确定。容器易变,但总的来说它们可以为您提供高可用性,但对于数据库和rmq,我个人不会将其保留在用于生产产品的容器中,但是您可以环顾四周,并根据需要决定。

Docker集群和kubernetes也可以用于开发和测试环境。它们始终可以在单个主机上运行。