Docker从认识到实践再到底层原理(七)|Docker存储卷

news2024/11/30 2:30:13

在这里插入图片描述

前言

那么这里博主先安利一些干货满满的专栏了!

首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。

  • 高质量博客汇总

然后就是博主最近最花时间的一个专栏《Docker从认识到实践再到底层原理》希望大家多多关注!

  • Docker从认识到实践再到底层原理

第七章-Docker存储卷

1. Docker Volume引入

参考:比特就业课

1.1 什么是存储卷?

存储卷就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这就意味着,当我们在容器中的这个目录下写入数据时,容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录。在宿主机上的这个与容器形成绑定关系的目录被称作存储卷。卷的本质是文件或者目录,它可以绕过默认的联合文件系统,直接以文件或目录的形式存在于宿主机上。

宿主机的/data/web 目录与容器中的/container/data/web 目录绑定关系,然后容器中的进程向这个目录中写数据时,是直接写在宿主机的目录上的,绕过容器文件系统与宿主机的文件系统建立关联关系,使得可以在宿主机和容器内共享数据库内容,让容器直接访问宿主机中的内容,也可以宿主机向容器写入内容,容器和宿主机的数据读写是同步的。

1.2 为什么需要存储卷

1.2.1 数据丢失问题

容器按照业务类型,总体可以分为两类:

  • 无状态的(数据不需要被持久化)

  • 有状态的(数据需要被持久化)

显然,容器更擅长无状态应用。因为未持久化数据的容器根目录的生命周期与容器的生命周期一样,容器文件系统的本质是在镜像层上面创建的读写层,运行中的容器对任何文件的修改都存在于该读写层,当容器被删除时,容器中的读写层也会随之消失。虽然容器希望所有的业务都尽量保持无状态,这样容器就可以开箱即用,并且可以任意调度,但实际业务总是有各种需要数据持久化的场景,比如 MySQL、Kafka 等有状态的业务。因此为了解决有状态业务的需求,Docker 提出了卷(Volume)的概念。

1.2.2 性能问题

UnionFS 对于修改删除等,一般效率非常低,如果对一于 I/O 要求比较高的应用,如redis 在实现持化存储时,是在底层存储时的性能要求比较高。

1.2.3 宿主机和容器互访不方便

宿主机访问容器,或者容器访问要通过docker cp来完成,应用很难操作

1.2.4 容器和容器共享不方便

2. 存储卷分类

目前 Docker 提供了三种方式将数据从宿主机挂载到容器中

  • volume docker 管理卷,默认映射到宿主机的/var/lib/docker/volumes(我们改过的)目录下,只需要在容器内指定容器的挂载点是什么,而被绑定宿主机下的那个目录,是由容器引擎 daemon 自行创建一个空的目录,或者使用一个已经存在的目录,与存储卷建立存储关系,这种方式极大解脱用户在使用卷时的耦合关系,缺陷是用户无法指定哪些使用目录,临时存储比较适合;

  • bind mount 绑定数据卷,映射到宿主机指定路径下,在宿主机上的路径要人工的指定一个特定的路径,在容器中也需要指定一个特定的路径,两个已知的路径建立关联关系

  • tmpfs mount临时数据卷,映射到于宿主机内存中,一旦容器停止运行,tmpfs mounts会被移除,数据就会丢失,用于高性能的临时数据存储。

3. 管理卷 Volume

3.1 Volume 命令清单

命令功能
docker volume create创建存储卷
docker volume inspect显示存储卷详细信息
docker volume ls列出存储卷
docker volume prune清理所有无用数据卷
docker volume rm删除卷、使用中的无法删除

3.2 docker volume create

关键参数

-d, --driver :指定驱动,默认是 local
--label :指定元数据

在这里插入图片描述

直接不给任何参数,就是系统给的随机名字。

当然我们也可以查看他挂载到宿主机的哪一个目录。

[root@ALiCentos7:~]$ docker volume inspect fd8f7ab68c681a1651faff71a2da89c8b040a1bd0b58c285206e2488cfd9d306
[
    {
        "CreatedAt": "2023-09-19T18:54:13+08:00",
        "Driver": "local",
        "Labels": {
            "com.docker.volume.anonymous": ""
        },
        "Mountpoint": "/data/var/lib/docker/volumes/fd8f7ab68c681a1651faff71a2da89c8b040a1bd0b58c285206e2488cfd9d306/_data",
        "Name": "fd8f7ab68c681a1651faff71a2da89c8b040a1bd0b58c285206e2488cfd9d306",
        "Options": null,
        "Scope": "local"
    }
]
[root@ALiCentos7:~]$

