17

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

我计划用 Docker 安装替换这个服务器:一个服务器,每个应用一个容器,前面有一个 nginx。

我的问题是:你会把数据库部分放在哪里?

我主要看到4种可能性:

1) 每个应用容器内有一个 Mysql 服务器。我认为这似乎不是 Docker 的哲学。它需要单独备份每个容器的数据。

2) 适用于所有应用程序的唯一 MySQL 容器。

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

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

你会怎么做 ?

PS:我知道 Docker 还没有准备好生产,我现在打算用它来进行暂存,如果我对它满意就切换。

4

2 回答 2

22

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

  • 这 5-6 个应用程序是否非常相似(即,在 Docker 术语中,您可以将它们基于一个通用映像),您是否正在考虑部署更多应用程序,和/或将其中一些应用程序迁移到其他服务器?

    • 是的:那么将 MySQL 服务器嵌入到每个应用程序中是有意义的,因为它将“坚持”在应用程序中,只需最少的配置工作。

    • 否:那么没有令人信服的理由嵌入 MySQL 服务器。

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

    • 是:那么你不能嵌入 MySQL 服务器,否则,扩展一层会扩展另一层,这会导致头疼。

    • 否:那么没有什么可以阻止您嵌入 MySQL 服务器。

  • 您认为至少其中一个应用程序会产生大量数据库负载吗?

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

    • 否:那么您可以使用单个 MySQL 服务器。

如果您想要一个超级易于部署的设置,则嵌入 MySQL 服务器很好,您不需要可扩展性,但您希望能够超级轻松地启动新实例,并且您希望能够移动实例周围没有困难。

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

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

于 2013-10-08T18:48:16.370 回答
1

由于您描述的 5 或 6 个应用程序很小,我肯定会排除为每个容器安装单独的 MySQL 的选项,原因有两个:

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

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

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

于 2014-11-05T18:06:05.853 回答