Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker 什么';将数据卷容器用作单个数据库的好处是;后端“;在码头?_Docker - Fatal编程技术网

Docker 什么';将数据卷容器用作单个数据库的好处是;后端“;在码头?

Docker 什么';将数据卷容器用作单个数据库的好处是;后端“;在码头?,docker,Docker,我试图掌握独立数据卷容器的概念。在许多地方,我发现提倡的方法是有益的(比如),但是我不认为为简单的、一个数据库堆栈使用单独的数据容器有任何意义。 我知道: 它解耦了我的数据库容器——但我为什么要这样做呢?我不会更改数据库映像,因为我不是在这里开发数据库 它允许我共享数据——但同样,我没有人可以共享数据,只有一个容器使用它 它可以防止我无意中删除一个容器-真的吗?我的一个多功能容器在删除时受到的保护绝不比我的多 我可以很容易地备份它——就像我可以在我唯一的容器中备份数据一样,对吗 我清楚地看到

我试图掌握独立数据卷容器的概念。在许多地方,我发现提倡的方法是有益的(比如),但是我不认为为简单的、一个数据库堆栈使用单独的数据容器有任何意义。 我知道:

  • 它解耦了我的数据库容器——但我为什么要这样做呢?我不会更改数据库映像,因为我不是在这里开发数据库
  • 它允许我共享数据——但同样,我没有人可以共享数据,只有一个容器使用它
  • 它可以防止我无意中删除一个容器-真的吗?我的一个多功能容器在删除时受到的保护绝不比我的多
  • 我可以很容易地备份它——就像我可以在我唯一的容器中备份数据一样,对吗
我清楚地看到这种方法在不同的设置中的好处,当数据以某种方式共享时,但作为“容器作为数据库”问题的解决方案,对我来说似乎只是额外的麻烦


我遗漏了什么?

将数据与实际数据库软件本身分离的最大好处是,您可以轻松地更新数据库软件

对于数据库容器外部的数据,您只需使用较新版本的软件构建一个新映像,删除旧的数据库容器,然后启动新的数据库容器。您不必担心以某种方式导出和导入数据。数据库映像本身是完全无状态的

将数据保留在容器外部的另一个好处是,如果数据库的存储需求越来越大,您可以非常轻松地使用主机卷而不是仅使用数据的容器,而无需为所有容器重新配置存储

相反,如果将数据存储在数据库容器中,则升级路径将是以下路径之一:

  • 将容器视为vm

    登录容器,执行某种包升级,然后重新启动datbase服务。这是可行的,但维护性较差,因为您的映像不再直接从Dockerfile生成:因为您已经进行了手动更改,因此不再有清晰、自动的过程将映像重建到相同的状态

  • 将数据复制到新容器中

    这真的只是额外的工作。此模型的一个好处是,它为您提供了一种机制,通过该机制,您可以回滚到数据库软件的早期版本和数据库内容的早期版本


我仍处于Docker开发的边缘,所以这只是从我读到/无意中听到的有教育意义的猜测。回应您的不合规程的观点:

  • 它解耦了我的数据库容器——但我为什么要这样做呢?我不会更改数据库映像,因为我不是在这里开发数据库
  • 它可以防止我意外删除一个容器-真的吗?与我的单一一体式容器相比,它在任何方面都不会受到更大的删除保护
比如说你,或者下一个维护这个系统的人,稍后会来升级你的postgres版本(或者不管你的SQL堆栈是什么)。您决定为新版本创建一个新的docker容器/图像,并在旧版本的基础上进行分层,这样会更容易。如果您的单个docker容器上同时包含数据和软件,则您没有该选项。当然,你仍然可以搞乱你的数据量,但是你不能用一个解耦的服务器容器来搞乱你的数据

  • 它允许我共享数据——但同样,我没有人可以共享数据,只有一个容器使用它
你现在可能没有分享它;你可能永远不会有人与你分享。但这并不意味着您不想在系统、应用程序、服务器等之间共享它

  • 我可以很容易地备份它——就像我可以在我唯一的容器中备份数据一样,对吗
当然可以,但如果备份整个容器,则每次都会备份软件和数据,这是不必要的。如果您正在从容器中转储数据,那么您并没有真正考虑容器

我认为使用解耦数据量的一个明显优势是可以在环境之间移动数据。假设您想要一个新的数据快照,以便在阶段环境中进行测试。只需抓取一个prod容器备份并将其复制下来。如果您希望截断旧数据或精简某些表以使其易于管理,则很容易想象生成代理启动连接到此备份的服务器容器并运行一些脚本或存储过程(出于安全原因,您可能不希望在prod容器上安装这些脚本或存储过程)


您甚至可以有一个最小的数据容器,其中只包含用于开发和测试的存根表模式。您可以使用一个单独的多功能容器,但是当您需要更新db版本时,您必须更新多个容器,而不是制作一个更新/新的容器,让它为您修改数据量。

最后两段让我接受了。我希望我能在其他任何地方发现,我认为这是一个相当重要的因素。不过,我不同意DB升级-可能“原始数据”与新的DB版本不兼容,因此无论如何,将使用某种导入/导出脚本将数据与数据库分离。我不明白的是,为什么我们应该运行一个空的数据卷容器来“保存”卷,而不是仅仅使用一个主机卷?我错过了什么?