创建一个有名字的。

[root@ALiCentos7:~]$ docker volume create myboltest1
myboltest1
[root@ALiCentos7:~]$ docker volume ls
DRIVER    VOLUME NAME
local     fd8f7ab68c681a1651faff71a2da89c8b040a1bd0b58c285206e2488cfd9d306
local     myboltest1
[root@ALiCentos7:~]$ 

3.3 docker volume inspect

docker volume inspect [OPTIONS] VOLUME [VOLUME...]

参数

-f:指定相应个格式, 如json

3.4 docker volume ls

参数。

--format:指定相应个格式,如 json,table
--filter,-f: 过滤
-q: 仅显示名称

在这里插入图片描述

3.5 docker volume rm

参数。

-f, --force : 强制删除

3.6 docker volume prune

清理不使用的本地卷。

参数。

--filter : 过滤
-f, --force : 不提示是否删除
[root@ALiCentos7:~]$ docker volume ls
DRIVER    VOLUME NAME
local     fd8f7ab68c681a1651faff71a2da89c8b040a1bd0b58c285206e2488cfd9d306
local     myboltest1
[root@ALiCentos7:~]$ docker volume prune 
WARNING! This will remove anonymous local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
fd8f7ab68c681a1651faff71a2da89c8b040a1bd0b58c285206e2488cfd9d306

Total reclaimed space: 0B
[root@ALiCentos7:~]$ docker volume ls
DRIVER    VOLUME NAME
local     myboltest1
[root@ALiCentos7:~]$

3.7 管理卷创建方式二 -v参数和--mount参数

-v 和-mount 都可以完成管理卷的创建

3.7.1 -v参数

功能:完成目录映射

docker run -v name:directory[:options] ...

参数

第一个参数:卷名称
第二个参数:卷映射到容器的目录
第三个参数:选项,如 ro 表示 readonly

实操。

docker run -d  --name myvolnginx1 -v volnginx1:/usr/share/nginx/html/ nginx:1.21.4

在这里插入图片描述

在这里插入图片描述

现在我们进入这个容器,尝试把这个东西删除,看看现象是怎么样的。

在这里插入图片描述

如果带上-ro选项呢?(read only)

在这里插入图片描述

[root@ALiCentos7:~]$ docker exec -it myvolnginx1 bash
root@838d01664db5:/# cd /usr/share/nginx/html/
root@838d01664db5:/usr/share/nginx/html# ls
50x.html
root@838d01664db5:/usr/share/nginx/html# rm 50x.html 
rm: cannot remove '50x.html': Read-only file system
root@838d01664db5:/usr/share/nginx/html# rm 50x.html 
rm: cannot remove '50x.html': Read-only file system
root@838d01664db5:/usr/share/nginx/html# 
root@838d01664db5:/usr/share/nginx/html# 

此时,已经删不了了。

3.7.2 --mount参数

完成目录的映射。

参数。

type : 类型表示 bind, volume, or tmpfs
source, src : 对于命名卷,这是卷的名称。对于匿名卷,省略此字段。
destination, dst, target : 文件或目录挂载在容器中的路径
ro, readonly : 只读方式挂载

实操。

