卷(Volume)是容器中的一个数据挂载点,卷可以绕过联合文件系统,从而为Docker 提供持久数据,所提供的数据还可以在宿主机-容器或多个容器之间共享。通过卷,我们可以可以使修改数据直接生效,而不必重新构建镜像。

  1. 数据卷

  2. 数据卷容器
  3. 备份、恢复与迁移数据卷

1. 数据卷

数据卷是一个可以绕过联合文件系统的,专门指定的可在一或多个容器间共享目录。卷为提供为持久化或共享数据提供了一些有用的特性

数据卷设计的初哀是提供持久化数据,而与容器的生命周期无关。因此,在删除容器时,Docker不会自动删除卷,直到没有容器再引用。

1.1 添加数据卷

可以在docker createdocker create命令创建容器时,通过-v参数为容器添加数据卷。-v参数参数可以多次使用,以添加多个数据卷。

如,可以像下面这样为容器添加一个卷:

$ sudo docker run -t -i -v /home/test --name test itbilu/test /bin/bash

这样就会在容器内/webapp位置创建一个卷。

除了在创建容器时添加数据卷外,还可以通过Dockerfile文件中通过Volume指令添加,Volume可以多次使用以添加多个数据卷。

说明:本文中使用的示例镜像(itbilu/test)通过以下Dockerfile文件创建:

# Version: 0.0.3
FROM ubuntu:16.04
MAINTAINER 何民三 "cn.liuht@gmail.com"
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'Hello World, 我是个容器' \
> /var/www/html/index.html
RUN mkdir /home/itbilu/
ENV ITBILU_PATH /home/itbilu/
VOLUME [$ITBILU_PATH]
EXPOSE 80

1.2 卷位置

添加卷后,可以通过docker inspect来查看数据卷在容器中的位置:

$ sudo docker inspect test

docker inspect可以用来查看容器或镜像的详细配置信息。可以在容器的Mounts节点下,查看容器的卷信息:

...
"Mounts": [{
"Type": "volume",
"Name": "5f869c580c06e6079b0de2c5ce682c1c9467286c76b506703d87bf11d1271c24",
"Source": "/var/lib/docker/volumes/5f869c580c06e6079b0de2c5ce682c1c9467286c76b506703d87bf11d1271c24/_data",
"Destination": "/home/test",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "e4fd6c3a91ba2e03b14cf174c2023f366abbe9f2f73ca07e6bac223f68e47773",
"Source": "/var/lib/docker/volumes/e4fd6c3a91ba2e03b14cf174c2023f366abbe9f2f73ca07e6bac223f68e47773/_data",
"Destination": "[/home/itbilu/]",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}],
...

在以上示例中,有两个挂载卷,一个是在docker run创建容器时创建的,而另一个是在创建运行容器镜像的Dockerfile文件中通过VOLUME指令创建。其中,Source表示宿主机源文件位置,Destination表示数据卷在容器中的挂载位置,而RW表示卷是否可读/写。

1.3 挂载本地数据到容器数据卷

在前面示例中,我们运行容器时并没有指定要挂载到容器中数据卷的本地目录,所在Docker使用一个默认数据目录。-v参数除了可以在容器中创建数据卷外,还可以将宿主机中的目录挂载到容器中的数据卷。

如,运行容器,并将本地的~/code/itbilu目录挂载到容器的/home/itbilu数据卷上:

$ sudo docker run -t -i -v ~/code/itbilu:/home/itbilu --name test itbilu/test /bin/bas

注意:挂载本地目录到容器内的挂载目录时,如果容器内的数据卷中已经存在数据,那么本地内容将与数据卷中的数据重叠,而不会删除数据。

其中,容器目录必须使用绝对路径,而本地目录可以使用绝对路径或其它形式。

挂载共享存储

除了可以载挂本地目录到容器数据卷外,一些Docker卷插件让你可以挂载共享存储到容器的数据卷,如:iSCSINFSFC。使用共享卷的好处是它们是独立于主机的,这意味着,只要有访问共享存储权限,并安装插件,就可以在任何容器上启动卷。详细参考:

