【问题标题】:Docker: split mysql databases into different data volume containers?Docker:将 mysql 数据库拆分为不同的数据卷容器?
【发布时间】:2015-08-02 15:22:38
【问题描述】:

我有以下 Docker 容器:

  • web (nginx)
  • db (mysql)

web 容器链接到 db 容器。所有标准的东西。

对于数据持久性,我想采用data volume container 的方法。

我希望能够使用这 2 个容器作为主应用程序容器来运行多个网站(嗯,从技术上讲,web 容器运行主要的面向用户的应用程序,db 位于其后面)。

假设我有siteAsiteBsiteC,分别在mysql中使用数据库ABC

我希望能够将这些站点的数据库数据划分为 3 个不同的数据卷容器(dataAdataBdataC)以实现可移植性,并将它们集中在一个部署中(一台主机运行 @ 987654337@、dbdataAdataBdataC 都已正确链接)在需要时。

有没有办法将单独的 mysql 数据库分区到它们自己的数据卷容器中以实现可移植性? AFAIK,mysql 以某种不透明的方式将其所有数据库数据存储在 /var/lib/mysql mysql 存储的数据库的术语。

例如,如果将存储在 mysql 中的不同数据库映射到已知目录 - 在本例中为 /var/lib/mysql/A/var/lib/mysql/B/var/lib/mysql/C,那就太好了。这样,我所要做的就是保留这些目录并将它们安装在db 容器中。不过我不认为是这种情况。

【问题讨论】:

  • 我猜你想要一个 mysql 服务器进程,它将每个数据库保存在不同的目录中。我在 mysql 文档中找不到类似的东西。也许将数据库定期转储到这些目录中并能够重新导入就足够了。否则我建议使用卢克的方式。

标签: mysql database nginx docker


【解决方案1】:

为什么不只运行 db 容器的多个实例?根据需要映射目录。

docker run -d -v /var/lib/mysql/A:/var/lib/mysql --name dbA my_docker/my_awesome_mysql
docker run -d -v /var/lib/mysql/B:/var/lib/mysql --name dbB my_docker/my_awesome_mysql
docker run -d -v /var/lib/mysql/C:/var/lib/mysql --name dbC my_docker/my_awesome_mysql

如果您只需要将 dbA 移动到另一台主机,这将有所帮助。

【讨论】:

  • 我不想这样做的最大原因是它会使与我的web 容器的链接复杂化(使用单个db 容器,链接很简单)。使用 3 个数据库容器,链接将如何工作?此外,如果应用程序代码中的所有数据库连接器都将连接到一个众所周知的端口,那么在没有一些非常特殊的 NAT 技巧的情况下部署这种多数据库设置将非常困难。
  • 您需要 3 个链接 --link dbA:dbA --link dbB:dbB --link dbC:dbC 然后配置您的应用程序以访问不同主机上的每个数据库。 dbA:端口 dbB:端口 dbC:端口。它们使用所有相同的端口,因为它们在不同的主机上运行。这就像连接到三台服务器。您的应用程序代码应该能够轻松处理三个数据源。
  • 感谢您的澄清。听起来是一个合理的解决方案。我对这种方法的唯一担心是我主机上的数据库进程明显重复。
  • 对我来说,从安全角度来看,这实际上是一种优势,一个实例的问题不会传播到另一个实例的问题。
  • 我刚刚意识到由于每个应用程序都有单独的 mysqld 实例,我的服务器上的内存消耗变得越来越笨重 :( 在默认配置下,每个 mysql 实例消耗大约 400MB 内存。这是我想要的另一个原因坚持使用 mysqld 的单个实例,并拥有具有可插拔数据源的可插拔数据库。
猜你喜欢
  • 2017-10-13
  • 2014-04-13
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多