1. docker volume 简介

文章 介绍了 docker image,它由一系列只读层构成,通过 docker image 可以提高镜像构建,存储和分发的效率,节省时间和存储空间。然而 docker image 还是存在一些问题,如下:

  • 多个容器之间的数据无法共享。
  • 当删除容器时,容器产生的数据将丢失。

基于这几点 Docker 引入了 volume 机制。 volume 是存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机上存在。volume 机制的主要优点如下:

  • volume 能在不同容器间共享数据。
  • volume 的生存周期独立于容器,删除容器,volume 依然存在。
  • volume 中数据的操作不会影响到镜像。

2. 创建 volume

创建 volume,将 volume attach 到容器中,删除容器,查看 volume 的使用情况。

查看创建 volume 使用的驱动:

[root@k8s-master-node-1 centos]# docker info | grep -i volume
Volume: local

创建 volume:

[root@k8s-master-node-1 centos]# docker volume create chunqiu
chunqiu
[root@k8s-master-node-1 centos]# docker volume inspect chunqiu
[
{
"CreatedAt": "2021-05-10T09:09:49Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/chunqiu/_data",
"Name": "chunqiu",
"Options": {},
"Scope": "local"
}
]

volume 在宿主机上的目录 (Mountpoint) 是 /var/lib/docker/volumes/<volume_name>/_data。将 volume attach 到容器 ubuntu 上:

[root@k8s-master-node-1 centos]# docker run -it -v chunqiu:/data --name=ubuntu ubuntu /bin/bash
root@8c4611b025f6:/# ls /data/
root@8c4611b025f6:/#

使用 -v 选项将 volume attach 到容器内,并指定容器的目录为 /data。写文件到 data 目录:

/* 容器内写文件 */
root@8c4611b025f6:/# cd data/
root@8c4611b025f6:/data# touch chunqiu [root@k8s-master-node-1 _data]# ls -l /var/lib/docker/volumes/chunqiu/_data/
total 0
-rw-r--r-- 1 root root 0 May 10 09:44 chunqiu /* 容器外写文件 */
[root@k8s-master-node-1 _data]# touch handsomeBoy root@8c4611b025f6:/data# ls -l
total 0
-rw-r--r-- 1 root root 0 May 10 09:44 chunqiu
-rw-r--r-- 1 root root 0 May 10 09:49 handsomeBoy

容器和宿主机上目录建立映射。删除容器,查看 volume 是否存在:

[root@k8s-master-node-1 _data]# docker rm ubuntu
ubuntu [root@k8s-master-node-1 _data]# ls -l
total 0
-rw-r--r-- 1 root root 0 May 10 09:44 chunqiu
-rw-r--r-- 1 root root 0 May 10 09:49 handsomeBoy

删除容器 volume 依然存在。

3. volume 与 image

探索 volume 与 image 的关系,volume 映射的文件/文件夹会反映在“读写层”,和静态的 image 没有关系。当 volume 映射的文件/文件夹和 image 同名时,image 中内容将被隐藏,从而保持 volume 和宿主机上文件/文件夹的一致性。

创建 volume 映射到容器内的 /home 目录,查看 home 目录下文件变化情况:

[root@k8s-master-node-1 _data]# docker run -it b9fd190d76e0 /bin/bash
root@c536d00399fa:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@c536d00399fa:/# ls home/
demo
root@c536d00399fa:/home# exit [root@k8s-master-node-1 _data]# docker run -it -v chunqiu:/home b9fd190d76e0 /bin/bash
root@faebe07c5405:/# cd home/
root@faebe07c5405:/home# ls
chunqiu handsomeBoy

home 目录下的 demo 文件被隐藏,取而代之的是宿主机上 volume 的 MountPoint 下的文件。

思考:如果取代的是 /etc 目录会怎么样?

4. 容器间共享目录

volume 能在不同容器间共享数据,新建一个容器使它和 ubuntu 共享 volume chunqiu:

[root@k8s-master-node-1 centos]# docker run -it --volumes-from ubuntu ubuntu /bin/bash
root@a66c276b1954:/# ls data/
chunqiu handsomeBoy

5. docker commit

将容器 commit 为镜像,容器内的 volume 数据会保存到镜像中吗?做个小实验如下:

[root@k8s-master-node-1 centos]# docker commit ubuntu
sha256:e938f5251682f9b48ce344f1372d39b2ef6b7b4b6f8160afa38fe94492de158e
[root@k8s-master-node-1 centos]# docker image ls | grep e938
<none> <none> e938f5251682 12 seconds ago 72.7MB [root@k8s-master-node-1 centos]# docker run -it e938f5251682 /bin/bash
root@11f74c3587e1:/# ls
bin boot data dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@11f74c3587e1:/# ls data/
root@11f74c3587e1:/data#

可以看到,data 目录下并没有 volume 的文件,这是因为 docker commit 不会对挂载的 volume 进行保存。这也说明了为什么在 dockerfile 中这么写找不到文件 file:

FROM ubuntu
RUN useradd foo
VOLUME /data
RUN touch /data/file
RUN chown -R foo:foo /data

6. docker volume 原理

docker 创建 volume 的过程实际上是在 mount namespace 添加做 mount 操作的过程,具体可看这里了解更多,这里就不做赘述啦~

