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. spring报错

    C:\Users\dell\.jdks\openjdk-19.0.2\bin\java.exe "-javaagent:E:\idea图片\IntelliJ IDEA 2022.2.3\li ...

  2. 5分钟安装Kubernetes+带你轻松安装istio服务网格指南

    上次我跟大家简单介绍了一下Kubernetes的各个组件及其含义,本期本来计划带领大家一起学习一些常用命令,但我认为这种方式可能无法达到学习的效果.有可能你们会直接忘记,甚至可能没有兴趣去学.我也理解 ...

  3. All in One, 快速搭建端到端可观测体系

    本文分享自华为云社区<All in One, 快速搭建端到端可观测体系>,作者:王磊. 随着云原生技术的应用,可观测成为云服务的主角,应用程序的部署密度及变化频率较传统环境有着巨大的变化, ...

  4. NTP时间服务器优先级介绍

    先思考一个问题:当一个客户端配置向多个NTP时间服务器校时,此时客户端优先向哪个时间服务器同步时间呢? 一个完整的NTP校时请求分四步: 1.客户端向服务器发起校时请求 2.服务器收到客户端发送的校时 ...

  5. Java多线程学习(Day02)

    目录 线程简介 线程实现(重点) 线程状态 线程同步(重点) 线程通信问题 线程实现: 方式一:继承Thread类 /** * TODO * @author 清莲孤舟 * @CreateDate 20 ...

  6. svelte的一些基础demo

    脚手架 Vite:vite是集成了svelte,初始化的时候选择svelte就行了. npm init vite SvelteKit:底层基于vite的更上层框架,类似于nextjs. npm cre ...

  7. C++ Qt开发:SqlRelationalTable关联表组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍SqlRela ...

  8. Linux的发行版及其描述

    Linux的十种发行版及其描述 linux其中十种发行版本为Debian.Gentoo.Ubuntu.Damn Vulnerable Linux.红帽企业级Linux. CentOS.Fedora.K ...

  9. 从标准到开发,解读基于MOF的应用模型管理

    摘要:为了打破技术与业务的壁垒,搭建技术与业务的桥梁,因此基于如下流程实现应用业务模型管理 ROMA ABM. 在数字经济时代,数据正在成为企业极其重要的战略性资产.在政府方面,数据第一次作为新型生产 ...

  10. 云小课|基于华为云WAF的日志运维分析,构筑设备安全的城墙

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