一、简介
 
Docker数据卷(volume)机制。volume是存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并为数据的共享与持久化提供便利。
1)volume在容器创建时就会初始化,在容器运行时就可以使用其中的文件
2)volume能在不同的容器之间共享和重用
3)对volume中数据的操作会马上生效
4)对volume中数据的操作不会影响到镜像本身
5)volume的生存周期独立于容器的生存周期,即使删除容器,volume仍然会存在,没有任何容器使用的volume也不会被删除
 
 
二、使用
 
1、创建volume
 
1)创建colume,命名为volume_first
 
docker volume create --name volume_first

2)在容器启动docker run或者创建新容器docker create时,也可以使用-v标签为容器添加volume

如:docker在启动时随机命名创建一个volume,并挂载在容器的/data下
 
docker run -d -v /docker/data docker.io/centos /bin/bash

 
Docker在创建volume的时候会在宿主机/var/lib/docker/volume/中创建一个以volume ID为名的目录,并将volume中的内容存储在名为_data的目录下
 
 
 
3)创建一个指定名字的volume,test_volume挂载到容器的/docker/data目录下
 
docker run -d -v test_volume:/docker/data docker.io/centos /bin/bash

 
 
 
4)查看本地的volume,可以看到我们刚刚创建的,第一个是以容器命名,第二个是以指定命名的方式命名
 
 
 
 
2、挂载volume
 
在使用docker run或docker create创建新容器时,可以使用-v标签为容器添加volume。用户可以将自行创建或由Docker创建的volume挂载到容器中,也可以将宿主机上的目录或者文件作为volume挂载到容器中
 
总结一下几种方式:上面已经用到了
1)第一种方式
docker volume create --name volume_first
docker run -d -v volume_first:/data docker.io/centos /bin/bash
 
2)第二种方式
docker run -d -v /data docker.io/centos /bin/bash
 
3)第三种方式,将宿主机上的目录挂载到容器中
docker run -d -v /docker/data:/data docker.io/centos
 
将宿主机的/docker/data文件夹作为一个volume挂载到容器中的/data。目录必须使用绝对路径,如果宿主机中不存在/docker/data目录,将创建一个新的目录。在/docker/data目录中的所有文件或文件夹可以在容器的/data目录下被访问。如果镜像中原本存在/data文件夹,该目录下的所有内容将被隐藏,以保持与宿主机中的目录一致。
 
4)在volume挂载时,还可以指定volume的权限,如只读ro,也可以在volume挂载时使用z和Z来指定该volume是否可以共享。Docekr中默认的是z,及共享volume;使用Z表示私有该数据卷;使用多个-v标签为容器添加多个volume
 
docker run -d -v /docker/data:/data:ro -v /docker/data2:/data2:z docker.io/centos
 
 
3、使用Dockerfile添加volume
 
1)vim Dockerfile
FROM docker.io/centos
VOLUME /test_data
 
2)制作成镜像
docker build -t volume_test .

 
3)启动镜像得到容器
docker run -d 7a5efba9248c

 
4)查看该容器的volume信息
docker inspect 972d67800f6130406290 |grep -A  Mounts

 
可以看到是挂载成功的
 
5)使用VOLUME指令添加多个volume
 
VOLUME ["/data1","/data2"]
 
6)与使用docker run -v不同的是,VOLUME指令不能挂载主机中指定的文件夹,这是为了保证Dockerfile的可移植性,因为不能保证所有的宿主机都有对应的文件夹
 
 
7、Dockerfile的使用Volume的注意事项
 
如:vim Dockerfile
FROM docker.io/centos
RUN useradd lile
VOLUME /data
RUN mkdir /data && touch /data/file
RUN chown -R lile:lile /data
 
构建镜像:

docker build -t volume_test .
 
启动容器:

docker run -d 833a592f9d3f
 
查看该容器的卷信息:

docker inspect 95b3bf6ef72b15304f |grep -A  Mounts
 
 
查看挂载出来的文件是否授权并创建了一个文件,发现并没有
 
 
这是因为在Dockerfile中使用VOLUME指令之后的代码,如果尝试对这个volume进行更改,这些修改都不会生效。这是因为Dockerfile中除了From指令的每一行都是基于上一行生成的临时镜像运行一个容器,执行一条指令并执行类似docker commit的命令得到一个新的镜像,这条类似docker commit
命令不会对挂载的volumn进行保存
 
解决办法:
vim Dockerfile文件改为如下
FROM docker.io/centos
RUN useradd lile
VOLUME /data
CMD touch /data/file && chown -R lile:lile /data
 
CMD指令和ENTRYPOINT指令是在容器启动时执行。
 
8、共享volume
 
在使用docker run或docker create创建新容器时,可以使用--volumes-from标签使得容器与已有的容器共享volume
 
实验:
 
1)基于docker.io/centos镜像启动一个名叫container1的容器,并在这个容器上创建名为test1的数据卷挂载在容器的/data目录
 
docker run -d --name container1 -v test1:/data docker.io/centos
 
 
 
2)创建容器2,此容器与容器1共享数据卷test1,可以从该容器考到挂载信息确实是容器一的

 
docker run -d --name container2 --volumes-from container1 docker.io/centos

3)与多个容器共享volumn
 
