在 Docker 中将 Data Volume Container 用作单数据库 "backend" 有什么好处?
What's are the benefits for using Data Volume Container as a single-database "backend" in Docker?
我试图掌握单独的数据卷容器的想法。在许多地方,我发现提倡这种做法是有益的(例如 in this question),但是我看不到为简单的一个数据库堆栈使用单独的数据容器有任何意义。
我知道:
- 它解耦了我的数据库容器——但我为什么要这样呢?我不会更改数据库映像,因为我不会在这里开发数据库。
- 它允许我共享数据 - 但同样,我没有人可以与之共享它,只有一个容器使用它
- 它可以防止我意外删除容器 - 真的吗?我的单一一体式容器绝对不会比它更能防止删除
- 我可以轻松备份它 - 就像我可以备份我唯一容器中的数据一样,对吗?
我清楚地看到这种方法在不同设置中的好处,当数据以某种方式共享时,但作为 "container as a database" 问题的解决方案,对我来说似乎只是额外的笨拙。
我错过了什么?
将数据与实际数据库软件本身分离的最大好处是您可以轻松更新数据库软件。
对于数据库容器外部的数据,您只需使用较新版本的软件构建一个新映像,删除旧的数据库容器,然后启动新的。您无需担心以某种方式导出和导入数据。数据库镜像本身是完全无状态的。
将数据保存在容器外部的另一个好处是,如果数据库的存储需求变大,您可以相当轻松地转向使用主机卷而不是纯数据容器,而无需重新配置存储所有 个容器。
相比之下,如果您将数据存储在数据库容器中,您的升级路径将是以下之一:
像虚拟机一样对待容器。
登录容器,执行某种包升级,并重启数据库服务。这行得通,但不太容易维护,因为您的图像不再直接从 Dockerfile 生成:因为您进行了手动更改,所以不再有一个清晰的自动化过程来将图像重建到相同的状态。
将您的数据复制到新容器中。
这真的只是额外的工作。此模型的一个好处是它为您提供了一种机制,您可以通过该机制回滚到数据库软件的早期版本和数据库内容的早期版本。
我仍然处于 Docker 开发的边缘,所以这只是我根据 read/overheard 进行的有根据的猜测。乱序回复你的分数:
- it decouples my database container - but why would I want that? I won't change database image, as I'm not developing a database here.
- it prevents me from accidentally deleting a container - does it really? It's in no way more protected from deletion that my single all-in-one container is
比如说你,或者下一个维护这个系统的人,稍后某个时候过来,想要升级你的 postgres 版本(或者你的 SQL 栈是什么)。您决定为新版本启动一个新的 docker container/image 并将其层叠在旧版本之上会更容易。如果您的单个 docker 容器中同时包含数据和软件,则您没有该选项。当然,您仍然可以搞砸您的数据量,但是您不能通过使用解耦的服务器容器搞砸您的数据。
- it allows me to share the data - but again, I have nobody to share it with, just one container using it
您现在可能不会分享;您可能永远没有人可以与之分享。但这并不意味着您不想在系统、应用程序、服务器等之间共享它
- I can easily back it up - just like I can back up the data inside my only container, right?
当然可以,但是如果您要备份整个容器,则每次都在备份软件和数据,这是不必要的。如果您将数据从容器中转储出来,那么您就没有真正考虑容器。
我认为拥有解耦数据量的一个明显优势是可以在环境之间移动数据。假设您想要一个新的数据快照以在您的舞台环境中进行测试。只需获取 prod 容器备份并将其复制下来。如果您想截断旧数据或 trim 某些 tables 以使其易于管理,很容易想象构建代理启动连接到此备份的服务器容器和 运行 一些脚本或存储过程(出于安全原因,您可能不希望在产品容器中使用它们)。
您甚至可以拥有一个最小的数据容器,其中仅包含用于开发和测试的存根 table 模式。您可以为此使用一个单独的一体式容器,但是当您需要更新数据库版本时,您必须更新多个容器,而不是创建一个 updated/new 容器并让它为您修改数据量.
我试图掌握单独的数据卷容器的想法。在许多地方,我发现提倡这种做法是有益的(例如 in this question),但是我看不到为简单的一个数据库堆栈使用单独的数据容器有任何意义。 我知道:
- 它解耦了我的数据库容器——但我为什么要这样呢?我不会更改数据库映像,因为我不会在这里开发数据库。
- 它允许我共享数据 - 但同样,我没有人可以与之共享它,只有一个容器使用它
- 它可以防止我意外删除容器 - 真的吗?我的单一一体式容器绝对不会比它更能防止删除
- 我可以轻松备份它 - 就像我可以备份我唯一容器中的数据一样,对吗?
我清楚地看到这种方法在不同设置中的好处,当数据以某种方式共享时,但作为 "container as a database" 问题的解决方案,对我来说似乎只是额外的笨拙。
我错过了什么?
将数据与实际数据库软件本身分离的最大好处是您可以轻松更新数据库软件。
对于数据库容器外部的数据,您只需使用较新版本的软件构建一个新映像,删除旧的数据库容器,然后启动新的。您无需担心以某种方式导出和导入数据。数据库镜像本身是完全无状态的。
将数据保存在容器外部的另一个好处是,如果数据库的存储需求变大,您可以相当轻松地转向使用主机卷而不是纯数据容器,而无需重新配置存储所有 个容器。
相比之下,如果您将数据存储在数据库容器中,您的升级路径将是以下之一:
像虚拟机一样对待容器。
登录容器,执行某种包升级,并重启数据库服务。这行得通,但不太容易维护,因为您的图像不再直接从 Dockerfile 生成:因为您进行了手动更改,所以不再有一个清晰的自动化过程来将图像重建到相同的状态。
将您的数据复制到新容器中。
这真的只是额外的工作。此模型的一个好处是它为您提供了一种机制,您可以通过该机制回滚到数据库软件的早期版本和数据库内容的早期版本。
我仍然处于 Docker 开发的边缘,所以这只是我根据 read/overheard 进行的有根据的猜测。乱序回复你的分数:
- it decouples my database container - but why would I want that? I won't change database image, as I'm not developing a database here.
- it prevents me from accidentally deleting a container - does it really? It's in no way more protected from deletion that my single all-in-one container is
比如说你,或者下一个维护这个系统的人,稍后某个时候过来,想要升级你的 postgres 版本(或者你的 SQL 栈是什么)。您决定为新版本启动一个新的 docker container/image 并将其层叠在旧版本之上会更容易。如果您的单个 docker 容器中同时包含数据和软件,则您没有该选项。当然,您仍然可以搞砸您的数据量,但是您不能通过使用解耦的服务器容器搞砸您的数据。
- it allows me to share the data - but again, I have nobody to share it with, just one container using it
您现在可能不会分享;您可能永远没有人可以与之分享。但这并不意味着您不想在系统、应用程序、服务器等之间共享它
- I can easily back it up - just like I can back up the data inside my only container, right?
当然可以,但是如果您要备份整个容器,则每次都在备份软件和数据,这是不必要的。如果您将数据从容器中转储出来,那么您就没有真正考虑容器。
我认为拥有解耦数据量的一个明显优势是可以在环境之间移动数据。假设您想要一个新的数据快照以在您的舞台环境中进行测试。只需获取 prod 容器备份并将其复制下来。如果您想截断旧数据或 trim 某些 tables 以使其易于管理,很容易想象构建代理启动连接到此备份的服务器容器和 运行 一些脚本或存储过程(出于安全原因,您可能不希望在产品容器中使用它们)。
您甚至可以拥有一个最小的数据容器,其中仅包含用于开发和测试的存根 table 模式。您可以为此使用一个单独的一体式容器,但是当您需要更新数据库版本时,您必须更新多个容器,而不是创建一个 updated/new 容器并让它为您修改数据量.