不知道大家在使用docker的时候有没有注意到卷挂载和绑定挂载的用法?再者,两者有什么区别?
接下来,我们将为你揭开它们的神秘面纱。
相似点首先说相似点:
卷和绑定挂载是持久化容器的机制。
区别我们来说说他们的区别:
卷由docker管理,而绑定挂载完全依赖于主机的目录结构和操作系统。
卷优于绑定的优势装载卷更易于备份和迁移。您可以通过docker客户端命令或docker api(例如,docker volume命令)来管理卷。卷可以在linux和windows容器中运行。可以在多个容器之间更安全地共享卷。卷驱动程序允许将卷存储在远程主机或云提供商上,以加密卷的内容或添加其他功能。新卷的内容可以由容器预先填充。Docker桌面上的卷比Mac和Windows主机上的绑定装载具有更高的性能。此外,与将数据保存到容器的可写层相比,卷通常是更好的选择,因为卷不会增加使用它的容器的大小,并且卷的内容存在于给定容器的生命周期之外。
也就是说,容器被移除后,卷中的内容仍然可以独立存在。
下图说明了卷和绑定装载以及容器之间的关系:
我们可以看到:
卷是docker的存储区域。绑定挂载与操作系统直接相关。下面,我们展示一些装载和使用卷的操作。
体积操作
创建容器,使用卷我们可以使用以下命令创建容器,使用卷
docker run -d \ --name devtest \ -v myvol2:/app \ nginx:latest where:-v选项,后面第一个参数myvol 2是卷名。如果容器使用该卷时该卷不存在,将自动创建该卷。
[root @ centos7 ~] # docker volume ls驱动程序卷名local myvol2 [root @ centos7 ~] #可以在docker主机上查看这个卷的具体路径。
[root @ centos 7 ~]# docker volume inspect myvol 2[{ " CreatedAt ":" 2022-08-23t 22:04:20-04:00 "," Driver": "local "," Labels": null," mount point ":"/var/lib/docker/volumes/myvol 2/_ data "," Name": "myvol2 "," Options": null," scope ":" local " }][root @ centos 7 ~]# mount point表示此卷在文件系统上的具体位置
容器通过:-v myvol2:/app在容器的/app目录下挂载卷。
[root @ centos 7 ~]# docker exec -it devtest df -hfile系统大小已用Avail Use % Mounted on overlay 50G 3.0G 48G 6%/TMPFS 64M 0 64M 0%/devtmpfs 1.4G 0 1.4G 0%/sys/fs/cgroupshm 64M 0 64M 0%/dev/shm/dev/mapper/centos -root 50G 3.0G 48G 6%/apptmpfs 1.4G 0 1.4G 0%
docker exec -it devtest bash -c " echo test & gt;/app/myfile.test "检查卷中的文件是否已创建。
[root @ centos 7 ~]# CD/var/lib/docker/volumes/myvol 2/_ data[root @ centos 7 _ data]# lsmy file . test[root @ centos 7 _ data]# catmy file . test[root @ centos 7 _ data]#是的,的确
注意:本卷内容的编写过程由docker管理。
查看容器中的装载信息
docker inspect devtest " Mounts ":[{ " Type ":" volume "," Name": "myvol2 "," Source ":"/var/lib/docker/volumes/myvol 2/_ data "," Destination": "/app "," Driver": "local "," mode": "z "," rw": true," propagation ":" }]您可以在Mounts部分查看信息:
Type: volumeSource:指主机上的特定目录位置。目的地:挂载路径驱动的驱动类型RW:容器中的卷:是读写模式吗?
停止容器,删除容器Docker停止devtestDocker RM devtest容器被删除,卷是否仍然存在?
[root@centos7 _data]# docker卷lsDRIVER卷名local myvol 2[root @ centos 7 _ data]# lsmy file . test[root @ centos 7 _ data]# catfile . testtest[root @ centos 7 _ data]#正如你所想,卷还在,里面写的内容还在。
移除volumedocker volume rm myvol2注意!
移除容器和移除卷是两个独立的操作。
使用容器填充卷的另一个非常重要的点是,如果卷被挂载在一个目录中,如果该目录中有文件或子目录,那么挂载后内容将被复制到卷中。
你这话是什么意思?
比如我们有一个镜像,/app目录下有一个a.log文件。
[root @ centos 7 test -volume]# LSA . log docker file[root @ centos 7 test -volume]# Cat a . log 12345612345[root @ centos 7 test -volume]# Cat docker file from nginx:latest run mkdir/app copya . log/app/a . log[root @ centos 7 test -volume]# # Build image docker Build -t vol:2。装载数据卷
docker run -D--name = vo3-vnginx -vo3:/appvol:2发现容器正在运行后,将/app目录下的文件复制到卷中。
[root @ centos 7 test -volume]# CD/var/lib/docker/volumes/nginx -vo3/_ data[root @ centos 7 _ data]# LSA . log[root @ centos 7 _ data]# cata . log 12345612345[root @这一点很有意思!我肯定你以前没关注过!
以只读模式装载卷如何以只读模式装载卷非常简单:
只需添加ro选项。
-v nginx -vol:/usr/share/nginx/html:ro示例:
docker run -d \ --name = nginxtest \ -v nginx -vol:/usr/share/nginx/html:ro \ nginx:最新查看容器的Mounts部分的信息。
docker inspect nginxtest " Mounts ":[{ " Type ":" volume "," Name": "nginx-vol "," Source ":"/var/lib/docker/volumes/nginx-vol/_ data "," Destination ":"/usr/share/nginx/html "," driver": "local "," mode": "ro "," rw": false," propagation ":" }]找到:" RW & quot:false,即非Read-Write的模式。
尝试向其中写入文件:
[root @ centos 7 ~]# docker exec -it nginxtest bash -c " echo 1234 & gt;/usr/share/nginx/html/1 . log " bash:line 1:/usr/share/nginx/html/1 . log:read -only file system[root @ centos 7 ~]#如你所料,会提示:只读文件系统。
好了,好了,我们讲完了体积原理和相关运算。接下来,我们需要看看绑定挂载。
绑定装载当使用绑定装载时,主机上的文件或目录被装载到容器上。或者,如果文件目录在主机上,它将被用作绝对路径。
相比之下,使用volume时,会在主机上的Docker存储目录中创建新目录,该目录的内容由Docker管理。
要挂载的文件或目录不需要已经存在于Docker主机上。如果它还不存在,请按需创建它。Bind mount的性能非常好,但是它们依赖于主机文件系统的特定目录结构。
建议:如果您正在开发一个新的Docker应用程序,请考虑使用命名卷。因为,对于bind mount,不能使用Docker CLI命令直接管理它。
使用bind mount启动容器。使用以下命令将容器挂载到主机的目录bind bindmount。
docker run -d \ -it \ --name dev test \ -v " $(PWD)"/target:/app \ nginx:latest检查容器的绑定挂载。
docker inspect devtest " Mounts ":[{ " Type ":" bind "," Source ":"/tmp/Source/target/target "," destination": "/app "," mode ":"," rw": true," propagation": "rprivate"}]可见。
Type:挂载的类型是bindsource:主机上的目录。当然,这里使用了变量$(pwd)来获取当前的工作目录。关闭并删除容器。
Docker容器停止开发测试Docker容器RM开发测试OK,下一点非常关键。如果绑定被挂载到容器中的非空目录,会发生什么?
绑定到容器的非空目录nginx image中的/usr/share/nginx/html非空,有登录页面。
docker run -d \ -it \ --name non -empty \ -v/tmp/soure/base:/usr/share/nginx/html \ NGX:latest[root @ centos 7 base]# docker exec -it non -emptyls/usr/share/nginx/html[root @ centos 7 base]#发现,挂载后为空,即覆盖了镜像中的内容。
这是和体积的巨大差异!立正!
好了,让我们在这里总结一下,以便您可以更好地理解卷和绑定类型装载之间的区别:
管理模式:卷由docker管理,可以操作docker客户端命令。bind不能装载容器中包含内容的目录,该宗卷将被拷贝。绑定挂载直接覆盖容器中的内容。绑定挂载可以设置绑定传播参数。您可以设置音量驱动程序。后面的文章将向您展示如何安装卷驱动程序来创建特定类型的卷,并实现多个节点之间的数据共享& middot& middot& middot& middot& middot& middot
关于docker的体积和bind mount的区别的这篇文章到此为止。关于Docker的卷和绑定挂载的更多信息,请搜索主机频道zhujipindao之前的文章。或者继续浏览下面的相关文章。希望大家支持主机频道zhujipindao。以后多来com!
评论前必须登录!
注册