带你了解Docker的Volume是什么,有什么作用
wptr33 2024-12-19 16:50 46 浏览
在Docker可视化管理:Portainer中文版 中,我提到了一个Volume,但是对于这个Volume我是一笔带过了(其实那一步是可以不创建的,因为我后期的映射是采用绝对路径进行),现在我们通过简单的案例来了解一下这个“Volume”是个什么小东西。
不使用Volume
首先创建一个nginx容器,命令如下:
docker run -dit --name=web -p 81:80 nginx创建结果:
然后我们访问:
接着修改网页内容:
docker exec -ti web /bin/bash
echo 1 > /usr/share/nginx/html/index.html
cd /etc/init.d/
./nginx restart
exit
docker restart web然后访问:
这时候,网页内容已经更改了,然后我们删除这个容器,重新创建它
docker rm -f web
docker run -dit --name=web -p 81:80 nginx再次访问:
这时候你会发现,之前修改的内容已经不见了,这个又是一个新的容器,那么这是在不使用Volume的场景
使用自定义Volume
接下来我们使用-v参数去创建容器:
创建容器之前,我们先创建一个文件夹(确保没数据)
mkdir /web/
docker run -dit --name=web -v /web/:/usr/share/nginx/html/ -p 81:80 nginx执行结果:
然后我们进入容器看一下:
docker exec -ti web /bin/bash
cd /usr/share/nginx/html/
ls从图中我们可以看到,此时默认的数据(网页文件)不见了,访问网页看一下:
找不到文件,不过没关系啊,我们回到宿主机创建网页文件看看:
exit
echo 'web' > /web/index.html再次访问:
这时候惊喜来了,我们在宿主机创建的文件直接应用在了容器里面,而且我们不需要进入容器就能实现更改应用,到这里是不是大概了解了Volume的作用了呢?还不了解的也没关系,继续往下看:
映射有数据的目录到新建容器
现在我们把现在的容器删除掉,重新创建,然后继续挂载这个目录
docker rm -f web
ls /web/
docker run -dit --name=web -v /web/:/usr/share/nginx/html/ -p 81:80 nginx 然后再次访问:
这时候发现,刚刚新建的nginx容器服务无需进行任何操作就出现了之前手动修改的网页文件内容,也就是说:
- 当映射的本地目录不存在数据的时候,对应的容器目录默认数据会被删除并没有任何文件
- 当映射的本地目录存在数据的时候,对应的容器目录默认数据会被删除,本地的目录文件会出现在容器的挂载目录上
那么这是自定义Volume的一个场景,接下来看一下Docker Volume的场景
使用docker Volume
docker Volume其实就是由Dokcer统一管理的卷,默认存放路径为:
/var/lib/docker/volumes/例如我完成一个volume生命周期:
ls /var/lib/docker/volumes/
docker volume create web
ls /var/lib/docker/volumes/
docker volume rm web
ls /var/lib/docker/volumes/执行结果:
可以看到,当我们创建一个新的Volume的时候,/var/lib/docker/volumes/目录下就会出现对应的文件名名称。
也就是说,Docker Volume其实就是设定一个默认的Volume路径,然后创建删除volume都会在设定的目录变化,
所以实际上我们使用-v指定绝对路径跟-v指定卷名的作用是一样的,只是路径不一定相同而已。
举个例子:
我创建一个volume,在里面写入数据,然后映射
rm -rf /web/ #删除宿主机绝对路径下的web
docker rm -f web #删除存在的容器
docker volume create web #创建一个volume
echo '/var/lib/docker/volumes/web/' > /var/lib/docker/volumes/web/index.html #写入数据到volume
docker run -dit --name=web -v web:/usr/share/nginx/html/ -p 81:80 nginx #创建容器执行结果:
细心的朋友可能发现我在映射本地路径的时候,使用的是相对路径web/,但是我当前目录是没有web/文件夹的,所以docker在创建的时候就是会自动去默认的volume路径找。
创建成功之后,我们访问网页看下:
此时,默认网页出现在我们的面前,也就是说,刚才的echo写入的文件没有映射到这个容器,我们去看下是怎么回事:
问题找到了,通过docker volume映射的容器目录并不会将volume根目录的数据映射到容器的对应路径,而是把volume下的_data映射到容器的工作目录,所以我们需要修改的路径应该再加一层
_data然后我们继续执行下面这台命令看一下:
echo '/var/lib/docker/volumes/web/' > /var/lib/docker/volumes/web/_data/index.html然后再次访问:
此时,我们在本地修改的数据已经同步到了容器里面了,所以到这里你看懂这个volume了吗?
还是不懂的话你可以把这个主机的volume云服务器里面的一个数据盘,即使云服务器(容器)销毁了,数据盘的数据不会随着云服务器(容器)的销毁而消失,这就是数据持久化,同时,volume支持多容器共享一个volume,这在某些场景是非常有用的。
想了解更多Docker、Linux、Python相关知识请关注我吧,也可以留言给我需要了解哪些知识,然后我可以根据你们的需求去定后续的文章!
如果觉得本文对你有帮助,请多多转发评论,这是对我的一个最大的支持,也是我持续更新的动力,谢谢!
相关推荐
- oracle数据导入导出_oracle数据导入导出工具
-
关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...
- 继续学习Python中的while true/break语句
-
上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个else解...
- python continue和break的区别_python中break语句和continue语句的区别
-
python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...
- 简单学Python——关键字6——break和continue
-
Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
-
用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...
- Python 中 break 和 continue 傻傻分不清
-
大家好啊,我是大田。今天分享一下break和continue在代码中的执行效果是什么,进一步区分出二者的区别。一、continue例1:当小明3岁时不打印年龄,其余年龄正常循环打印。可以看...
- python中的流程控制语句:continue、break 和 return使用方法
-
Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...
- L017:continue和break - 教程文案
-
continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...
- 作为前端开发者,你都经历过怎样的面试?
-
已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...
- 面试被问 const 是否不可变?这样回答才显功底
-
作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...
- 2023金九银十必看前端面试题!2w字精品!
-
导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。答案:CSS的盒模型是用于布局和定位元素的概念。它由内容区域...
- 前端面试总结_前端面试题整理
-
记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...
- 由浅入深,66条JavaScript面试知识点(七)
-
作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录由浅入深,66条JavaScript面试知识点(一)由浅入深,66...
- 2024前端面试真题之—VUE篇_前端面试题vue2020及答案
-
添加图片注释,不超过140字(可选)1.vue的生命周期有哪些及每个生命周期做了什么?beforeCreate是newVue()之后触发的第一个钩子,在当前阶段data、methods、com...
- 今年最常见的前端面试题,你会做几道?
-
在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...
- 一周热门
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)
