Tag: 架构

如何在基于Docker的微服务中pipe理每个环境的数据?

在微服务体系结构中,我很难掌握如何pipe理环境特定的configuration(例如数据库或消息代理的IP地址和凭证)。 假设您有三个微服务(“A”,“B”和“C”),每个微服务由不同的团队拥有和维护。 每个团队都需要一个团队集成环境…他们在哪里使用他们的微服务的最新快照,以及所有依赖微服务的稳定版本。 当然,你也需要QA /分期/生产环境。 大图的简化视图如下所示: “微服务A”团队环境 微服务A( SNAPSHOT ) 微服务B(STABLE) 微服务C(STABLE) “微服务B”团队环境 微服务A(STABLE) 微服务B( SNAPSHOT ) 微服务C(STABLE) “微服务C”团队环境 微服务A(STABLE) 微服务B(STABLE) 微服务C( SNAPSHOT ) 质量保证/分期/生产 微服务A(稳定,发布等) 微服务B(稳定,发布等) 微服务C(STABLE,RELEASE等) 这是很多的部署,但是这个问题可以通过持续集成服务器来解决,也许可以像Chef / Puppet /等等。 真正困难的部分是每个微服务都需要一些特定的环境数据给每个被部署的地方。 例如,在“A”团队环境中,“A”需要一个地址和一组证书来与“B”交互。 但是,在“B”团队环境中,“A”的部署需要不同的地址和凭证来与“B”的部署进行交互。 而且,当你接近生产时,像这样的环境configuration信息可能需要安全限制(即只有某些人可以修改甚至查看它)。 那么,在微服务体系结构中,如何维护特定于环境的configuration信息并将其提供给应用程序呢? 一些方法浮现在脑海中,尽pipe它们都有问题: 让构build服务器在构build时把它们烧到应用程序中 – 我想你可以创build一个每个环境属性文件或脚本的回购,并且为每个微服务的构build过程伸出并拉入适当的脚本(你也可以有一个单独的,限制访问回购生产的东西)。 不过,你需要大量的脚本。 对于微服务可以部署的每个地方的每一个微服务,基本上都是单独的。 将它们烘焙到每个环境的基础Docker镜像中 – 如果构build服务器将微服务应用程序放入Docker容器中作为构build过程的最后一步,则可以为每个环境创build自定义基础镜像。 基本映像将包含一个shell脚本,用于设置所有您需要的环境variables。 您的Dockerfile将被设置为在启动您的应用程序之前调用此脚本。 这与之前的要点也有类似的挑战,因为现在你正在pipe理大量的Docker镜像。 在运行时从某种registry中提取环境信息 – 最后,可以将你的每个环境configuration存储在Apache ZooKeeper(甚至只是一个普通的数据库)中,然后让你的应用程序代码在运行时将其拉入它启动。 每个微服务应用程序都需要知道它在哪个环境(例如启动参数),以便知道从registry中获取哪一组variables。 这种方法的优点是,现在您可以使用完全相同的构build工件(即应用程序或Docker容器)从团队环境一直到生产。 […]

Docker多应用程序服务器关于数据库的体系结构

我有一个运行5或6个小Rails应用程序的服务器。 他们所有的附加文件都在S3上,他们都使用MySQL作为数据库。 每个应用程序都有自己的用户,并运行一些thins。 有一个nginx服务器负责平衡和域路由。 我打算用一个Docker安装来replace这个服务器:一个服务器每个应用都有一个容器,前面有一个nginx。 我的问题是:你会把数据库的一部分? 我主要看到4种可能性: 1)每个应用程序容器中的一个Mysql服务器。 我认为这不是Docker的哲学。 这将要求每个容器的数据单独备份。 2)适用于所有应用程序的独特的MySQL容器。 3)主机Docker服务器上的标准MySQL安装。 4)一个单独的MySQL服务器的所有应用程序。 你会怎么做 ? PS:我知道Docker还没有准备好,我打算现在用它来升级,如果我对它满意的话,也可以切换。

在一个容器内(泊坞窗)宣布你的应用程序

我在周末在docker的IRC上问了这个问题,但是在我想通过这个答案之前,我不得不走开: 如果我有许多应用程序在容器中运行(现在让我们假设它们都运行在相同的物理硬件上,但情况并非如此),我希望每个应用程序都能够find每个应用程序其他自动。 使用某种registry(例如etcd或DNS-SD / Bonjour),您可以宣布您的服务和任何相关的详细信息,并让其他应用程序了解它们并相应地路由stream量。 这里的问题是,当一个应用程序可以知道它在一个容器内服务的主机名/端口时,它不一定是它可以访问的端口或地址。 有两点需要join的信息: 服务可以访问的地方; 从容器外可以进入 什么服务(版本号,服务types); 从容器内部可以进入 你会如何推荐我通过集装箱壁垒获取这些信息? 我可以通过TCP将Docker暴露给容器,所以应用程序可以查询它显示的位置,但这似乎违反了关注的分离。 我可以在我的容器中打开一个文件/端口,主机系统在启动一个容器以准备发布之后查询,但这有点像我将重新创buildWSDL。 任何想法或指导我应该如何解决这个问题?