繁体   English   中英

在不同的docker-compose之间共享容器

[英]Share containers between different docker-compose

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

该应用程序在使用K8协调服务的群集上运行。

服务依赖于常见的容器/服务,例如RabbitMQ和SQL Server。 在使用K8协调所有服务的生产环境中,一切都很好。 但是,挑战在于建立开发环境。

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

  • 克隆ServiceB库,并使用docker-compose启动服务。 此时,泊坞窗将启动RabbitMQSQL Server ServiceB容器,并且ServiceB能够发布事件并将种子数据持久存储在数据库中。
  • 克隆ServiceA库,并使用docker-compose启动服务。 理想情况下,我希望docker-compose重用RabbitMQSQL Server ,并启动ServiceA容器,因此ServiceA可以侦听使用ServiceB发布的事件。

在为ServieA运行ServieA -compose时,它会通过一个错误消息指出端口(用于RabbitMQSQL Server )已被分配。

因此,我想我没有设置可将不同服务的docker-compose设置为可重用彼此资源的步骤。 在这种情况下,建议的设置是什么?


更新1

一些目标是:

  • 在开发人员机器和CI环境上启用运行/开发集成测试,而不必复制生产环境;
  • 使开发人员能够将相互关联的服务环境扩展到他们正在开发的服务。

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


更新2

为了加快开发速度,我们考虑使用集成测试设置,开发人员可以测试一组相互关联的服务之间的集成,因为针对不同的集成测试运行整个应用程序需要花费大量时间(〜1h),因此,将其视为快速发展的负担。

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

在您描述的体系结构中,您实际上并不需要运行两个服务来进行测试。 您可以编写RabbitMQ安装程序,将消息注入到队列中,然后在完成后测试预期消息是否在输出队列中。 (或模拟用于执行同一操作的RabbitMQ API。)

因此,对于本地开发,您可以只有一个Docker Compose YAML文件,该文件启动RabbitMQ和每个服务的SQL Server,然后在Docker外部运行应用程序并进行测试,并指向localhost和这些服务的标准端口号。

如果您要在单个系统上进行集成测试,我将研究一种单主机Kubernetes解决方案(minikube,kind ...),而不是尝试在Kubernetes和Docker Compose中维护重复的部署系统。

如果确实需要两个服务都在本地运行,则可以为每个服务的本地存储分配不同的主机端口,然后适当地配置环境变量。 我将写出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部署系统,而不要尝试单独构建它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM