云时代【7】—— 存储卷

云时代【7】—— 存储卷

  • 四、Docker
    • (四)存储卷
      • 1. 存储卷
        • (1)定义
        • (2)分类
      • 2. 相关指令
        • (1)管理卷 Volume
          • A. 创建方式
            • 方式一:docker volume
            • 方式二:docker run -v 与 --mount
            • 方式三:DockerFile 创建匿名卷
          • B. 实战演习
        • (2)绑定卷 bind mount
        • (3)临时卷 tmpfs
      • 3. 实战演习

四、Docker

(四)存储卷

1. 存储卷

(1)定义

存储卷是 将宿主机的本地文件系统中存在的某个目录 直接与 容器内部的文件系统上的某一目录 建立绑定关系。
用专业的语言解释就是:当我们在容器中的这个目录下写入数据时,容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录,这个目录就被称作:存储卷。我们可以理解为:容器是地面上的房子,而房子(容器)的地下室就是存储卷。哪怕容器(地下室上的房子)被删除掉也不会影响到存储卷(地下室)。
既然卷的本质是文件或者目录,那么它就可以绕过默认的联合文件系统,直接以文件或目录的形式存在于宿主机上。例如:将宿主机的/data/web 目录与容器中的/container/data/web目录绑定,当容器中的进程向/container/data/web目录写数据时,其实也直接写到了宿主机的目录上的/data/web上。存储卷绕过容器文件系统与宿主机的文件系统建立关联关系,使得可以在宿主机和容器内共享数据库内容,让容器直接访问宿主机中的内容,也可以宿主机向容器写入内容,容器和宿主机的数据读写是同步的。

(2)分类

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

  • volume管理卷

默入映射到宿主机的/var/lib/docker/volumes目录下。只需要在容器内指定容器的挂载点是什么,而它会被绑定宿主机的哪个目录下呢?一般容器引擎**daemon**自行创建一个空的目录 或 使用一个已经存在的目录,与存储卷建立存储关系。这种方式极大解脱用户在使用卷时的耦合关系,缺陷是用户无法指定那些使用目录,临时存储比较适合

  • bind mount绑定数据卷

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

  • tmpfs mount临时数据卷

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

2. 相关指令

(1)管理卷 Volume

A. 创建方式

方式一:docker volume
docker volume create
docker volume ls
docker volume inspect '卷ID'
ls -l /data/var/lib/docker/volumes/'卷ID'/_data

image.png

docker volume create --label MYTEST=1 myvolumetest2
docker volume ls
docker volume inspect myvolumetest2
ls -l /data/var/lib/docker/volumes/myvolumetest2/_data

image.png

echo "123" > ./test.txt
ll
cat test.txt
docker volume rm myvolumetest3
ll # 删除卷之后,写入卷的文件也会被删除

image.png

docker volume ls
docker volume prune
docker volume ls

image.png

方式二:docker run -v 与 --mount
docker run -d --name myvolumenginx1 -v volumenginx1:/usr/share/nginx/html nginx:1.23.0
docker ps
docker volume ls
docker volume inspect volumenginx1
ls -l /data/var/lib/docker/html/volumenginx1/_data
docker exec -it myvolumenginx1 bash
ls -l
rm index.html
exit
ls -l /data/var/lib/docker/html/volumenginx1/_data # 默认情况下可以直接删除卷中的文件

image.png

docker run -d --name myvolumenginx2 -v volumenginx2:/usr/share/nginx/html:ro nginx:1.23.4
docker ps | grep myvolumenginx2
docker volume ls | grep volumenginx2
docker exec -it myvolumenginx2 bash
cd /usr/share/nginx/html
ls -l
rm index.html # 无法删除与修改,因为设置了卷是只读的
exit
# 但是可以在容器外的宿主机上修改
docker inspect volumenginx2
cd /data/var/lib/docker/volumes/volumenginx2/_data
echo "Hello World" > index.html
exit
# 因为容器没有设置端口映射,所以只能直接进入容器查看
docker exec -it myvolumenginx2 bash
cd /usr/share/nginx/html
cat index.html

image.png
image.png
image.png

docker run -d --name myvolumenginx3 --mount 'src=volumenginx3,dst/usr/share/nginx/html,ro' nginx:1.23.4
docker volume ls
docker volume inspect volumenginx3

image.png

方式三:DockerFile 创建匿名卷

B. 实战演习
docker volume create test1
docker volume ls | grep test1
docker volume inspect test1
ls -l /data/var/lib/docker/volumes/test1/_datadocker run -d --name mynginx5 -p 8045:80 -v test1:/usr/share/nginx/html nginx:1.23.4
docker ps | grep mynginx5
dcoker container inspect mynginx5 # "Mount"可以看到挂载的地址
cd /data/var/lib/docker/volumes/test1/_data
vim index.html
docker exec -it mynginx5 bash
cd /usr/share/nginx/html
cat index.html