docker run -d --name container1 -v test2:/data docker.io/centos
docker run -d --name container2 -v test2:/log docker.io/centos
docker run -d --name container3 --volumes-from container1 --volumes-from container2 docker.io/centos
 
得到的结果如下:
 
 
 
 
9、删除指定的volume
 
1)方法一 删除volume
docker volume rm first_volume
 
2)方法二 删除容器
docker rm -v container_name
 
10、备份、恢复和迁移volumn
 
备份:临时起一个容器与容器一共享数据卷,并且把当前路径挂载到容器的/backup ,这样打包后的文件便在当前路径了
docker run -d --volumns-from container1 -v $(pwd):/backup docker.io/centos tar cvf /backup/data.tar /data
 
恢复:
docker run -d --volumes-from a5e77a6d6e0f854eb -v $(pwd):/backup docker.io/centos tar xvf /backup/data.tar -C /

参考:《Docker容器与容器云》

Docker之数据卷Volume(七)的更多相关文章

  1. Docker容器数据卷(七)

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

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

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

  3. Docker数据卷Volume实现文件共享、数据迁移备份(三)--技术流ken

    前言 前面已经写了两篇关于docker的博文了,在工作中有关docker的基本操作已经基本讲解完了.相信现在大家已经能够熟练配置docker以及使用docker来创建镜像以及容器了.本篇博客将会讲解如 ...

  4. docker——数据卷volume:文件共享

    volume——如何让容器中的一个目录与宿主机的一个目录进行绑定,实现容器与宿主机之间的文件共享? 数据卷volume功能特性 数据卷:是一个可供一个或多个容器使用的特殊目录,实现让容器中的一个目录和 ...

  5. Docker数据卷Volume实现文件共享、数据迁移备份(三)

    数据卷volume功能特性 数据卷 是一个可供一个或多个容器使用的特殊目录,实现让容器中的一个目录和宿主机中的一个文件或者目录进行绑定.数据卷 是被设计用来持久化数据的对于数据卷你可以理解为NFS中的 ...

  6. docker学习5--docker数据卷(volume)

    https://blog.csdn.net/dream_broken/article/details/52314993 1.什么是数据卷volume 为了了解什么是Docker Volume,首先我们 ...

  7. docker数据卷(volume)

    1.什么是数据卷volume https://blog.csdn.net/dream_broken/article/details/52314993 为了了解什么是Docker Volume,首先我们 ...

  8. 你必须知道的Docker数据卷(Volume)

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.将Docker数据挂载到容器 在Docker中,要想实现数据的持久化(所谓 ...

  9. docker基础---数据卷volumes

    1.数据卷 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性: 数据卷可以在容器之间共享和重用 对数据卷的修改会立马生效 对数据卷的更新,不会影响镜像 卷会一直存在 ...

随机推荐

  1. 正则化,L1,L2

    机器学习中在为了减小loss时可能会带来模型容量增加,即参数增加的情况,这会导致模型在训练集上表现良好,在测试集上效果不好,也就是出现了过拟合现象.为了减小这种现象带来的影响,采用正则化.正则化,在减 ...

  2. laravel 路由的配置

  3. MVC实战之排球计分(五)—— Controller的设计与实现

    控制器 控制器接受用户的输入并调用模型和视图去完成用户的需求.所以当单击Web页面中的超链接和发送HTML表单时, 控制器本身不输出任何东西和做任何处理.它只是接收请求并决定调用哪个模型构件去处理请求 ...

  4. 第5天(半天)【shell编程初步、grep及正则表达式】

    第5天(半天)[shell编程初步.grep及正则表达式] shell编程初步(01)_recv shell脚本:文本文件 #!:/bin/bash #!:/usr/bin/python #!:/us ...

  5. 基于JMH的Benchmark解决方案

    原始Benchmark做法 在设计新框架的时候,往往需要评估待接入的组件的性能,这个时候我们可能会利用UnitTest来进行,写一个方法,然后在循环里面跑,利用System.CurrentTimeMi ...

  6. ID绘图工具的使用5.29

    1.按住ALT拖动矩形工具,以中心绘制矩形.  绘制矩形的过程中,按住空格键可以调整矩形的位置. 2选择矩形工具,单击,可以精确输入尺寸. 3“窗口‘”信息“面板调出来.这样在绘制的时候可以边绘制边看 ...

  7. 201621123075 Week03-面向对象入门

    1.本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识点组织起来.请使用工具画出本周学习到的知识点及知识点之间的联系.步骤如下: 1.1 写出你认 ...

  8. django+celery +rabbitmq

    celery是一个python的分布式任务队列框架,支持 分布的 机器/进程/线程的任务调度.采用典型的生产者-消费者模型 包含三部分:1. 队列 broker :可使用redis ,rabbitmq ...

  9. inode 与black 特点与简介

    inodo为索引节点, 存放文件属性的信息(实际文件位置与容量信息 /black文件属性) 作用在格式化文件系统时候产生 创建一个文件就占用一个inode 数字相同为硬链接 black为实际数据/内容 ...

  10. L1-058 6翻了

    “666”是一种网络用语,大概是表示某人很厉害.我们很佩服的意思.最近又衍生出另一个数字“9”,意思是“6翻了”,实在太厉害的意思.如果你以为这就是厉害的最高境界,那就错啦 —— 目前的最高境界是数字 ...