docker 卷容器策略
docker volume container strategy
假设您正在尝试对数据库进行 docker 化(例如 couchdb)。
那么至少有两种资产是您考虑交易量的:
- 数据库文件
- 日志文件
我们进一步假设您希望将 db 文件保密,但希望公开日志文件以供以后处理。
据我对文档的理解,你有两个选择:
第一个选项
- 为 db-image 中的日志文件和 db 文件定义托管卷
- 将它们导入第二个容器(您将同时获得)并使用日志
第二个选项
- 为日志创建带有托管卷的数据容器
- 仅为 db 文件创建带有托管卷的 db 映像
- 当 运行 db-image
时从数据容器导入日志卷
两个问题:
- 这两个选项是否真的有效/可行?
- 更好的方法是什么?
br 沃尔克
问题 1 的答案是,是的,两者都是有效且可能的。
我对问题 2 的回答是,我会考虑完全不同的方法,选择哪种方法取决于这是否是一个关键任务系统,是否必须避免数据丢失。
关键任务
如果你绝对不能丢失你的数据,那么我建议你绑定挂载一个可靠的磁盘到你的数据库容器中。绑定挂载本质上是将 Docker 主机文件系统的一部分挂载到容器中。
所以以数据库文件为例,你可以想象这些步骤:
- 创建一个可靠的磁盘,例如定期 backed-up
的 NFS
- 将此磁盘连接到您的 Docker 主机
- 将此磁盘绑定到我的数据库容器中,然后将数据库文件写入此磁盘。
所以按照上面的例子,假设我已经创建了一个可靠的磁盘,它通过 NFS 共享并安装在我的 Docker 主机上 /reliable/disk
。要将其用于我的数据库,我将 运行 以下 Docker 命令:
docker run -d -v /reliable/disk:/data/db my-database-image
这样我就知道数据库文件写入了可靠的存储。即使我失去了我的 Docker 主机,我仍然拥有数据库文件,并且可以通过 运行 在另一台可以访问 NFS 共享的主机上连接我的数据库容器来轻松恢复。
您可以对数据库日志执行完全相同的操作:
docker run -d -v /reliable/disk/data/db:/data/db -v /reliable/disk/logs/db:/logs/db my-database-image
此外,您可以轻松地将这些卷绑定安装到其他容器中以执行单独的任务。您可能需要考虑将它们作为 read-only 绑定安装到其他容器中以保护您的数据:
docker run -d -v /reliable/disk/logs/db:/logs/db:ro my-log-processor
如果这是一个关键任务系统,这将是我推荐的方法。
非关键任务
如果系统不是关键任务并且您可以容忍更高的数据丢失可能性,那么我会看一下 Docker Volume API,它恰好用于您想要做的事情:管理并为应该超出容器生命周期的数据创建卷。
docker volume
命令的好处在于它可以让您创建命名卷,如果您将它们命名得当,人们就可以很清楚地知道它们的用途:
docker volume create db-data
docker volume create db-logs
然后您可以从命令行将这些卷装载到您的容器中:
docker run -d -v db-data:/db/data -v db-logs:/logs/db my-database-image
如果您的 Docker 主机,这些卷将在容器的生命周期之后继续存在并存储在文件系统中。您可以使用:
docker volume inspect db-data
找出数据的存储位置,如果需要,back-up 那个位置。
您可能还想看看 Docker Compose 这样的东西,它允许您在一个文件中声明所有这些,然后通过一个命令创建整个环境。
假设您正在尝试对数据库进行 docker 化(例如 couchdb)。 那么至少有两种资产是您考虑交易量的:
- 数据库文件
- 日志文件
我们进一步假设您希望将 db 文件保密,但希望公开日志文件以供以后处理。
据我对文档的理解,你有两个选择:
第一个选项
- 为 db-image 中的日志文件和 db 文件定义托管卷
- 将它们导入第二个容器(您将同时获得)并使用日志
第二个选项
- 为日志创建带有托管卷的数据容器
- 仅为 db 文件创建带有托管卷的 db 映像
- 当 运行 db-image 时从数据容器导入日志卷
两个问题:
- 这两个选项是否真的有效/可行?
- 更好的方法是什么?
br 沃尔克
问题 1 的答案是,是的,两者都是有效且可能的。
我对问题 2 的回答是,我会考虑完全不同的方法,选择哪种方法取决于这是否是一个关键任务系统,是否必须避免数据丢失。
关键任务
如果你绝对不能丢失你的数据,那么我建议你绑定挂载一个可靠的磁盘到你的数据库容器中。绑定挂载本质上是将 Docker 主机文件系统的一部分挂载到容器中。
所以以数据库文件为例,你可以想象这些步骤:
- 创建一个可靠的磁盘,例如定期 backed-up 的 NFS
- 将此磁盘连接到您的 Docker 主机
- 将此磁盘绑定到我的数据库容器中,然后将数据库文件写入此磁盘。
所以按照上面的例子,假设我已经创建了一个可靠的磁盘,它通过 NFS 共享并安装在我的 Docker 主机上 /reliable/disk
。要将其用于我的数据库,我将 运行 以下 Docker 命令:
docker run -d -v /reliable/disk:/data/db my-database-image
这样我就知道数据库文件写入了可靠的存储。即使我失去了我的 Docker 主机,我仍然拥有数据库文件,并且可以通过 运行 在另一台可以访问 NFS 共享的主机上连接我的数据库容器来轻松恢复。
您可以对数据库日志执行完全相同的操作:
docker run -d -v /reliable/disk/data/db:/data/db -v /reliable/disk/logs/db:/logs/db my-database-image
此外,您可以轻松地将这些卷绑定安装到其他容器中以执行单独的任务。您可能需要考虑将它们作为 read-only 绑定安装到其他容器中以保护您的数据:
docker run -d -v /reliable/disk/logs/db:/logs/db:ro my-log-processor
如果这是一个关键任务系统,这将是我推荐的方法。
非关键任务
如果系统不是关键任务并且您可以容忍更高的数据丢失可能性,那么我会看一下 Docker Volume API,它恰好用于您想要做的事情:管理并为应该超出容器生命周期的数据创建卷。
docker volume
命令的好处在于它可以让您创建命名卷,如果您将它们命名得当,人们就可以很清楚地知道它们的用途:
docker volume create db-data
docker volume create db-logs
然后您可以从命令行将这些卷装载到您的容器中:
docker run -d -v db-data:/db/data -v db-logs:/logs/db my-database-image
如果您的 Docker 主机,这些卷将在容器的生命周期之后继续存在并存储在文件系统中。您可以使用:
docker volume inspect db-data
找出数据的存储位置,如果需要,back-up 那个位置。
您可能还想看看 Docker Compose 这样的东西,它允许您在一个文件中声明所有这些,然后通过一个命令创建整个环境。