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

我有一个运行5或6个小Rails应用程序的服务器。 他们所有的附加文件都在S3上,他们都使用MySQL作为数据库。 每个应用程序都有自己的用户,并运行一些thins。 有一个nginx服务器负责平衡和域路由。

我打算用一个Docker安装来replace这个服务器:一个服务器每个应用都有一个容器,前面有一个nginx。

我的问题是:你会把数据库的一部分?

我主要看到4种可能性:

1)每个应用程序容器中的一个Mysql服务器。 我认为这不是Docker的哲学。 这将要求每个容器的数据单独备份。

2)适用于所有应用程序的独特的MySQL容器。

3)主机Docker服务器上的标准MySQL安装。

4)一个单独的MySQL服务器的所有应用程序。

你会怎么做 ?

PS:我知道Docker还没有准备好,我打算现在用它来升级,如果我对它满意的话,也可以切换。

这取决于几个因素。 这里有一些问题可以帮助你决定。

  • 这5-6个应用程序是非常相似的吗(例如,用Docker的话来说,你可以将它们build立在一个共同的图像上),并且你在考虑部署更多的应用程序,还是将其中的一部分迁移到其他服务器?

    • 是的:那么在每个应用程序中embeddedMySQL服务器是有意义的,因为它将会以最less的configuration工作“应付”应用程序。

    • NO:那么embeddedMySQL服务器没有任何强制性的理由。

  • 你是否希望能够扩展这些应用程序(即在多个容器上的单个应用程序的负载平衡请求),或者扩展MySQL服务器(例如主/从复制设置)?

    • 是的:那么你不能embeddedMySQL服务器,否则,缩放一层将扩大其他层,这将导致头痛。

    • NO:那么没有什么能阻止你embeddedMySQL服务器。

  • 你是否认为这些应用中至less有一个会有重要的数据库负载?

    • 是的:那么你可能想使用单独的MySQL服务器,因为一个应用程序可能会阻碍其他人。

    • NO:那么你可以使用一个MySQL服务器。

如果你想要一个超级易于部署的设置,那么你不需要可扩展性,但是你希望能够很容易地创build新的实例,并且你希望能够移动实例周围没有困难。

最灵活的设置是为每个应用程序部署一个应用程序容器+一个MySQL容器。 如果你想这样做的话,我会build议等待Docker 0.7,它将实现链接 ,这将允许你有一个基本的服务发现机制,以便每个应用程序容器可以很容易地发现它的数据库容器的主机/端口。

我不会在主机上部署MySQL; 如果你想要单一的MySQL安装,你可以通过运行一个MySQL容器并使用-p 3306:3306 (它将把主机的3306/tcp端口路由到MySQL容器的3306/tcp端口)来实现相同的结果。

由于5或6个应用程序很小,因此我将绝对排除每个容器安装一个单独的MySQL的选项,原因有二:

  1. 这是浪费服务器资源,它几乎相当于在同一台服务器上安装MySQL 5或6次。
  2. 它不够灵活(不能独立于应用程序扩展数据库)并且难以备份。

有一个专用的MySQL容器或直接在主机上安装MySQL(即不是dockerizied),应该有几乎相同的性能(最终,你将有一个本地的mysql进程在主机上,无论是否在容器中)。

唯一的区别是你必须挂载一个卷才能将数据保存在MySQL容器之外,因此拥有一个专用的MySQL容器是一个更好的select。