image.png
image.png
image.png

# 容器被删除,卷不会
docker run -d --name mynginx6 -v test2:/usr/share/nginx/html -p 8046:80 nginx:1.23.4
docker inspect '容器ID'
ls -l /data/var/lib/docker/volumes/test2/_data
docker stop mynginx6
docker rm mynginx6
docker ps | grep mynginx6
docker volume ls | grep test2 # 卷还在

image.png
image.png

docker run -d --name mynginx6_1 -v test2:/usr/share/nginx/html -p 8061:80 nginx:1.23.4
docker ps | grep mynginx6_
docker inspect mynginx6_1 | grep 'Mounts' -A 10
cd /data/var/lib/docker/volumes/test2/_data
vim index.html
curl 127.0.0.1:8061 # 一次绑定,同步修改

image.png
image.png

(2)绑定卷 bind mount
mkdir -p /data/lllzxx/testbind
cd /data/lllzxx/testbind
ls -l
docker run -d --name mynginx7 -v /data/lllzxx/testbind:/usr/share/nginx/html nginx:1.23.4
docker inspect mynginx7 | grep 'Mounts' -A 10
cd /data/lllzxx/testbind
ls -l
vi index.html
# 进入容器查看修改
docker exec -it mynginx7 bash
cd /usr/share/nginx/html
ls -l
cat index.htm;
exit

image.png
image.png
image.png

# 宿主机的目录不存在则会直接创建一个空的目录
docker run -d --name mynginx9 -v /data/lllzxx/testbindtest1:/usr/share/nginx/html nginx:1.23.4
docker inspect mynginx9 | grep 'Mounts' -A 10

image.png

docker run -d --name mynginx8 --mount type=bind,src=/data/lllzxx/testbind,dst=/usr/share/nginx/html nginx:1.23.4
docker ps | grep mynginx8
docker inspect mynginx8 | grep 'Mount' -A 10docker exec -it mynginx8 bash
cd /usr/share/nginx/html
ls -l
echo "Hello bind by mount" > index2.html
exit
cat index2.html

image.png
image.png

(3)临时卷 tmpfs
docker run -d --name mynginx10 --tmpfs /test1 nginx:1.23.4
docker inspect mynginx10 | grep 'Mounts' -A 5 # 找不到 /test1
docker inspect mynginx10 | grep 'Tmpfs' -A 5
docker exec -it mynginx10 bash
ls -l
cd /test1
ls -l
echo "Helo tmpfs" > index.html
cat index.html
exitdocker restart mynginx10
docker exec -it mynginx10 bash
cd /test1
ls -l # 文件已经不存在了

image.png
image.png

docker run -d --name mynginx11 --mount type=tmpfs,dst=/test2 nginx:1.23.4
docker inspect mynginx11 | grep 'Mounts' -A 10docker exec-it mynginx11 bash
ls -l
cd test2
ls -l
echo "Hello --mount tmpfs" > index.html
cat index.html
exitdocker restart mynginx11
docekr exec -it mynginx11 bash
cd test2
ls -l

image.png
image.png

cd /usr/share/nginx/html
ls -l
cat index.html # 查看宿主机目录下的内容docker run -d --name mynginx12 --tmpfs  /usr/share/nginx/html -p 8012:80 nginx:1.23.4
docker inspect mynginx12 | grep 'Tmpfs' -A 10
docker exec -it mynginx12 bash
cd /usr/share/nginx/html
ls -l # 直接创建新的文件,容器文件覆盖宿主机文件
echo "Hello tmpfs" > index.html
exit
curl 127.0.0.1:8012 # 写入什么就打印什么docker restart mynginx12
curl 127.0.0.1:8012 # 重启之后显示:403,没有访问权限

image.png
image.png

docker run -d --name mynginx13 --mount type=tmpfs,dst=/test3,tmpfs-size=1k nginx:1.23.4
docker inspect mynginx13 | grep 'Mounts' -A 5
ls -lhdocker cp Learning-Java mynginx13:/
docker exec -it mynginx13 bash
cd /test3 
cp /Learning-Java . # 空间限制,复制失败cd /
touch tmplatedocumentbylzxx.txt
echo "Hello World!" > tmplatedocumentbylzxx.txt
find / -name tmplatedocumentbylzxx.txt
cat ... # 能够直接找到docker exec -it mynginx13 bash
cd /test3 
touch tmplatedocumentbylzxx2.txt
echo "Hello World!" > tmplatedocumentbylzxx2.txt
find / -name tmplatedocumentbylzxx2.txt # 无法找到

image.png
image.png

3. 实战演习