理解 docker volume的更多相关文章

  1. 用一个实际例子理解Docker volume工作原理

    要了解Docker Volume,首先我们需要理解Docker文件系统的工作原理.Docker镜像是由多个文件系统的只读层叠加而成.当一个容器通过命令docker run启动时,Docker会加载只读 ...

  2. 深入理解Docker Volume(一)

    想要了解Docker Volume,首先我们需要知道Docker的文件系统是如何工作的.Docker镜像是由多个文件系统(只读层)叠加而成.当我们启动一个容器的时候,Docker会加载镜像层并在其上添 ...

  3. 深入理解Docker Volume(二)

      一开始,认为Volume是用来持久化的,但是这实际上不对,因为认为Volume是用来持久化的同学一定是认为容器无法持久化,所以有了Volume来帮助容器持久化,事实上,容器会一直存在,除非你删除他 ...

  4. 理解OpenShift(5):从 Docker Volume 到 OpenShift Persistent Volume

    理解OpenShift(1):网络之 Router 和 Route 理解OpenShift(2):网络之 DNS(域名服务) 理解OpenShift(3):网络之 SDN 理解OpenShift(4) ...

  5. docker挂载volume的用户权限问题,理解docker容器的uid

    docker挂载volume的用户权限问题,理解docker容器的uid 在刚开始使用docker volume挂载数据卷的时候,经常出现没有权限的问题. 这里通过遇到的问题来理解docker容器用户 ...

  6. 理解Docker(8):Docker 存储之卷(Volume)

    (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 ...

  7. 什么是Docker Volume?

    摘要:Docker Volume,通常翻译为数据卷,用于保存持久化数据.当我们将数据库例如MySQL运行在Docker容器中时,一般将数据通过Docker Volume保存在主机上,这样即使删除MyS ...

  8. 利用Docker volume修改Nginx Docker镜像里index.html

    通过这个小例子我们可以进一步加深对Docker volume概念的理解和使用方法. 我们都知道运行基于Docker的Nginx镜像后,访问localhost能看到Nginx默认的首页,这个首页的位置是 ...

  9. 深刻理解Docker镜像大小

    都说容器大法好,可是假设没有Docker镜像,Docker该是多无趣啊. 是否还记得第一个接触Docker的时候,你从Docker Hub下拉的那个镜像呢?在那个处女镜像的基础上.你执行了容器生涯的处 ...

  10. Docker - 命令 - docker volume

    概述 docker volume 命令 背景 docker 容器的存储, 通常需要独立于镜像 docker volume 就是负责这块的命令 1. 写在 docker volume 之前 概述 doc ...

随机推荐

  1. vue-project-------(模板语法,属性绑定)

    <template> <h3>模板语法</h3> <p>{{msg}}</p> <p>{{number+1}}</p> ...

  2. NLP项目实战01--之电影评论分类

    介绍: 欢迎来到本篇文章!在这里,我们将探讨一个常见而重要的自然语言处理任务--文本分类.具体而言,我们将关注情感分析任务,即通过分析电影评论的情感来判断评论是正面的.负面的. 展示: 训练展示如下: ...

  3. 9 个让你的 Python 代码更快的小技巧

    哈喽大家好,我是咸鱼 我们经常听到 "Python 太慢了","Python 性能不行"这样的观点.但是,只要掌握一些编程技巧,就能大幅提升 Python 的运 ...

  4. jpa整合mybatis模板解析、hibernate整合mybatis模板解析

    jpa整合mybatis模板解析.hibernate整合mybatis模板解析 jpa是hibernate的封装,主要用于spring全家桶套餐. hibernate难以编写复杂的SQL.例如一个订单 ...

  5. Kubernetes Service 中的 external-traffic-policy 是什么?

    [摘要] external-traffic-policy,顾名思义"外部流量策略",那这个配置有什么作用呢?以及external是指什么东西的外部呢,集群.节点.Pod?今天我们就 ...

  6. MongoDB经典故障系列六:CPU利用率太高怎么办?

    每逢电商大促,全民狂欢,但热闹是属于疯狂剁手的人们.而开发者们有的缺是"高流量.高访问.高并发"三高下带来的种种问题.为了应对大促期间的高I/O情况,企业会选择MongoDB云数据 ...

  7. 一文带你解读Volcano架构设计与原理

    摘要:Volcano主要是基于Kubernetes做的一个批处理系统,希望上层的HPC.中间层大数据的应用以及最下面一层AI能够在统一Kubernetes上面运行的更高效. Volcano产生的背景 ...

  8. 你眼中的程序员 VS 程序员眼中的自己,是时候打破代沟了

    摘要:修电脑?格子衫?脱发?程序员被误解了怎么办?如何一句话向父母说明白你的工作? 有人说,你们程序员工作赚钱真简单,电脑上按按键盘就行了,一点也不辛苦. 有人说,程序员不懂生活,就知道天天对着电脑. ...

  9. 保姆级带你深入阅读NAS-BERT

    摘要:本文用权重共享的one-shot的NAS方式对BERT做NAS搜索. 本文分享自华为云社区<[NAS论文][Transformer][预训练模型]精读NAS-BERT>,作者:苏道 ...

  10. 教你如何用Keras搭建分类神经网络

    摘要:本文主要通过Keras实现了一个分类学习的案例,并详细介绍了MNIST手写体识别数据集. 本文分享自华为云社区<[Python人工智能] 十七.Keras搭建分类神经网络及MNIST数字图 ...