Docker网络最佳实践

问题描述 投票:7回答:2

我有~4个微服务,一个Keycloak和一个RabbitMQ服务器,我想通过Docker部署。每个微服务都必须能够与Keycloak对话,有些人需要与RabbitMQ对话。

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

MS A,B,C,D需要能够调用Keycloak; MS C,D需要能够与RabbitMQ交谈。

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

docker rabbitmq microservices
2个回答
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所说,你可以使用swarm模式或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                    

2
投票

你可以通过docker来做到这一点,但是你需要考虑以下事项,

  • 为什么要部署

如果答案是开发或测试然后是,你可以使用docker compose。它可以帮助您从一个地方启动所有容器,并且可以将它们配置在一个文件中。您可以通过docker compose将keycloak,rmq数据库和服务全部设置到同一主机上,并且它们可以相互通信

如果你想像env那样为prod或prod做这件事,那么我们你可以看看docker swarms。它是docker compose的增量更新,允许您在多个主机上部署容器。

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

如果您想将数据库保存在容器中,我并不确定。容器很容易挥发,但总的来说它们为您提供高可用性,但对于数据库和rmq我个人不会将它们保存在容器中以便生产,但随后您可以阅读并根据您的需要来决定。

Docker群和kubernetes也可用于开发和测试env。它们总是可以在单个主机上运行。

© www.soinside.com 2019 - 2024. All rights reserved.