![](/img/trans.png)
[英]SSL Issue - Unable to connect to multiple containers using docker-compose
[英]Share containers between different docker-compose
我正在实现一个由多个服务组成的应用程序,其中服务是“独立的” ASP.NET Core项目。 这意味着每个服务都有其自己的Github存储库,并且是独立开发和测试的。
该应用程序在使用K8协调服务的群集上运行。
服务依赖于常见的容器/服务,例如RabbitMQ和SQL Server。 在使用K8协调所有服务的生产环境中,一切都很好。 但是,挑战在于建立开发环境。
我想开发/测试服务而不必启动整个应用程序。 例如,对于依赖于RabbitMQ
和SQL Server
的ServiceA
开发并侦听ServiceB
事件,我只想启动ServiceA
, RabbitMQ
, SQL Server
和ServiceB
。 这是我的工作:
ServiceB
库,并使用docker-compose启动服务。 此时,泊坞窗将启动RabbitMQ
和SQL Server
ServiceB
容器,并且ServiceB
能够发布事件并将种子数据持久存储在数据库中。 ServiceA
库,并使用docker-compose启动服务。 理想情况下,我希望docker-compose重用RabbitMQ
和SQL Server
,并启动ServiceA
容器,因此ServiceA
可以侦听使用ServiceB
发布的事件。 在为ServieA
运行ServieA
-compose时,它会通过一个错误消息指出端口(用于RabbitMQ
和SQL Server
)已被分配。
因此,我想我没有设置可将不同服务的docker-compose设置为可重用彼此资源的步骤。 在这种情况下,建议的设置是什么?
一些目标是:
不过,需要考虑的一点是,在某些情况下(包括我的情况),期望开发人员出于开发目的复制生产设置可能并不实用。 因为您可能在生产环境中使用了某些开发人员无法使用的服务。 例如,我们在生产环境中使用付费数据库服务,但希望在开发环境中使用本地/免费数据库服务。
为了加快开发速度,我们考虑使用集成测试设置,开发人员可以测试一组相互关联的服务之间的集成,因为针对不同的集成测试运行整个应用程序需要花费大量时间(〜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.