挂载本地文件到容器数据卷

-v参数不仅可挂载目录,还可以挂载单个文件。如:

$ sudo docker run -t -i -v ~/.bash_history:/root/.bash_history \
--name test itbilu/test /bin/bash

以上会把本地的~/.bash_history文件挂载到新容器中,这样你就可以在容器内访问宿主上的bash历史记录。

2. 数据卷容器

如果你有一些要在容器之间共享的持久性数据,或者希望在非持久容器中使用,那么最好创建一个命名的数据卷容器,然后从其挂载数据。

接下来,我们创建一个新的命名的共享容器。这个容器不运行一个应用程序,它利用training/postgres镜像在所有的容器之间创建了一个共享层,以节省磁盘空间。

$ sudo docker create -v /dbdata --name dbstore training/postgres /bin/true

注意:training/postgres是Docker 官方文档中提供的一个镜像,本文拿来直接使用了。

使用数据卷容器

创建数据卷容器后,我们可以通过--volumes-from选项,将一个数据容器挂载到其它容器:

$ sudo docker run -d --volumes-from dbstore --name db1 training/postgres

也可以在多个容器间共享。如,挂载到另一个容器:

$ sudo docker run -d --volumes-from dbstore --name db2 training/postgres

这时,如果training/postgres镜像内有名/dbdata的目录,则会从dbstore容器挂载卷,并会隐藏training/postgres镜像中/dbdata下的文件。最终只有dbstore容器中的文件可见。

还可以扩展挂载链,从已经存在的dbstore容器(如:db1db2)来挂载卷:

$ sudo docker run -d --name db3 --volumes-from db1 training/postgres

这种情况下,如果移除己挂载卷的容器,无论是最初的dbstore容器,还是其后的db1db2容器,卷都不会被移除。要将卷从硬盘上移除,必须使用docker rm -v命令删除最后一个引用了该卷的容器。

3. 备份、恢复与迁移数据卷

除上述操作外,数据卷的常用操作还有数据卷备份、恢复、合并操作。以下是一些常用操作:

3.1 备份数据卷

在前面介绍数据卷容器时,我们创建了一个名为dbdata容器,并在容器中创建了一个/dbdata数据卷。接下来,可以在创建容器使用--volumes-from参数来挂载这个数据卷,并对数据进行备份:

$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

在这个操作中,我们通过ubuntu镜像创建了一个容器,创建容器时通过--volumes-from参数共享了数据卷容器中的数据,并将当前目录($(pwd))挂载到了数据卷中。容器运行后,使用tar命令对数据卷进行了备份。

命令执行结束后,容器就会停止,之后就可以在本地当前操作目录下找到所备份的数据。

3.2 备份数据卷

数据备份后,可以在创建容器恢复备份数据到容器内的数据卷中,从而实现数据的迁移。

首先,创建并运行容器并添加一个数据卷

$ sudo docker run -i -t -v /dbdata --name dbdata2 ubuntu /bin/bash

然后通过tar命令恢复备份数据:

$ sudo docker run --rm --volumes-from dbdata2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"

这样,数据就被恢复到了容器dbdata2/dbdata目录下,我们可以容器中操作和使用这些数据。

原文链接:https://itbilu.com/linux/docker/4kiHC33_G.html

