【问题标题】:Share containers between different docker-compose在不同的 docker-compose 之间共享容器
【发布时间】:2019-09-04 09:45:15
【问题描述】:

我正在实现一个由多个服务组成的应用程序,其中服务是“独立”的 ASP.NET Core 项目。这意味着每个服务都有自己的 Github 存储库,并且是独立开发和测试的。

应用程序运行在使用 K8s 编排服务的集群上。

服务依赖于常见的容器/服务,例如 RabbitMQ 和 SQL Server。在所有服务都使用 K8s 编排的生产环境中,一切都很好;然而,挑战在于建立开发环境。

我想开发/测试一项服务,而不必启动整个应用程序。比如开发依赖RabbitMQSQL ServerServiceA,并监听ServiceB事件,我只想启动ServiceARabbitMQSQL ServerServiceB。这是我的工作:

  • 克隆ServiceB repo,并使用它的docker-compose来启动服务。此时,docker compose 启动RabbitMQSQL ServerServiceB 容器,ServiceB 能够发布事件并将种子数据持久化到数据库中。
  • 克隆ServiceA repo,并使用它的docker-compose来启动服务。理想情况下,我希望 docker-compose 重用RabbitMQSQL Server,并启动ServiceA 容器,因此ServiceA 可以监听使用ServiceB 发布的事件。

当为ServieA 运行 docker-compose 时,它​​通过一个错误来抱怨端口(用于RabbitMQSQL Server)已经分配。

因此,我想我错过了可以设置不同服务的 docker-compose 以重用彼此资源或类似的步骤。对于这种情况,推荐的设置是什么?


更新 1

一些目标是:

  • 在开发人员机器和 CI 环境上启用运行/开发集成测试,而无需复制生产环境;
  • 使开发人员能够为他们正在开发的服务启动一个相互关联的服务环境。

需要考虑的一点是,在某些情况下(包括我的情况),期望开发人员复制生产设置以用于开发目的可能不是不切实际的;因为您可能在生产环境中使用了一些开发人员无法使用的服务。例如,我们在生产环境中使用付费数据库服务,但想在开发环境中使用本地/免费数据库服务。


更新 2

为了加快开发速度,我们正在考虑一种集成测试设置,开发人员可以在其中测试相互关联的服务子集之间的集成,因为为不同的集成测试运行整个应用程序需要大量时间(约 1 小时) ,我们认为这是快速发展的负担。

【问题讨论】:

    标签: c# docker asp.net-core docker-compose


    【解决方案1】:

    您需要做的最重要的一件事情是使这些资源的位置可配置。您可能已经有了,因为在本地、Docker Compose 和 Kubernetes 环境中,RabbitMQ 服务器的 DNS 名称等内容会有所不同。

    在您描述的架构中,您实际上也不需要运行“两个”服务来进行测试。您可以编写一个将消息注入队列的 RabbitMQ 设置,然后在完成后测试预期消息是否在输出队列中。 (或者模拟你用来做同样事情的 RabbitMQ API。)

    因此,对于本地开发,您只需一个 Docker Compose YAML 文件即可启动 RabbitMQ 和 per-service SQL Server,然后在指向 localhost 和标准端口号的 Docker 之外运行您的应用程序和测试那些服务。

    如果您尝试在单个系统上进行集成测试,我会考虑其中一种单主机 Kubernetes 解决方案(minikube、kind、...),而不是尝试在 Kubernetes 和Docker 撰写。

    如果确实需要两个服务都在本地运行,可以为每个服务的本地存储分配不同的主机端口,然后适当配置环境变量。我会写出docker run 命令,但这也可以翻译成 Docker Compose 语法:

    docker run --name rabbitmq -p 5672:5672 rabbitmq:3
    docker run --name a-sqlserver -e ... -p 11433:1433 microsoft-mssql-server
    docker run --name b-sqlserver -e ... -p 21433:1433 microsoft-mssql-server
    
    cd service-b
    env \
      RABBITMQ_HOST=localhost RABBITMQ_PORT=5672 \
      SQLSERVER_HOST=localhost SQLSERVER_PORT=21433 \
      ./service_b --port 28000
    
    cd service-a
    env \
      RABBITMQ_HOST=localhost RABBITMQ_PORT=5672 \
      SQLSERVER_HOST=localhost SQLSERVER_PORT=11433 \
      SERVICE_B_URL=http://localhost:28000 \
      ./service_a --port 18000
    

    如果你想在 Docker Compose 下运行这个堆栈,那么你需要在单个 Docker Compose 文件中启动共享服务 (RabbitMQ),然后在每个服务的 Docker Compose 文件中,参考其他文件的网络作为外部网络。我建议只重用您的 Kubernetes 部署系统,而不是尝试单独构建它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 2018-02-05
      • 2018-10-28
      • 1970-01-01
      相关资源
      最近更新 更多