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

Mysql 关于数据库的Docker多应用服务器体系结构,mysql,ruby,architecture,docker,Mysql,Ruby,Architecture,Docker,我有一个运行5或6个小型Rails应用程序的服务器。他们所有的附件都在S3上,他们都使用MySQL作为数据库。每个应用程序都有自己的用户并运行一些Thin。有一个nginx服务器负责负载平衡和域路由 我计划用Docker安装来替换这个服务器:一个服务器,每个应用程序有一个容器,前面有一个nginx 我的问题是:你会把数据库部分放在哪里 我主要看到4种可能性: 1) 每个应用程序容器内有一个Mysql服务器。我想这不是Docker的哲学。这将需要对每个容器的数据进行单独备份 2) 用于所有应用程序

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

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

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

我主要看到4种可能性:

1) 每个应用程序容器内有一个Mysql服务器。我想这不是Docker的哲学。这将需要对每个容器的数据进行单独备份

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

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

4) 为所有应用程序提供单独的MySQL服务器

你会怎么做


PS:我知道Docker还没有准备好生产,我计划现在就用它来做舞台表演,如果我对它满意的话就换一台。

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

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

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

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

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

    • 是:那么您就不能嵌入MySQL服务器,否则,扩展一层会扩展另一层,这将导致令人头痛的问题

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

  • 你认为这些应用中至少有一个会有很大的数据库负载吗

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

    • 否:然后您可以使用单个MySQL服务器

如果您想要一个超级易于部署的设置(不需要可伸缩性),但希望能够超级轻松地启动新实例,并且希望能够轻松地移动实例,那么嵌入MySQL服务器是很好的

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


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

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

  • 这是对服务器资源的浪费,几乎相当于在同一台服务器上安装5到6次MySQL
  • 它的灵活性较低(无法独立于应用程序扩展数据库),备份也较困难
  • 拥有一个专用的MySQL容器或直接在主机上安装MySQL(即不dockerizied),应该具有几乎相同的性能(最终,无论是否在容器中,主机上都会有一个本机MySQL进程)

    唯一的区别是,您必须装载一个卷才能将数据持久化到MySQL之外
    容器,因此使用专用的MySQL容器是更好的选择。

    谢谢!是的,除了Rails和Ruby版本之外,这些应用程序都很相似,只是标准的Rails应用程序及其依赖项。不需要扩展或复制,只需要一些基本的(几乎是遗留的)网站,功能很少。当选择直接在Docker主机上运行MySQL时,容器能够轻松连接到它吗?仅通过127.0.0.1?是的,通过
    。我使用1个docker mysql容器和多个使用它的应用程序,也在容器中。主机只安装了docker。是的,只需将MySQL的IP/端口作为环境变量传递给将使用它的docker容器(不是127.0.0.1)@Majkinator,他询问直接在主机上运行MySQL,即在docker容器外部