Docker 容器数据卷(Data Volume)与数据管理的更多相关文章

  1. 『现学现忘』Docker基础 — 28、Docker容器数据卷介绍

    目录 1.什么是Docker容器数据卷 2.数据卷的作用 3.数据卷的使用 1.什么是Docker容器数据卷 Docker容器数据卷,即Docker Volume(卷). 当Docker容器运行的时候 ...

  2. Docker容器数据卷-Volume详解

    Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume).数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享.数据 ...

  3. Docker之数据卷(Data Volumes)操作

    目的: 前言 Docker宿主机和容器之间文件拷贝 数据卷 数据卷容器 前言 Docker 数据管理 在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行 数据共享, ...

  4. docker 12 docker容器数据卷

    数据卷概念 ♣我们知道,当我们把一个运行中的容器关闭后,容器里的数据就没有了(如果你做了docker commit操作,数据会保留到新的镜像里面).所以我们就需要用容器数据卷把容器数据进行持久化储存. ...

  5. Docker——容器数据卷

    为什么需要容器数据卷 角度:遇到问题,尝试以朴素的道理解决问题.问题复杂化,解决的方式也变得复杂 问题的提出:docker将应用和环境打包成一个镜像,但是对于容器内的数据,如果不进行外部的保存,那么当 ...

  6. Docker容器数据卷

    ⒈Docker容器中数据如何持久化? ①通过commit命令使容器反向为镜像 ②以容器数据卷的方式将数据抽离 ⒉容器数据卷的作用? ①容器数据的持久化 ②容器间继承.共享数据 ⒊能干嘛? 卷就是目录或 ...

  7. Docker容器数据卷(七)

    Docker致力于: 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的 容器之间希望有可能共享数据 Docker容器产生的数据,如果不通过docker co ...

  8. 5、docker容器数据卷: -v添加共享传递容器数据卷

    1.是什么 1.docker理念 先来看看Docker的理念:*  将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的*  容器之间希望有可能共享数据 2.保 ...

  9. docker学习笔记-04:docker容器数据卷

    一.容器数据卷是什么 1.为了保存docker容器运行时产生的数据,做数据的持久化,我们需要用到容器数据卷.因为如果不通过docker commit 生成新的镜像,那么当容器被删除时,数据自然就没有了 ...

随机推荐

  1. CentOS7出现Unit iptables.service could not be found

    CentOS7默认的防火墙不是iptables,而是firewalle. 出现此情况可能是iptables防火墙未安装. #停止firewalld服务 systemctl stop firewalld ...

  2. [PySpark] Spark SQL on a large file

    基础篇:[Spark] 03 - Spark SQL /* implement */

  3. 时间复杂度O(n)

    时间复杂度 算法分析 同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率.算法分析的目的在于选择合适算法和改进算法.一个算法的评价主要从时间复杂度和空间复杂度来考虑. 一.时间复 ...

  4. python基础知识(函数)

    创建函数 def 函数名(可以选参数): 可选参数  '''  ''' 用三引号括起来的注释  说明功能和参数信息 可选参数指定函数体  执行函数程序代码 创建一个空函数 def empty(): p ...

  5. 如何使用QTP12 UFT做功能性测试(转载)

    首先,按照本博客的安装教程走的,右键管理员运行 接下来点击继续,这个界面只需要勾选到web即可 点击ok,开始运行 进入到主界面之后,file新建一个测试. 可以修改路径等等 点击create之后,出 ...

  6. android#编写一个聊天界面

    摘自<第一行代码>——郭霖 既然是要编写一个聊天界面,那就肯定要有收到的消息和发出的消息.上一节中我们制作的message_left.9.png可以作为收到消息的背景图,那么毫无疑问你还需 ...

  7. docker笔记(2)——docker镜像操作

    操作环境:mac OS 10.14.6 docker版本:10.03.1 终端:iterm2 3.3 时间:2019年8月 docker 镜像,是运行容器的模板,通过pull操作会向指定仓库获取镜像, ...

  8. 关于bootstrap的响应式插件respond.min.js在IE8下出现:拒绝访问。respond.min.js,行: 5,列: 746报错问题

    本地在IE8浏览器下测试兼容性的时候,出现了以下的报错: 该问题在bootstrap的官网有介绍:https://v3.bootcss.com/getting-started

  9. A New 3-bit Programming Algorithm using SLC-to-TLC Migration for 8MBs High Performance TLC NAND Flash Memory

    背景 1.2012年左右的数据SLC.MLC.TLC闪存芯片的区别:SLC = Single-Level Cell ,即1bit/cell,速度快寿命长,价格超贵(约MLC 3倍以上的价格),约10万 ...

  10. _variant_t 与其他数据类型的转换

    在COM中使用的标准类Class如下所示: _bstr_t:对BSTR类型进行打包,并提供有用的操作方法: _com_error:定义抛出的error对象; _com_ptr_t:封装COM接口指针 ...