Docker中数据卷(volume)管理的两种⽅式
上篇⽂章给⼤家介绍过,今天给⼤家介绍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。
数据卷管理的两种⽅式
Docker的volume的本质是容器中⼀个特殊的⽬录。在容器的创建过程中,Docker会将宿主机上的指定⽬录(⼀个以volume ID为名称的⽬录,或者指定的宿主机⽬录)挂载到容器中指定的⽬录上(使⽤bing mount挂载⽅法),故挂载完成后的宿主机⽬录和容器内的⽬标⽬录表现⼀致。
1、绑定挂载bind mount
bind mount是将主机上的⽬录或⽂件mount到容器⾥。使⽤直观⾼效,易于理解。
使⽤-v选项指定挂载路径,格式<host path>:<container path>
#前⾯是宿主机真实存在的路径:后⾯是容器内的路径
后台运⾏⼀个使⽤nginx镜像的容器并将宿主机的/data⽬录挂载到容器的⽬录/usr/share/nginx/html下
[root@server1 ~]# docker run -d --name demo -v /data:/usr/share/nginx/html nginx
调到前台运⾏,分别查看宿主机和容器的指定的⽬录下的内容,是⼀样的。这是因为这种⽅式挂载和我们平时使⽤mount⽅式是⼀样的,原有数据隐藏,替换为宿主机的数据。
##/data⽬录下这么多东西是因为docker默认数据⽬录是/data
[root@server1 ~]# docker exec -it demo bash
bind mount默认权限是读写rw,可以在挂载时指定只读ro。
-v选项指定的路径,如果不存在,挂载时会⾃动创建。
docker run -it --name vm1 \ /pos.po:/pos.po:ro rhel7 bash
2、docker managed volume
bind mount必须指定host⽂件系统路径,限制了移植性。
docker managed volume不需要指定mount源,docker⾃动为容器创建数据卷⽬录。默认创建的数据卷⽬录都在
/var/lib/docker/volumes 中。
如果挂载时指向容器内已有的⽬录,容器内原有数据会被复制到volume中。
创建卷⽅式:
[root@server1 ~]# docker volume create webdata #创建⼀个名为webdata的卷
[root@server1 ~]# docker rm -f demo #把上⾯创建的卷删掉
[root@server1 ~]# docker run -d --name demo -v webdata:/usr/share/nginx/html nginx
#把webdata这个卷挂载到容器内的/usr/share/nginx/html⽬录上并运⾏⼀个容器
将创建的webdata卷挂载到容器的/usr…⽬录下
进⼊docker默认创建的数据卷⽬录查看卷⾥的内容,我们可以看到上⾯只创建了卷,没有写⼊任何东西,但卷⾥有内容是因为挂载时容器内指定⽬录⾥原本有东西,所以复制过来的
我们运⾏容器使⽤的是nginx镜像,访问⼀下,没有问题
如果挂载时没指定mount源,那么docker会⾃动随机创建⼀个⽂件名很长的卷
container容器用法[root@server1 ~]# docker rm -f demo
[root@server1 ~]# docker run -d --name demo -v /usr/share/nginx/html nginx
67ab13a7b24c19c53f4ce117136b9d0e4dec93c615a0192ead919d10e6c2acae
我们使⽤docker inspect demo命令查看下卷的源⽬录
得到路径后就可以查看⽬录下的内容了
ls /var/lib/docker/volumes/2ca22fd769e4b7b6f5a02dd96fe8d47a6df5578074c0d340ced3ab33b25456ca/_data
bind mount 与 docker managed volume 对⽐
相同点:两者都是 host ⽂件系统中的某个路径。
不同点如图:
到此这篇关于Docker中的数据卷(volume)管理的两种⽅式的⽂章就介绍到这了,更多相关Docker数据卷volume内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论