docker run -d --name mysql1 -v /data/lllzxx docker run -d --name mysql1 -v /data/lllzxx/testmysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=lzxx@mysql mysql:5.7
docker ps | grep mysql1
ls -l /data/lllzxx/testmysqldocker exec -it mysql1 bash
mysql -h 127.0.0.1 -u root -p
show databases;
create database test;
use test;
create table student(sno int, sname varchar(50));
insert into student values(1,'tony');
select * from student;
exit
exitdocker rm -f mysql1
docker ps | grep mysql1docker run -d --name mysql1new -v /data/lllzxx/testmysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=lzxx@mysql mysql:5.7
docker ps | grep mysql1new
docker exec -it mysql1new bash
mysql -h 127.0.0.1 -u root -p
use test;
select * from student; # 数据依旧存在
exit
exit

image.png
image.png
image.png

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis plusSwagger代码生成器

Mybatis plus 1.查询没找到请求参数 Parameter pageNum not found. Available parameters are [arg1, arg0, param3, param1, param2, username] 原因: Mapper文件中都要加上 Param("pageNum") Select("SELECT * FROM user where username like #{u…

Java进阶-IO(2)

话接上回,继续java IO部分的学习。上一次说完了字节流的读写数据,这次介绍一下字符流的读写数据。 一、字符流及其读/写数据 1、字符流 1.1 概述 1)背景 由于字节流操作中文不是特别方便,所以java就提供了字符流。 字符流字节…

AXI4—FULL

文章目录 手册解读AXI—FULL协议特性AXI—FULL架构信号描述代码编写手册解读 AXI—FULL协议特性 支持的主要功能: 数据通道与地址通道分离支持不对齐传输,使用数据掩码实现突发传输只需要一个突发基地址读写通道分离AXI—FULL架构 关于读操作 关于写操作

SpringMVC自定义视图解析器

/** * 使用View接口完成请求转发|重定向 * 解释: * SpringMVC的官方,提供了一个叫做View的接口,告诉开发人员 * DispatcherServlet底层会调用View接口的实例化对象中的逻辑方法 * 来完成对应的请求转发和重定向。 * 使用: * 1. 单元方法的返回值为View接…

把Anaconda添加进环境变量的方法(解决pip识别不到环境的问题)

找到你的Anaconda的安装根目录 比如我的是在:C:\ProgramData\Anaconda3 那么只需要将以下目录添加进环境变量即可: C:\ProgramData\Anaconda3C:\ProgramData\Anaconda3\ScriptsC:\ProgramData\Anaconda3\Library\binC:\ProgramData\Anaconda3\condabin…

取送货问题(Pickup and Delivery Problem)

取送货问题及其变体 广义取送货问题(General Pickup and Delivery Problems,GPDP)可以分为两类: Vehicle Routing Problems with Backhauls,VRPB:从配送中心(depot)取货运输货物到客…

备战蓝桥杯---动态规划的一些思想1

话不多说,直接看题: 目录 1.双线程DP 2.正难则反多组DP 3.换个方向思考: 1.双线程DP 可能有人会说直接贪心:先选第1条的最优路径,再选第2条最优路径。 其实我们再选第1条时,我们怎么选会对第2条的路径…

在线开源免费问卷调查系统

在线开源免费问卷调查系统 平台简介 本项目旨在提供一个简单易用的问卷调查平台,帮助用户创建、分享问卷,并收集、分析调查数据。我们希望能够为各行各业的调查需求提供一种高效、便捷的解决方案。 项目特点 用户友好:清晰直观的用户界面…

华为数通方向HCIP-DataCom H12-821题库(多选题:21-40)

第21题 管理员在配置 VRRP 时,下面哪些不是必须配置的? A.抢占模式 B.抢占延时 C.虚拟IP 地址 D.虚拟路由器的优先级 【参考答案】ABD 【答案解析】 VRRP的作用之一是提供一个虚拟的IP地址,用作默认网关,用来实现冗余和故障转移。因此,配置虚拟IP地址是必须的。华为设备vr…

深入sizeof与strlen

一、sizeof与strlen的对比 sizeofstrlensizeof是单目操作符strlen是库函数,使用需要包含头文件string.hsizeof计算操作数所占用的内存,单位是字节strlen是求字符串长度,统计的是\0之前字符的个数不关注内存中存放什么数据 关注内存总是否有\0…

数据结构开篇

目录 一. 如何学好数据结构二. 基本概念和术语2.1 区分数据、数据元素、数据项、数据对象2.2 数据结构2.2.1 逻辑结构2.2.2 存储结构 2.3 数据类型和抽象数据类型2.4 抽象数据类型的实现 \quad 一. 如何学好数据结构 勤于思考;多做练习;多上机;善于寻求帮助;不怕困难&#xff…

基于springboot+vue的计算机课程管理平台(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…