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

在这里插入图片描述

前言

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

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

  • 高质量博客汇总

然后就是博主最近最花时间的一个专栏《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:
fd8f7ab68c681a1651faff71a2da89c8b040a1bd0b58c285206e2488cfd9d306Total 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.xdnf.cn/news/146980.html

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

相关文章

【1++的Linux】之进程(五)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的Linux】 文章目录 一&#xff0c;什么是进程替换二&#xff0c;替换函数三&#xff0c;实现我们自己的shell 一&#xff0c;什么是进程替换 我们创建出来进程是要其做事情的&#xff0c;它可…

【爬虫】用wget命令爬虫的简易教程

文章目录 1. 获取登录的请求2. 用postman模拟登录请求3. 用wget模拟登录请求并保存cookie4. 开始爬取网站5. 查看爬取结果6. 网站爬虫简易教程 爬取需要登录的网站的资源 背景&#xff1a;对于一些网站需要使用用户名和密码登录并且使用了https&#xff0c;我们如果不通过凭证将…

网络工程师对口的岗位是什么

大家好&#xff0c;我是网络工程师成长日记实验室的郑老师&#xff0c;您现在正在查看的是网络工程师成长日记专栏&#xff0c;记录网络工程师日常生活的点点滴滴 网络工程师可以从事哪些职位呢&#xff1f;其实网络工程师最对应的最对口的这个岗位就是高级网络工程师、系统集成…

番外6:下载+安装+配置Linux

#########配置Linux---后续 step08: 点击编辑虚拟机设置&#xff0c;选择下载好的映像文件.iso进行挂载&#xff1b; step09: 点击编辑虚拟机选项&#xff0c;选择UEFI启动模式并点击确定&#xff1b; step10: 点击开启虚拟机&#xff0c;选择Install rhel &#xff1b; 备注&…

飞桨EasyDL-Mac本地部署离线SDK-Linux集成Python

前言&#xff1a;本文对使用飞桨EasyDL桌面版实现本地部署物体检测做一下说明 一、训练模型 如何使用飞桨EasyDL桌面版这里就不再赘述&#xff0c;直接参照官方文档进行物体检测模型训练。 飞桨EasyDL桌面版-用零代码开发实现物体检测https://ai.baidu.com/ai-doc/EASYDL/Tl2…

探索社会工程的深度:从定义到高级攻击策略

在广阔的网络安全领域&#xff0c;社会工程作为一种微妙的威胁而出现&#xff0c;它利用人类的漏洞来访问敏感信息或实施欺诈。网络安全背景下的社会工程的定义很明确&#xff1a;它包括使用欺骗手段操纵个人泄露机密或个人信息&#xff0c;然后将这些信息用于欺诈目的。 此类…

实现水平垂直居中的十种方式

本文节选自我的博客&#xff1a;实现水平垂直居中的十种方式 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是MilesChen&#xff0c;偏前端的全栈开发者。&#x1f4dd; CSDN主页&#xff1a;爱吃糖的猫&#x1f525;&#x1f4e3; 我的博客&#xff1a;爱吃糖的猫&…

AJAX--Express速成

一、基本概念 1、AJAX(Asynchronous JavaScript And XML)&#xff0c;即为异步的JavaScript 和 XML。 2、异步的JavaScript 它可以异步地向服务器发送请求&#xff0c;在等待响应的过程中&#xff0c;不会阻塞当前页面。浏览器可以做自己的事情。直到成功获取响应后&#xf…

Scala第十五章节

Scala第十五章节 1. 递归 2. 案例一: 求阶乘 3. 案例二: 斐波那契数列 4. 案例三: 打印目录文件 scala总目录 文档资料下载

淘宝天猫复制商品链接粘贴到草柴查优惠券iPhone苹果手机粘贴弹窗怎么关闭?

经常在淘宝、天猫、京东网购&#xff0c;挑选商品后复制链接&#xff0c;到草柴APP查询要购买商品的优惠券和返利&#xff0c;iPhone苹果手机每次粘贴复制的商品链接都弹窗提示特别烦人。接下来分享如何关闭草柴APP复制粘贴提醒的弹窗&#xff1b; 如何永久关闭iPhone苹果手机复…

云服务器租用价格表概览_阿里云腾讯云华为云

云服务器租用价格多少钱一年&#xff1f;阿腾云分享阿里云、腾讯云和华为云的云服务器租用价格表&#xff1a;阿里云2核2G服务器108元一年起、腾讯云2核2G3M带宽轻量服务器95元一年、华为云2核2G3M云耀L实例89元一年起&#xff0c;阿腾云分享更多关于云服务器租用价格明细&…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— Web APIs(四)

思维导图 一、日期对象 1.1 实例化 实例化&#xff0c;默认得到当前时间&#xff0c;也可以指定时间 1.2 日期对象方法 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible&q…

[Realtek sdk-3.4.14b]RTL8197FH-VG 2.4G to WAN吞吐量低于60%的问题分析及解决方案

问题描述 RTL8197FH-VG 2.4G wifi to WAN吞吐量低于65%的标准,正常2T2R的wifi 300Mbps x 65% = 195Mbps,但是实际只能跑到160Mbps,这个时候CPU的idl已经为0,sirq占用率达到98%左右 网络拓扑 一台PC通过2.4G WiFi连接到RTL8197FH-VG,另外一台PC直接通过WAN口连接到RTL8197…

milvus 结合Thowee 文本转向量 ,新建表,存储,搜索,删除

1.向量数据库科普 【上集】向量数据库技术鉴赏 【下集】向量数据库技术鉴赏 milvus连接 from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility connections.connect(host124.****, port19530)2.milvus Thowee 文本转向量 使用 …

web:[RoarCTF 2019]Easy Calc

题目 进入页面是一个计算器的页面 随便试了一下 查看源代码看看有什么有用的信息 访问一下这个calc.php 进行代码审计 <?php error_reporting(0); if(!isset($_GET[num])){show_source(__FILE__); }else{$str $_GET[num];$blacklist [ , \t, \r, \n,\, ", , \[, \]…

C语言编译与链接过程详解

C语言编译与链接过程详解 源文件 main.c #include <stdio.h>extern int data; extern int add(int a,int b);int a1; int a2 0; int a3 10;static int b1; static int b2 0; static int b3 20;int main() {int c1;int c2 0;int c3 30;static int d1;static int …

1004. 最大连续1的个数III(滑动窗口)

一、题目 1004. 最大连续1的个数 III - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public:int longestOnes(vector<int>& nums, int k) {int mark0;//标记0的个数int MaxLength0;for(int left0,right0;right<nums.size();right){if(nums…

Leetcode.965 单值二叉树

本专栏内容为&#xff1a;leetcode刷题专栏&#xff0c;记录了leetcode热门题目以及重难点题目的详细记录 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;八大排序汇总 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &…

网络运营对职业发展有什么用

大家好&#xff0c;我是网络工程师成长日记实验室的郑老师&#xff0c;您现在正在查看的是网络工程师成长日记专栏&#xff0c;记录网络工程师日常生活的点点滴滴 有个哥们联系我&#xff0c;他说他以前是做it售前&#xff0c;也做过售后&#xff0c;也做it很长时间了&#xff…

一文带你掌握 优先级队列

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…