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

新手上路,请多包涵

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

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

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

恕我直言,这有一个缺点,我绝不能(偶然)删除容器“c0dbc34fd631”。

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

Note: Instead of --volumes-from 'cryptic_id' you can also use --volumes-from my-data-container where my-data-container is a name you assigned to a data-only container, eg docker run --name my-data-container ... (见接受的答案)

原文由 juwalter 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 423
2 个回答

Docker 1.9.0 及以上

使用 卷 API

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

这意味着必须放弃纯数据容器模式以支持新卷。

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

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

  1. 通过 docker volume ls 被列出
  2. 通过 docker volume inspect volume_name 被识别
  3. 备份为普通目录
  4. 通过 --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

Docker 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 的一篇很好的文章, 解释了为什么对容器和数据容器使用相同的图像是好的。

原文由 tommasop 发布,翻译遵循 CC BY-SA 4.0 许可协议

Docker v1.0 版本 中,绑定主机上的文件或目录的挂载可以通过给定的命令完成:

 $ docker run -v /host:/container ...

上述卷可以用作运行 Docker 的主机上的持久存储。

原文由 amitmula 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进