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. idea的maven

    在我学习springMvc时一直报一个错,后来发现是maven一直出错导致的 这个maven是idea系统自己的maven,用着用着发现依赖项不见了,怎么导入坐标都导不进去,导致在创建maven项目时 ...

  2. 云端开炉,线上训练,Bert-vits2-v2.2云端线上训练和推理实践(基于GoogleColab)

    假如我们一定要说深度学习入门会有一定的门槛,那么设备成本是一个无法避开的话题.深度学习模型通常需要大量的计算资源来进行训练和推理.较大规模的深度学习模型和复杂的数据集需要更高的计算能力才能进行有效的训 ...

  3. Linux-LVM 磁盘扩容

    LVM技术详解:视频1.视频2.视频3 安装lvm2后才支持如下命令 yum install -y lvm2 序号 功能 PV物理卷命令 VG卷组命令 LV逻辑卷命令 01 扫描功能 pvscan v ...

  4. 5s!用浏览器打造一个开箱即用的Linux系统

    做为Linux系统管理员.或者是系统运维工程师,肯定会在工作遇到这样的需求:需要开发环境.测试环境.准生产环境等等环境,有时候建一个环境费时间不说,还容易出各种错误,好不容易建好了,可能还用不了几天. ...

  5. Fpga开发笔记(一):高云FPGA芯片介绍,入手开发板套件、核心板和底板介绍

    前言   FPGA作为一种逻辑芯片,硬件架构独特,具有并行性.低延时性和灵活性等特性,应用领域广泛.  FPGA市场主要玩家是英特尔.AMD.莱迪思.Microchip.Achronix等:国内厂商包 ...

  6. Java 在PDF中绘制形状(基于Spire.Cloud.SDK for Java)

    Spire.Cloud.SDK for Java提供了pdfPathApi接口可用于在PDF文档中绘制形状(或图形),如绘制线条形状drawLine().绘制矩形形状drawRectanglef(), ...

  7. MySQL进阶篇:详解SQL性能分析

    MySQL进阶篇:第三章_SQL性能分析 SQL执行频率 MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信息.通过如下指令,可以查 ...

  8. 【华为云技术分享】云容器引擎 CCE权限管理实践

    随着容器化的快速发展,大数据原有的分布式任务调度模式,正在被基于Kubernetes的技术架构所取代.CCE云容器引擎是华为云推出的支持Kubernetes社区原生应用和工具,应用级自动弹性伸缩,自动 ...

  9. 技术解读丨目标检测之RepPoints系列算法

    摘要:本文对anchor-free的目标检测RepPoints系列算法进行梳理,具体包含RepPoints, RepPoints V2, Dense RepPoints. 背景介绍 近两年来,anch ...

  10. 云图说 | 分布式缓存服务DCS—站在开源Redis前辈的肩膀上,扬帆起航

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:DCS基于开源Re ...