如何在Docker中处理持久性存储(如数据库)

人们如何处理Docker容器的持久存储

我目前正在使用这种方法:构建映像,例如PostgreSQL,然后用

docker run--来自c0dbc34fd631-d应用程序名称/postgres的卷

IMHO,这有一个缺点,我不能(偶然地)删除容器“c0dbc34fd631”

另一个想法是将主机卷“-v”装载到容器中,但是,容器中的用户ID不一定与来自主机的用户ID匹配,然后权限可能会混乱

注意:您也可以使用--来自我的数据容器的卷,而不是--来自“cryptic_id”,其中我的数据容器是您分配给仅数据容器的名称,例如docker run--命名我的数据容器…(请参阅接受的答案)

Docker 1.9.0及以上版本

使用卷API

docker卷创建--name hello
docker run-d-v hello:/container/path/for/volume container\u image my\u命令

这意味着只有数据的容器模式必须放弃,取而代之的是新的卷

实际上,volume API只是实现数据容器模式的更好方法

如果您使用-v volume\u name:/container/fs/path创建容器,Docker将自动为您创建一个命名卷,该卷可以:

  1. 通过docker卷ls
  2. 通过docker volume inspect volume\u name
  3. 作为普通目录备份
  4. 像以前一样通过--卷自连接进行备份

新的卷API添加了一个有用的命令,可用于识别悬挂卷:

docker卷ls-f悬挂=true

然后通过其名称将其删除:

docker卷rm<卷名>

正如@mpugach在评论中强调的那样,你可以用一行漂亮的单字摆脱所有悬垂的卷:

docker卷rm$(docker卷ls-f悬挂=true-q)
#或者使用1.13.x
docker卷修剪

Docker 1.8.x及以下版本

似乎最适合生产的方法是使用一个只包含数据的容器

“仅数据”容器在裸体图像上运行,实际上除了公开数据卷之外什么都不做

然后,您可以运行任何其他容器以访问数据容器卷:

docker run--要执行的数据容器中的卷和其他容器命令
  • 在这里,您可以很好地了解如何安排不同的容器
  • 这里有一个关于卷如何工作的很好的见解

在这篇博文中,我们将所谓的容器很好地描述为卷模式,这澄清了使用仅数据容器的要点

Docker文档现在将容器定义为卷模式

以下是Docker 1.8.x及以下版本的备份/恢复过程

备份:

sudo docker run--rm--DATA中的卷-v$(pwd):/backup busybox tar cvf/backup/backup.tar/DATA
  • --rm:在容器退出时将其移除
  • --来自数据的卷:附加到数据容器共享的卷
  • -v$(pwd):/backup:bind将当前目录装载到容器中;将tar文件写入
  • busybox:一个小而简单的映像-便于快速维护
  • tar cvf/backup/backup.tar/data:创建/data目录中所有文件的未压缩tar文件

恢复:

创建一个新的数据容器
$sudo docker run-v/data-name DATA2 busybox true
#将备份文件解压到新容器中᾿s数据量
$sudo docker run--rm--DATA2中的卷-v$(pwd):/backup busybox tar xvf/backup/backup.tar
资料/
数据/sven.txt
#与原始容器进行比较
$sudo docker run--rm--DATA中的卷-v`pwd`:/backup busybox ls/DATA
sven.txt

这里有一篇优秀的Brian Goff的好文章,解释了为什么对容器和数据容器使用相同的图像是好的

发表评论