当前位置: 首页 > 面试题库 >

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

田巴英
2023-03-14
问题内容

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

我当前正在使用这种方法:构建映像(例如针对PostgreSQL),然后使用以下命令启动容器

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

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

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

注意:例如,--volumes-from 'cryptic_id'您可以使用--volumes-from my-data- containerwhere my-data-container是分配给仅数据容器的名称,而不是docker run --name my-data- container ...(请参见接受的答案)


问题答案:

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/pathDocker 创建容器,则会自动为您创建一个命名卷,该卷可以:

  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文档现在将 容器 的定义描述 为卷/秒
模式。

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



 类似资料:
  • 问题内容: 关闭redis服务器后,使用set存储的值被破坏,在这里我找到了使用持久性存储的方法,有人帮助我,如何使用javascript实现它? 我想将来自客户端的一些值存储在redis db中,并且必须在其他客户端中使用该值。 问题答案: 您需要配置Redis服务器以支持持久性机制。此配置存储在文件中,该文件在redis-server命令行上作为参数给出。 这是Redis 2.4的默认文件:h

  • 我用Infinispan(8.2.4 Final)设置了一个集群缓存存储,使用SoftIndexFileStore进行持久化。 文档中指出,如果条目过期,压缩程序将无法清理清除的条目,磁盘使用量将随着时间的推移而增加。从用户指南: 当条目存储过期时,SIFS无法检测到其中一些条目已过期。因此,不会压缩这样的旧文件(未实现方法AdvancedStore.purgeExpired()。这可能会导致文件

  • 我在研究内存数据库的概念。有关这方面的文章说, 内存数据库系统是一种将数据完全存储在主存中的数据库管理系统。 他们讨论了这个概念的优点和缺点。 我的问题是如果这些数据库管理系统将数据完全存储在主存储器中, 停电后所有数据都消失了吗??? 还是有办法保护数据???

  • 主要内容:一、数据持久化,二、持久化的形式,三、源码分析,四、总结一、数据持久化 redis做为一种内存型数据库,做持久化,个人感觉略有鸡肋的意思。似乎有一种,别人有,自己不有也不行的感觉。以目前Redis主流的应用方式,如果仔细分析,基本上都是在内存中即可完成,对持久化没要求或者说不大。再举一个反例,如果内存中有几百G甚至更多的数据,真要是整体当机,恢复的时间基本就是灾难。 目前基本应用仍然是以关系型数据库或者其它数据库(如Hadoop,Mysql等)为持久化

  • 目的 配置 NFS 共享为 OpenShift 节点提供存储,并且配置 OpenShift 持久卷以绑定至数据库 Pod。 环境 openshift v3.11.16/kubernetes v1.11.0 步骤 配置 NFS 共享持久卷1. 登录到 NFS 服务器 # ssh nfs.example.com2. 创建 config-nfs.sh 脚本,内容如下 #!/usr/bin/sh exp

  • 我使用StreamRefs在集群中的参与者之间建立流式连接。目前,在writing节点中,我手动将传入消息保存到日志文件中,但我想知道是否可以将其替换为persistent,用于写入,以及persistent,用于从Akka Persistence journal启动actor时读取。我一直在考虑用Persistent actor的