人们如何处理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将自动为您创建一个命名卷,该卷可以:
- 通过
docker卷ls - 通过
docker volume inspect volume\u name - 作为普通目录备份
- 像以前一样通过
--卷自连接进行备份
新的卷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的好文章,解释了为什么对容器和数据容器使用相同的图像是好的