• 售前

  • 售后

热门帖子
入门百科

Docker中数据卷(volume)管理的两种方式

[复制链接]
123456868 显示全部楼层 发表于 2021-8-14 15:12:19 |阅读模式 打印 上一主题 下一主题
上篇文章给各人介绍过 docker根本知识之挂载本地目录的方法 ,本日给各人介绍Docker中数据卷(volume)管理的两种方式,详细内容如下所示:
什么是数据卷

数据卷( volume ):volume是存在于一个或多个容器中的特定文件或文件夹,这个目录以独立于联合文件系统的形式在宿主机中存在,并为数据的共享与长期化提供便利。
为什么要用数据卷

Docker分层文件系统存在的题目:
Docker的镜像是由一系列的只读层组合而来的,当启动一个容器时, Docker加载镜像的全部只读层,并在最上层加入一个读写层。这个计划使得Docker可以提高镜像构建、存储和分发的服从,节流了时间和存储空间,然而也存在如下题目:
1、性能差。
2、多个容器之间的数据无法共享。
3、生命周期与容器类似。当删除容器时,容器产生的数据将丢失。数据卷机制的好处:
1、mount到主机中,绕开分层文件系统。
2、volume能在不同的容器之间共享和重用。
3、和主机磁盘性能类似。
4、对volume中数据的操作不会影响到镜像自己。
5、volume的生存周期独立于容器的生存周期,即使删除容器,volume仍然会存在,没有任何容器使用的volume也不会被Docker删除。
Docker提供了volumedriver接口,通过实现该接口,我们可以为Docker容器提供不同的volume存储支持。当前官方默认实现了local这种volumedriver,它使用宿主机的文件系统为Docker容器提供volume。
数据卷管理的两种方式
  1. Docker的volume的本质是容器中一个特殊的目录。在容器的创建过程中,Docker会将宿主机上的指定目录(一个以volume ID为名称的目录,或者指定的宿主机目录)挂载到容器中指定的目录上(使用bing mount挂载方法),故挂载完成后的宿主机目录和容器内的目标目录表现一致。
复制代码
1、绑定挂载bind mount

bind mount是将主机上的目录或文件mount到容器里。使用直观高效,易于明白。
使用
  1. -v
复制代码
选项指定挂载路径,格式
  1. <host path>:<container path>
复制代码

#前面是宿主机真实存在的路径:后面是容器内的路径
  1. 后台运行一个使用nginx镜像的容器并将宿主机的/data目录挂载到容器的目录/usr/share/nginx/html下
  2. [root@server1 ~]# docker run -d --name demo -v /data:/usr/share/nginx/html nginx
复制代码

调到前台运行,分别检察宿主机和容器的指定的目录下的内容,是一样的。这是由于这种方式挂载和我们平常使用mount方式是一样的,原有数据隐藏,替换为宿主机的数据。
##/data目录下这么多东西是由于docker默认数据目录是/data
  1. [root@server1 ~]# docker exec -it demo bash
复制代码

bind mount默认权限是读写rw,可以在挂载时指定只读ro。
  1. -v选项指定的路径,如果不存在,挂载时会自动创建。
  2. docker run -it --name vm1 \ /etc/yum.repos.d/dvd.repo:/etc/yum.repos.d/dvd.repo:ro rhel7 bash
复制代码
2、docker managed volume

bind mount必须指定host文件系统路径,限定了移植性。
docker managed volume不需要指定mount源,docker自动为容器创建数据卷目录。默认创建的数据卷目录都在 /var/lib/docker/volumes 中。
如果挂载时指向容器内已有的目录,容器内原有数据会被复制到volume中。
创建卷方式:
  1. [root@server1 ~]# docker volume create webdata                #创建一个名为webdata的卷
  2. [root@server1 ~]# docker rm -f demo                #把上面创建的卷删掉
  3. [root@server1 ~]# docker run -d --name demo -v webdata:/usr/share/nginx/html nginx               
  4. #把webdata这个卷挂载到容器内的/usr/share/nginx/html目录上并运行一个容器
复制代码
将创建的webdata卷挂载到容器的/usr…目录下

进入docker默认创建的数据卷目录检察卷里的内容,我们可以看到上面只创建了卷,没有写入任何东西,但卷里有内容是由于挂载时容器内指定目录里原本有东西,以是复制过来的

我们运行容器使用的是nginx镜像,访问一下,没有题目

如果挂载时没指定mount源,那么docker会自动随机创建一个文件名很长的卷
  1. [root@server1 ~]# docker rm -f demo
  2. [root@server1 ~]# docker run -d --name demo -v /usr/share/nginx/html nginx
  3. 67ab13a7b24c19c53f4ce117136b9d0e4dec93c615a0192ead919d10e6c2acae
复制代码
我们使用docker inspect demo命令检察下卷的源目录

得到路径后就可以检察目录下的内容了
  1. ls /var/lib/docker/volumes/2ca22fd769e4b7b6f5a02dd96fe8d47a6df5578074c0d340ced3ab33b25456ca/_data
复制代码
bind mount 与 docker managed volume 对比
类似点:两者都是 host 文件系统中的某个路径。
不同点如图:

到此这篇关于Docker中的数据卷(volume)管理的两种方式的文章就介绍到这了,更多干系Docker数据卷volume内容请搜索草根技术分享以前的文章或继续欣赏下面的干系文章希望各人以后多多支持草根技术分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作