将数据库docker化(容器化)有意义吗?

57

我可以理解将无状态服务(例如Web服务器、应用服务器和负载均衡器)进行Docker化的好处。如果您在机群上运行这些服务,使用低开销很容易将这些容器移动到其他地方。但是,我不明白为什么要将数据库容器化?因为数据库连接到特定硬盘中持久的数据卷,由于状态问题,实际上不容易且不高效地移动数据库容器。那么有人能看出Docker化数据库的有用性吗?

3个回答

37
“那么,有人能解释一下为什么将数据库docker化会有用吗?”
这是个好问题,Keeto。将数据库容器化的主要原因之一是,您可以在开发、预发布和生产环境中为整个应用程序(而不仅仅是无状态部分)使用相同的一致性环境。一致的环境是Docker的承诺之一,但是当您的数据库存在于此模型之外时,在测试中会出现无法解决的巨大差异。此外,通过将数据库和应用程序的其余部分容器化,您更有可能将整个应用程序移动到不同的托管提供商(例如从AWS到Google Compute)。例如,如果您使用Amazon RDS,即使您可以将Web节点移动到Google,也无法移动数据库,这意味着您对云提供商高度依赖。"
将数据服务容器化的另一个原因是提高性能。这对于服务提供商来说尤其如此(所有的数据库即服务的提供都在容器中运行-例如rackspace cloud databases-),因为容器允许您提供使用虚拟化不可能实现的服务保证,而且每台物理机器只能运行一个数据库在经济上并不可行。如果您在裸机上运行并想要使用容器进行进程隔离而不是VM,则这种类比也同样适用。由于在VM中运行数据库时会出现众所周知的I/O问题,因此您的数据库性能将更好。
我并不是说您应该将数据库容器化,但这些是使之有意义的一些原因。
完全公开披露,我在clusterhq工作,这是Mark O'connor在他的答案中提到的新项目。我们有一个名为Flocker的开源项目,它使迁移数据库及其卷至主机变得更加容易,以便上述好处不会被您在问题中提出的负面影响完全抵消。

4
期待Flocker项目有更多的发展。 - Mark O'Connor

15

对于你关于效率的评论,我不确定是否同意...相比于本地安装,下载和运行数据库容器要容易得多。docker文档描述了如何在有状态容器和其数据之间实现干净的逻辑分离:

但是...你说的没错,有状态容器将会与它的主机服务器绑定在一起,除非有某种机制可以将数据随着容器移动。

一个显而易见的解决方案是在可能运行您的数据库的所有主机上挂载共享存储卷。

以下文章讨论了一种非常创新的解决方案,其中类似bittorrent的客户端用于在主机之间复制数据容器。

最后,一个名为flocker的新项目正在尝试通过管理有状态容器及其关联的ZFS卷来解决这个问题:


谢谢。我并不是指数据库服务器。我的意思是移动数据或者将这个数据卷挂载到NFS上都是低效的解决方案,这也是前面提到的问题之一。 - Keeto
1
@Keeto 无论数据库软件是否使用Docker化,都需要在服务器之间复制数据 :-) 我认为我们两个想表达的观点是,尽管Docker使应用程序具有可移植性,但有状态容器需要额外的支持来维护其数据。 - Mark O'Connor

0

这是一个不错的帖子,SQL Server克隆方面的最新进展将为使用克隆容器增加额外功能。 这解决了处理大型数据集时遇到的一些问题。 全部披露,我在Windocks工作,我们发布了2.0版本的SQL Server容器和集成数据库克隆。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接