人们如何处理 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 许可协议
Docker 1.9.0 及以上
使用 卷 API
这意味着必须放弃纯数据容器模式以支持新卷。
实际上,volume API 只是实现数据容器模式的更好方法。
如果您使用
-v volume_name:/container/fs/path
创建一个容器,Docker 将自动为您创建一个命名卷,它可以:docker volume ls
被列出docker volume inspect volume_name
被识别--volumes-from
连接像以前一样备份新的卷 API 添加了一个有用的命令,可让您识别悬空卷:
然后通过其名称将其删除:
正如@mpugach 在评论中强调的那样,您可以用一个漂亮的单线摆脱所有悬空的卷:
Docker 1.8.x 及以下
似乎最适合生产的方法是使用 仅数据容器。
仅数据容器在准系统映像上运行,实际上除了公开数据卷之外什么都不做。
然后,您可以运行任何其他容器来访问数据容器卷:
在 这篇博 文中,对所谓的 容器作为卷模式 进行了很好的描述,它阐明了 只有数据容器 的要点。
Docker 文档现在将 容器定义为 volume/s 模式。
以下是 Docker 1.8.x 及以下版本的备份/恢复过程。
备份:
恢复:
这是 来自优秀的 Brian Goff 的一篇很好的文章, 解释了为什么对容器和数据容器使用相同的图像是好的。