Docker 使用指南 (四)—— 数据卷的使用

一.数据卷的使用

有时候需要使用数据库,但是又希望它的数据能保存在本地,Docker中提供了数据卷可以供你方便的操作数据。数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷默认会一直存在,即使容器被删除

注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。

本次实验环境:腾讯云服务器 CentOS 6.7 x86_64

添加一个数据卷: # docker run -d -it --name busybox -v /data/ busybox 这会在容器内创建一个 /data 目录,并加载一个数据卷到容器的 /data 目录。

进入容器: # docker exec -it busybox sh

查看目录映射:

# docker inspect -f {{.Volumes}} busybox  
map[/data:/var/lib/docker/volumes/b98191464fb0b1a888507b1e5b324802012297342adfe5d6125bcbfd08b621a9/_data]

可以看到将容器中的 /data 目录映射到了 /var/lib/docker/volumes/b98191464fb0b1a888507b1e5b324802012297342adfe5d6125bcbfd08b621a9/_data 这个目录下,所以数据在容器中的 /data 目录和此目录下是同步的。

[root@sta2 data]# cd  /var/lib/docker/volumes/b98191464fb0b1a888507b1e5b324802012297342adfe5d6125bcbfd08b621a9/_data
[root@sta2 _data]# touch b

在容器中 /data 目录下查看:

/data # ls a b b 文件依然存在。

数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。

[root@sta2 docker]# docker stop eec30d8d6fce [root@sta2 docker]# docker rm -v eec30d8d6fce 使用 -v 标记也可以指定挂载一个本地主机的目录到容器中去,-v 标记也可以从主机挂载单个文件到容器中

[root@sta2 docker]# docker run -it --name mybusybox -v /data:/data busybox sh 这种方法相当于在本机中指定了要映射的目录,将本地的数据卷 /data 目录加载到容器中的 /data 目录。

/ # cd  /data/
/data # ls
a
/data # touch c

然后在本机的 /data 目录查看 c 文件是否存在:

[root@sta2 data]# ls  
a  c

Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro 指定为只读。

# docker run -it --name mybusybox -v /data:/data:ro busybox sh

二.数据卷容器

如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。

[root@sta2 data]# docker run -d -v /data/ --name dbdata busybox #首先,创建一个名为 dbdata 的数据卷容器 然后,在其他容器中使用 –volumes-from 来挂载 dbdata 容器中的数据卷。

# docker run -d --volumes-from dbdata --name db1 nginx
# docker run -d --volumes-from dbdata --name db2 nginx

也可以使用 –volumes-from 来挂载来自多个容器的多个数据卷:

# docker run -d --name db3 --volumes-from db1 --volumes-from db nginx 提示:使用 –volumes-from 参数所挂载数据卷的容器自己并不需要保持在运行状态。

备份数据卷

首先使用–volumes-from 标记来创建一个加载 dbdata 容器卷的容器,并从主机挂载当前目录到容器的 /backup 目录。命令如下: # docker run --volumes-from dbdata -v /data:/backup busybox tar cvf /backup/backup.tar.gz /data

恢复

如果要恢复数据到一个容器,首先创建一个带有空数据卷的容器 dbdata2。

# docker run -v /dbdata --name dbdata2 ubuntu /bin/bash 然后创建另一个容器,挂载 dbdata2 容器卷中的数据卷,并使用 untar 解压备份文件到挂载的容器卷中。

# docker run --volumes-from dbdata2 -v /data:/backup busybox tar xvf /backup/backup.tar.gz 为了查看/验证恢复的数据,可以再启动一个容器挂载同样的容器卷来查看

# docker run --volumes-from dbdata2 busybox /bin/ls /dbdata

删除数据

如果删除了挂载的容器(db1 和 db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用 docker rm -v 命令来指定同时删除关联的容器。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java Edge

ZooKeeper分布式入门实战(二)-ZooKeeper基本数据模型1 zk数据模型介绍2 zk客户端连接关闭服务端,查看znode3 zookeeper的作用体现

511
来自专栏云计算与大数据

研发:重新认识shell io 重定向

默认情况下始终有3个"文件"处于打开状态, stdin(键盘), stdout(屏幕), 和stderr(错误消息输出到屏幕上). 这3个文件和其他...

673
来自专栏IT笔记

Git提交错误时如何删除Git提交记录

有时候我们可能会遇到git提交错误的情况,比如提交了敏感的信息或者提交了错误的版本,这个时候我们想将提交到代码库的记录删除。

1103
来自专栏全华班

认识工作流- 从头搭建Activiti开发环境

阅读文本大概需要 5 分钟。 我们前文中介绍了Activiti,知道它是目前市面上比较流行的工作流框架。今天咱们一起从头开始搭建一下Activiti的开...

3676
来自专栏九彩拼盘的叨叨叨

git-flow 简介

git-flow 定义了一个围绕项目发布的严格分支模型,用于管理多人协作的大型项目,实现高效的协作。(ps:文末有练习的链接)

542
来自专栏流柯技术学院

adb 常用命令总结

702
来自专栏游戏杂谈

开发环境切换之清空DNS缓存

开发的时候有时需要来回切换环境,这样的话,有时host文件即使是已经修改过了,但还是指向了之前的域名,须将浏览器全部关闭,然后等一段时间,太麻烦了

461
来自专栏Java编程技术

Spring之配置项管理小结

正如webx框架文档里面所说,在一个应用中我们总是会遇到一些参数,例如:数据库服务器IP地址、端口、用户名;这些参数有一个共性,那就是:它们和应用的逻辑无关,只...

541
来自专栏云计算教程系列

如何在Ubuntu上安装Chef服务器,工作站和客户端

随着组织结构的增长以及管理环境所需组件的扩展,各个服务器和服务可能变得难以管理。配置管理解决方案旨在简化系统和基础架构的管理。配置管理工具的目标是允许您将基础架...

833
来自专栏CDA数据分析师

如何发布一个Python命令行工具

上次写的一个终端里面斗鱼TV弹幕Python版本和Ruby版本,并且发布到PIP和RubyGems上面.在发布PIP包的时候,居然Google不到一篇可以非常好...

2448

扫码关注云+社区