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

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

docker run --volumes-from c0dbc34fd631 -d app_name/postgres

恕我直言,这有缺点,我不能(意外地)删除容器“c0dbc34fd631”。

另一个想法是将主机卷“-v”挂载到容器中,然而,容器中的用户id不一定与来自主机的用户id匹配,然后权限可能会被打乱。

注意:除了——volumes-from 'cryptic_id',你还可以使用——volumes-from my-data-container,其中my-data-container是你分配给仅数据容器的名称,例如docker run——name my-data-container…(见公认答案)


当前回答

我最近写了一篇关于潜在解决方案和演示该技术的应用程序的文章。我发现它在开发和生产过程中非常有效。希望它能帮助或激发一些想法。

回购:https://github.com/LevInteractive/docker-nodejs-example 文章:http://lev-interactive.com/2015/03/30/docker-load-balanced-mongodb-persistence/

其他回答

Docker 1.9.0及以上版本

使用卷API

docker volume create --name hello
docker run -d -v hello:/container/path/for/volume container_image my_command

这意味着必须放弃纯数据容器模式,转而使用新卷。

实际上,卷API只是实现数据容器模式的一种更好的方式。

如果你用-v volume_name:/container/fs/path创建一个容器,Docker会自动为你创建一个命名卷,它可以:

通过docker卷ls列出 通过docker卷inspect volume_name进行识别 备份为普通目录 通过——volumes-from连接像以前一样备份

新的卷API增加了一个有用的命令,可以让你识别悬挂的卷:

docker volume ls -f dangling=true

然后通过它的名字删除它:

docker volume rm <volume name>

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

docker volume rm $(docker volume ls -f dangling=true -q)
# Or using 1.13.x
docker volume prune

码头工人1.8。X及以下

最适合生产的方法似乎是使用仅数据容器。

仅数据容器在一个基本映像上运行,实际上除了公开一个数据卷外什么也不做。

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

docker run --volumes-from data-container some-other-container command-to-execute

在这里,您可以很好地了解如何安排不同的容器。 这里有一个关于容量如何工作的很好的见解。

在这篇博客文章中,对所谓的容器作为体积模式进行了很好的描述,阐明了只有数据容器的主要观点。

Docker文档现在有了容器的volume/s模式的权威描述。

下面是Docker 1.8的备份/恢复过程。X及以下。

备份:

sudo docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data

——rm:当容器退出时将其移除 ——volumes-from DATA:附加到DATA容器共享的卷上 -v $(pwd):/backup:将当前目录挂载到容器中;将tar文件写入 Busybox:一个简单的小映像-适合快速维护 Tar CVF /backup/backup. Tar /data:将/data目录下的所有文件创建一个未压缩的Tar文件

恢复:

# Create a new data container
$ sudo docker run -v /data -name DATA2 busybox true
# untar the backup files into the new container᾿s data volume
$ sudo docker run --rm --volumes-from DATA2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
data/
data/sven.txt
# Compare to the original container
$ sudo docker run --rm --volumes-from DATA -v `pwd`:/backup busybox ls /data
sven.txt

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

这取决于你的场景(这并不适合生产环境),但这里有一种方法:

创建MySQL Docker容器

它的要点是使用主机上的目录进行数据持久性。

如果你想移动你的卷,你也应该看看Flocker。

自述:

Flocker是一个数据卷管理器和多主机Docker集群管理工具。有了它,您可以利用Linux上ZFS的强大功能,使用与用于无状态应用程序相同的工具来控制数据。 这意味着你可以在Docker中运行你的数据库、队列和键值存储,并且像移动应用程序的其他部分一样轻松。

我只是在主机上使用一个预定义的目录来持久化PostgreSQL的数据。同样,通过这种方式,可以轻松地将现有的PostgreSQL安装迁移到Docker容器:https://crondev.com/persistent-postgresql-inside-docker/

如果在更新5中选择的答案不清楚,从Docker 1.9开始,您可以创建可以存在而不与特定容器关联的卷,从而使“仅数据容器”模式过时。

查看docker 1.9.0中仅数据容器已过时?# 17798。

我认为Docker的维护者意识到只有数据的容器模式有点设计的味道,所以决定让卷成为一个独立的实体,可以在没有关联容器的情况下存在。