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

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

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

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

恕我直言,有缺点,我不能(偶然)删除容器“c0dbc34fd631”.

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

注意:代替–volumes-from’cryptic_id’,您也可以使用–volumes-from my-data-container,其中my-data-container是您分配给仅数据容器的名称,例如docker run –name my-data-container …(参见接受的答案)

最佳答案
Docker 1.9.0及更高版本

使用volume 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 volume ls列出
>通过docker volume 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

Docker 1.8.x及以下版本

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

仅数据容器在准系统映像上运行,除了暴露数据卷之外实际上什么都不做.

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

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

> Here您可以很好地了解如何安排不同的容器.
> Here对卷的工作原理有很好的了解.

this blog post中,有一个很好的描述所谓的容器作为卷模式,它阐明了仅拥有数据容器的要点.

Docker documentation has now the DEFINITIVE description of the container as volume/s pattern.

以下是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:bind将当前目录挂载到容器中;写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

这是一个很好的article from the excellent Brian Goff解释为什么对容器和数据容器使用相同的图像是好的.

转载注明原文:如何处理Docker中的持久存储(例如数据库) - 代码日志