一.数据卷的使用

有时候需要使用数据库,但是又希望它的数据能保存在本地,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 命令来指定同时删除关联的容器。

相关推荐

Docker 使用指南 (三)—— 网络配置

Docker 使用指南 (五)—— Dockerfile 详解


此文已由作者授权腾讯云技术社区发布,转载请注明文章出处,获取更多云计算技术干货,可请前往腾讯云技术社区

欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~

Docker 使用指南 (四)—— 数据卷的使用的更多相关文章

  1. Docker Kubernetes Volume 本地数据卷

    Docker Kubernetes Volume 本地数据卷 emptyDir 当Pod分配到Node时,首先创建一个空卷,并挂载到Pod中的容器. Pod中的容器可以读取和写入卷中的文件. 当Pod ...

  2. Docker Kubernetes Volume 网络数据卷

    Docker Kubernetes Volume 网络数据卷 由于支持网络数据卷众多 今天只拿nfs作为案例. 支持网络数据卷 nfs iscsi glusterfs awsElasticBlockS ...

  3. 基于Ceph分布式集群实现docker跨主机共享数据卷

    上篇文章介绍了如何使用docker部署Ceph分布式存储集群,本篇在此基础之上,介绍如何基于Ceph分布式存储集群实现docker跨主机共享数据卷. 1.环境准备 在原来的环境基础之上,新增一台cen ...

  4. 在docker容器下利用数据卷实现在删除了mysql容器或者镜像的情况下恢复数据

    当把mysql容器销毁,在新建一个容器,进行之前的数据恢复. 因为之前建立了数据卷,那么现在就可以利用这个数据卷进行数据恢复. 使用docker volume create volume_name命令 ...

  5. Docker:网络及数据卷设置 [四]

    一.Docker网络设置 默认情况下,docker会创建一个桥接网卡[docker 0],docker有2种映射方式,一种是随机映射,一种是指定映射 提示:生产场景一般不使用随机映射,但是随机映射的好 ...

  6. Docker 安装mysql容器数据卷挂载到宿主机

    环境 Centos:7 Docker: 17.05-ce Mysql: 5.7 1. Mysql外部数据和配置文件路径 msyql配置文件路径:/etc/mysql mysql数据卷路径:/var/l ...

  7. Docker容器数据管理(数据卷&数据卷容器)

    一:前言 在Docker容器的实际使用中,经常会遇到容器的数据持久化,容器之间的数据共享等问题,通常我们有两种解决方案: 1)数据卷(Data Volumes):就是将容器内数据直接映射到本地主机环境 ...

  8. docker系列之六容器数据卷

    docker之容器数据卷 一.容器数据卷 docker容器运行的时候,会产生一系列的文件,那么我们希望容器产生的数据能提供给其他的容器使用,也就是说怎么实现容器间的数据的共享呢?这就需要用到我们所提到 ...

  9. docker系列五之数据卷(volumn)

    docker数据卷(volumn) 一. 为什么需要数据卷 docker镜像是由多个文件系统(只读层)叠加而成,当我们启动一个容器的时候,docker的服务端会加载镜像的只读层,并在最顶层创建一个可读 ...

随机推荐

  1. IO的构造方法

    package com.file; /* File的构造方法: File(String pathname); File(File parent,String child); File(String p ...

  2. javascript运行机制详解: 再谈Event Loop(转)

    作者: 阮一峰 日期: 2014年10月 8日 一年前,我写了一篇<什么是 Event Loop?>,谈了我对Event Loop的理解. 上个月,我偶然看到了Philip Roberts ...

  3. Git本地操作相关介绍

    本地使用git时遇到问题及解决方案总结: 1.git push origin master 后,终端上出现错误信息: push失败,原因多半是因为github上远程仓库中有Reademe.md文件 解 ...

  4. Jenkins添加用户

    新建用户 Jenkins刚开始的界面是允许访客进行所有操作的,这时Jenkins是有安全隐患的,也不容易去管理.这时,我们需要管理Jenkins的权限,对它的权限进行设置.关于Jenkins权限设置的 ...

  5. Pycharm安装及遇到的问题

    趁寒假想自学一下python语言,有人推荐eclipse+pydev但是因为java编程用了eclipse,不太想一个IDE用于多种语言开发(个人喜好),于是就下载了Pycharm,之间安装了也遇到了 ...

  6. testNG实现test失败后重复执行,

    test失败自动执行大大提高测试结果的准确性, 1.修改testNG源码实现test失败自动执行, 首先获取testng的源码, 获取源代码,构建过程: $ git clone git://githu ...

  7. 如何居中div?如何居中一个浮动元素?

    如何居中div? 给div设置一个宽度,然后添加margin:0 auto属性 div{ width:200px; margin:0 auto; } 如何居中一个浮动元素? <!DOCTYPE ...

  8. Java Web(五) JSP详解(四大作用域九大内置对象等)

    前面讲解了Servlet,了解了Servlet的继承结构,生命周期等,并且在其中的ServletConfig和ServletContext对象有了一些比较详细的了解,但是我们会发现在Servlet中编 ...

  9. linux下常用语言的语法检查插件整理

    linux下常用语言的语法检查插件 可以结合vim语法检查插件syntastic使用,具体请参考syntastic使用说明 如php,sql,json,css,js,html,shell,c等语法插件 ...

  10. [翻译]现代java开发指南 第二部分

    现代java开发指南 第二部分 第二部分:部署.监控 & 管理,性能分析和基准测试 第一部分,第二部分 =================== 欢迎来到现代 Java 开发指南第二部分.在第一 ...