docker run -d --name mynginxvol3 --mount 'src=nginxvol3,dst=/usr/share/nginx/html' nginx:1.21.4 
[root@ALiCentos7:~]$ docker run -d --name mynginxvol4 --mount 'dst=/usr/share/nginx/html' nginx:1.22.0 
2d04251a15f4a4216a079b798524a1e1c31f841d61417bfcb86aa2956cc63004
[root@ALiCentos7:~]$ docker inspect my
mynginxvol4          mywebsite-yufc:v1.0  
[root@ALiCentos7:~]$ docker inspect mynginxvol4 
[
    {
        "Id": "2d04251a15f4a4216a079b798524a1e1c31f841d61417bfcb86aa2956cc63004",
        "Created": "2023-09-19T12:05:44.437893015Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],

在这里插入图片描述

3.8 Dockerfile匿名卷

通过 Dockerfile 的 VOLUME 可以创建 docker管理卷。这个我们后续在 Dockerfile中详细讲解。我们也可以通过 dockerfile 的 VOLUME 指令在镜像中创建 Data Volume,这样只要通过该镜像创建的容器都会存在挂载点,但值得注意的是通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,而是由 docker 随机生成的。

3.9 操作案例

3.9.1 案例一

如果在宿主机对容器里面的内容作修改,会怎么样?会同步到容器中。

先把环境准备好。

在这里插入图片描述

改一下。

在这里插入图片描述

发现容器里面也同步修改了。

3.9.2 案例二

如果通过ro的方式绑定,还能修改吗?宿主机能修改吗?容器里能修改吗?

先把容器跑起来

在这里插入图片描述

在这里插入图片描述

发现宿主机上上可以改的。

在这里插入图片描述

发现容器里面是改不了的。

3.9.3 案例三

--mount的方式,重复上面两个案例的操作,看看能不能容器和宿主机同步。

在这里插入图片描述

--mount来启动一个容器。

对首页作修改。

在这里插入图片描述

可以修改。

3.10 docker卷的生命周期

结论:容器删除掉,卷里面的内容还是在的,毕竟这个卷本来就是用来保护数据的。

在这里插入图片描述

但是如果docker volume rm test3东西就肯定不在了。

[root@ALiCentos7:~]$ ll /data/var/lib/docker/volumes/test3/_data
total 8
-rw-r--r-- 1 root root 497 Nov  2  2021 50x.html
-rw-r--r-- 1 root root 630 Sep 19 21:09 index.html
[root@ALiCentos7:~]$ docker volume rm test3
test3
[root@ALiCentos7:~]$ ll /data/var/lib/docker/volumes/test3/_data
ls: cannot access /data/var/lib/docker/volumes/test3/_data: No such file or directory
[root@ALiCentos7:~]$ 

3.11 卷共享

启动三个容器,绑定到同一个卷上,看看修改后会怎么样。

结论:三个容器会同时刷新。

这里就不做演示了,云服务器不想开这么多端口。

4.绑定卷 bind mount

-v 和-mount 都可以完成绑定卷的创建。

4.1 -v参数创建绑定卷

docker run -v name:directory[:options] ...

参数

第一个参数:宿主机目录,这个和管理卷是不一样的
第二个参数:卷映射到容器的目录
第三个参数:选项,如 ro 表示 readonly

第一个参数如果是宿主机的目录,那就是绑定卷,不指定,就是管理卷的匿名卷,如果是一个名称,就是管理卷。

实操

docker run -d --name mynginx -v /root/DockerSrc/Volume/:/usr/share/nginx/html f6987c8d6ed5

在这里插入图片描述

宿主机做一个修改。

发现里面也会有的。

在这里插入图片描述

4.2 --mount参数创建绑定卷

--mount '<key>=<value>,<key>=<value>'

参数。

type : 类型表示 bind, volume, or tmpfs
source, src : 宿主机目录,这个和管理卷是不一样的。
destination, dst, target : 文件或目录挂载在容器中的路径
ro, readonly : 只读方式挂载

在这里插入图片描述

看下容器里面写一个文件,看看宿主机里面会不会出现。

在这里插入图片描述

4.3 绑定卷的操作案例

4.3.1 案例一

使用--mount方式创建容器: 创建 nginx 容器,并将宿主机/webapp1 目录挂载至容器/usr/share/nginx/html目录,注意如果webapp1目录不存在会启动报错。

在这里插入图片描述

如果宿主机的目录不存在,会直接报错的!

在这里插入图片描述

4.3.2 案例二:绑定卷的共享

结论:和管理卷的共享是一样的,宿主机改了,所有容器都会修改。

5. 临时卷 tmpfs

临时卷数据位于内存中,在容器和宿主机之外。

tmpfs局限性

  • 不同于卷和绑定挂载,不能在容器之间共享 tmpfs 挂载。

  • 这个功能只有在 Linux 上运行 Docker时才可用

5.1 创建卷

方式一:指定--tmpfs创建

在这里插入图片描述

此时的实验和前面的都一样,但是如果容器停止了,东西就会没了。

6. 综合实战-MySQL灾难恢复

实战目的:

掌握挂载卷的使用,将 mysql 的业务数据存储到外部

实战步骤:

使用 MySQL 5.7 的镜像创建容器并创建一个普通数据卷 mysql-data 用来保存容器中产生的数据。需要在容器中连接 MySQL 服务, 并创建数据库 test, 并在在该数据库中创建一个简单的表并插入一些数据进来。

首先先找到一个mysql点容器并运行起来先。

在这里插入图片描述

docker run --name mysql -v /root/DockerSrc/Volume/mysql-test:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=yfc@test -d mysql:5.7

连上这个mysql

在这里插入图片描述

创建一个数据库。

在这里插入图片描述
创建表。

在这里插入图片描述

删除这个正在运行的容器。

在这里插入图片描述

现在跑一个新的容器,绑定到原来的目录,看看东西还在不在。

docker run --name mysql-new -v /root/DockerSrc/Volume/mysql-test:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=yfc@test -d mysql:5.7

在这里插入图片描述

发现东西还在。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1055037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何让你网站统计的更加精准?

引言 最近对比了自己网站在Cloudflare Analytics和51.la统计的数据&#xff0c;结果发现数值差距的比较大&#xff0c;这是为什么&#xff1f; 经过了摸索&#xff0c;发现了以下几个情况&#xff1a; 广告插件的拦截&#xff0c;大部分广告插件都会拦截网站统计&#xff0c…

select实现服务器并发

select的TCP服务器代码 #include <stdio.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <sys/select.h> #include…

【教学类-36-10】20230908方脸爷爷和圆脸奶奶(midjounery-niji)(中班:《我爱我家》数:连线、涂色)

背景需求&#xff1a; 领导们鼓动我去参加上海市高级职称评审&#xff08;科研成果比较多&#xff09;&#xff0c;为下一轮保教主任评高级“探探路”。虽然自我感觉道行浅薄&#xff0c;无缘高级&#xff0c;但领导给机会&#xff0c;自然要参与一下&#xff0c;努力了解整个…

10.1select并发服务器以及客户端

服务器&#xff1a; #include<myhead.h>//do-while只是为了不让花括号单独存在&#xff0c;并不循环 #define ERR_MSG(msg) do{\fprintf(stderr,"%d:",__LINE__);\perror(msg);\ }while(0);#define PORT 8888//端口号1024-49151 #define IP "192.168.2.5…

10月1日作业

汇编指令合集 用select实现服务器并发代码 #include<myhead.h> #define IP "192.168.0.106" #define PORT 8888int main(int argc, const char *argv[]) {//新建套接字文件int sfd socket(AF_INET, SOCK_STREAM, 0);if(sfd < 0){ERR_MSG("socket&quo…

imgui开发笔记<4>、image-slider online

在线滑条二值化。 // // Created by sry on 2021/6/30. //#include"imgui.h" #include "imgui_impl_glfw.h" #include "imgui_impl_opengl3.h" #include <stdio.h> // Initialize with gl3wInit() #include<GL/gl3w.h> // Include …

【MATLAB第78期】基于MATLAB的VMD-SSA-LSTM麻雀算法优化LSTM时间序列预测模型

【MATLAB第78期】基于MATLAB的VMD-SSA-LSTM麻雀算法优化LSTM时间序列预测模型 一、LSTM data xlsread(数据集.xlsx);% [x,y]data_process(data,15);%前15个时刻 预测下一个时刻 %归一化 [xs,mappingx]mapminmax(x,0,1);xxs; [ys,mappingy]mapminmax(y,0,1);yys; %划分数据 n…

Android进阶——Handler底层fd监听之epoll机制

文章大纲 引言一、从网卡接收数据说起二、如何知道接收了数据&#xff1f;三、进程阻塞为什么不占用cpu资源&#xff1f;四、那么阻塞的原理是什么&#xff1f;1、工作队列2、等待队列3、唤醒进程 五、内核接收网络数据全过程六、同时监视多个socket的简单方法七、epoll的设计思…

Redis入门到精通——00数据类型

1、String 1.1、介绍 String 是最基本的 key-value 结构&#xff0c;key 是唯一标识&#xff0c;value 是具体的值&#xff0c;value其实不仅是字符串&#xff0c; 也可以是数字&#xff08;整数或浮点数&#xff09;&#xff0c;value 最多可以容纳的数据长度是 512M 1.2、…

聊天、会议、多媒体一体化:多平台支持的即时通讯系统 | 开源日报 No.44

harness/gitness Stars: 28.2k License: Apache-2.0 Gitness 是一个建立在 Drone 之上的新型开源开发者平台&#xff0c;具备代码托管和流水线功能。它提供了以下核心优势&#xff1a; 轻量级、超快速的代码托管和持续集成服务支持 Docker 容器化部署可以在本地环境中构建和…

【C/C++笔试练习】二维数组、二维数组的访问,解引用,地址计算、计算糖果、进制转换

文章目录 C/C笔试练习1.二维数组&#xff08;1&#xff09;二维数组的访问&#xff08;2&#xff09;二维数组的初始化&#xff08;3&#xff09;二维数组的解引用&#xff08;4&#xff09;二维数组的解引用&#xff08;5&#xff09;多维数组的解引用&#xff08;6&#xff0…

没有社会性的人机环境系统智能是危险的

缺乏社会性的人工智能常常存在着一定的潜在危险性&#xff0c;这是因为&#xff1a; 首先&#xff0c;社会性对于人类而言是非常重要的&#xff0c;我们通过社交互动、合作和沟通来建立联系、理解他人以及共同解决问题。人类具有复杂的情感和道德价值观&#xff0c;这些因素在我…

嵌入式学习笔记(39)蜂鸣器和PWM定时器编程实践

7.4.1蜂鸣器的工作原理 (1)蜂鸣器里边有2个金属片&#xff0c;离得很近但没挨着。没电的时候两个金属片在弹簧本身的张力作用下分开彼此平行&#xff0c;有电的时候两边分别充电&#xff0c;在异性电荷的吸力作用下两个片挨着。 (2)我们只要以快速的频率给蜂鸣器的正负极供电…

redis使用学习笔记

文章目录 关于redis的简单性能概括Redis命令行客户端Redis命令Redis通用命令String类型key的层级格式Hash类型List类型Set类型SortedSet类型 Redis的Java客户端Jedis使用基本步骤Jedis连接池 SpringDataRedisRedisTemplate快速入门RedisSerializer 关于redis的简单性能概括 键…

c语言练习72:关于截断和整形提升

关于截断和整形提升 思考: 什么时候会发生截断和整形提升? 当以int的形式定义一个变量然后以char的形式输出是就会发生截断和整形提升 例如: #include<stdio.h> int main() {char c1, c2, c3;int i, j;c1 a, c2 97, c3 243;i b, j 1 c1;printf("%c %d\n…

Airtool for Mac——高效便捷的系统菜单栏网络工具!

在我们的数字化生活中&#xff0c;对于网络连接的稳定性和速度有着越来越高的需求。为了满足您对网络质量的实时监测和分析的需求&#xff0c;我们向大家介绍一款强大的Mac系统菜单栏网络工具——Airtool&#xff01; Airtool是一款专为Mac设计的网络工具&#xff0c;它能够提…

每日一练-Q2-贝博士的机械零件-20231001

目录 1.题目描述 2.输入描述 3.示例提示 4.问题分析 5.通过代码 1.题目描述 贝博士是个大忙人&#xff0c;他在设计和制造一台非常复杂的机械式计算机。 最近贝博士有一点烦恼&#xff0c;因为机械零件的种类繁多&#xff0c;磨损又快&#xff0c;经费不太够用了。不过&…

【C++】string 之 substr、insert、erase函数的学习

前言 之前两篇文章 我们学习了 assign、at、append函数 find、rfind、replace、compare函数 这些函数。接下来让我们继续学习其他函数 substr 两个参数 pos1&#xff0c;截取的开始位置 len&#xff0c;截取的子串长度 作用是在字符串中截取一段长度为len的子串 下面给出…

最新整理源码面试题

经典框架源码面试题 Lecture&#xff1a;波哥 1.谈谈你对框架的理解 1.1 框架的作用 JavaWeb中的框架是一种开发工具或者平台&#xff0c;它提供了一系列的功能和组件&#xff0c;用于简化和加速Web应用的开发过程。框架可以提供一些基础设施&#xff0c;如数据库访问、用户认…

Linux系统之部署Linux命令大全搜索工具

Linux系统之部署Linux命令大全搜索工具 一、linux-command介绍二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍 三、安装httpd软件3.1 检查yum仓库3.2 安装httpd软件3.3 启动httpd服务3.4 查看httpd服务状态3.5 防火墙和selinux设置3.6 浏览器测试web服务 四、安装linux-com…