docker学习--数据卷
启动docker容器:systemctl start docker 创建数据卷: [root@192 docker]# docker volume create testA testA 查看docker创建的数据卷:docker创建的数据卷其实是宿主机的某个目录 [root@192 docker]# docker volume ls DRIVER VOLUME NAME local testA 查看对应数据卷的信息: [root@192 docker]# docker volume inspect testA [{"CreatedAt": "2022-10-13T05:00:54+08:00","Driver": "local","Labels": {},"Mountpoint": "/var/lib/docker/volumes/testA/_data","Name": "testA","Options": {},"Scope": "local"} ] 卷其实就是宿主机中的某个目录,从上面的信息可以看出,testA可以看出,testA其实就是宿主机中的/var/lib/docker/volumes/testA/_data目录,在linux的docker主机中创建一个卷时,器对应的目录路径就是/var/lib/docker/volumes/testA/_data,卷是docker的,对应这个宿主机linux中的一个目录。 试一下这个目录能否进去以及底下是否有内容 [root@192 docker]# cd /var/lib/docker/volumes/testA/_data [root@192 _data]# ls [root@192 _data]# 可以看到这个目录底下没有任何内容 下面我们尝试将容器与数据卷进行关联; 拉取镜像alpine镜像: [root@192 _data]# docker pull alpine Using default tag: latest latest: Pulling from library/alpine 213ec9aee27d: Downloading latest: Pulling from library/alpine 213ec9aee27d: Pull complete Digest: sha256:bc41182d7ef5ffc53a40b044e725193bc10142a1243f395ee852a8d9730fc2ad Status: Downloaded newer image for alpine:latest docker.io/library/alpine:latest 查看docker中的镜像: docker images REPOSITORY TAG IMAGE ID CREATED SIZE alpine latest 9c6f07244728 2 months ago 5.54MB centos 7 eeb6ee3f44bd 13 months ago 204MB 在镜像上创建测试容器,并且让这个测试容器使用testA卷 [root@192 docker]# docker run -td --name testAcon --volume testA:/data alpine 9efc5d05d7377f3a0e4ea10bd38198d37772b2fca0594dd17b2b88d34705aef8 上述命令表示创建一个名为testA的容器,将testA卷映射到testAcon容器的/data目录中,--volume选项就是用来映射卷和容器目录的, --volume testA:/data表示将testA卷映射到容器的/data目录,上例是基于alpine镜像创建的容器,alpine镜像中默认石美玉/data目录的,当卷映射的目录在容器中不存在时,会自动在容器中创建对应的目录,容器创建后,进给容器的data目录,创建一个名为A.log的文件: [root@192 ~]# docker exec -it testAcon sh / # ls bin data dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var / # cd data /data # ls A.log /data # echo 'aaaa' > A.log /data # cat A.log aaaa 回到宿主机,查看/var/lib/docker/volumes/testA/_data目录,发现多了一个A.log文件,这个文件正是我们在容器中创建的A.log [root@192 ~]# cd /var/lib/docker/volumes/testA/_data [root@192 _data]# ls A.log [root@192 _data]# cat A.log aaaa 改变容器中data目录下的A.log内容,会发现宿主机下对应的目录会发生改变 #改变容器中的内容,aaaa->dddd /data # echo 'dddd' > A.log /data # cat A.log dddd #查看宿主机的对应目录,内容也发生了变化 [root@192 ~]# cd /var/lib/docker/volumes/testA/_data [root@192 _data]# ls A.log [root@192 _data]# cat A.log dddd #改变宿主机/var/lib/docker/volumes/testA/_data下的目录看是否容器中data目录下的A.log内容 [root@192 ~]# cd /var/lib/docker/volumes/testA/_data [root@192 _data]# ls A.log [root@192 _data]# echo '12345' -> A.log [root@192 _data]# cat A.log 12345 - #查看容器中的目录 / # cd data /data # cat A.log 12345 - 可以看当宿主机中的内容发生变化,对应的容器中的A.log也会发生变化,因为它们时同一个文件 现在停止并且删除容器,会发现宿主机中的A.log文件仍然存在 /data # exit [root@192 docker]# docker stop testAcon testAcon [root@192 docker]# docker rm testAcon testAcon #查看宿主机中文件是否存在,文件依然存在 [root@192 _data]# ls A.log [root@192 _data]# cat A.log 12345 - 这就是我们要的效果,容器产生的数据不能随容器删除,任然保留下来,以便随时可以继续使用,比如,我再创建一个新的容器,任然使用这个容器卷中的而数据 #--volume可以简写成 -v [root@192 docker]# docker run -td --name testcon -v testA:/data alpine 028602fa5abebc6d1585d7e40089ff8ede2e983cc6115d981314a3a5f10e24e8 [root@192 docker]# docker exec -it testcon sh / # cd data /data # ls A.log 可以看到,testA卷中的数据可以直接在testBcon中访问到 当把容器映射到目录时,剋理解为把卷对于的宿主机目录挂载到容器的目录中,卷虽然可以映射到容器的目录中,但其实是独立于容器之外额,当我们使用docker commit命令基于容器A创建镜像时,如果容器A使用了某个卷,卷中的数据并不会随容器A被提交,即新创建的镜像中并不会包含容器A对应卷中的数据 一个容器使用多个卷,只需要使用-v多次指定即可 [root@192 docker]# docker run -td --name testcon2 -v testA:/data -v testB:/var/log alpine bd97e69ac22a8c46c97193549a76f92efdea30fb6dd635847624a621fb6cc42b [root@192 docker]# docker volume ls DRIVER VOLUME NAME local 3a013d85bbae342e48115c44183398dcb1dff401e628f61b1f4eeb0e8248e710 local 663b065945b00c691e5f619332e1700d3450dc80a66a757783d17c2d6f1a69cf local testA local testB 可以看到,我们并没有提前使用docker volume create命令创建数据卷,而是直接在docker run命令中指定了名为testB的卷,可以看到,docker自动创建了数据卷testB ============================================匿名卷&命名卷&绑定挂载============================================= 匿名卷(Anonymous volume):在使用--volume选项或者-v选项省略卷名,只指定一个容器中目录,docker自动创建一个新的卷,并为这个卷生成一个ID,这中叫做匿名卷,匿名卷由于没有卷名,但是可以使用id作为卷名映射其他容器中的某个目录中 命名卷(Named volume):对应的创建容器时给出具体卷名的就是命名卷 无论是匿名挂载还是命名挂载,他们都存放在/var/lib/docker/volumes,这个目录是固定的,宿主机的目录位置仍然是/var/lib/docker/volumes/卷名(卷ID)/_data 绑定挂载(bind mounts):绑定挂载不会生成任何卷,他直接将指定的宿主机目录映射到容器中,所以,docker volume命令无法查看或挂历到绑定挂载的路径。官方建议使用卷,使用绑定挂载可以将宿主机中的文件直接挂载到容器中,比如将宿主机中的/etc/locatime文件映射到容器中的/etc/locatime文件 使用绑定挂载通常就是为了将宿主机中的配置文件挂载到容器中,如果时整个目录的数据,建议使用卷,卷只能映射目录,不能映射文件即使通过绑定挂载将宿主机的单个文件挂载到容器中,基于容器通过docker commit创建出新的镜像后,新镜像中也不会包含对应文件的数据的(空内容)。 #匿名挂载 [root@192 docker]# docker run -td --name testconc -v /data alpine 2fe45b3ab22a41ad54393d6b9513671b515a1b7bff58e5afd888c4919cea56d7 #138a958c673e8f3b21b32bfa7f9adadbf3843725a255175977d1bfb9426c1b54卷ID [root@192 docker]# docker volume ls DRIVER VOLUME NAME local 3a013d85bbae342e48115c44183398dcb1dff401e628f61b1f4eeb0e8248e710 local 138a958c673e8f3b21b32bfa7f9adadbf3843725a255175977d1bfb9426c1b54 local 663b065945b00c691e5f619332e1700d3450dc80a66a757783d17c2d6f1a69cf local testA local testB [root@192 docker]# docker volume inspect 138a958c673e8f3b21b32bfa7f9adadbf3843725a255175977d1bfb9426c1b54 [{"CreatedAt": "2022-10-13T23:59:48+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/138a958c673e8f3b21b32bfa7f9adadbf3843725a255175977d1bfb9426c1b54/_data","Name": "138a958c673e8f3b21b32bfa7f9adadbf3843725a255175977d1bfb9426c1b54","Options": null,"Scope": "local"} ] docker volume rm命令删除卷,删除卷需确保卷没有被任何容器引用,如果容器使用了对应的卷,会提示无法删除,需先删除对应的容器 [root@192 docker]# docker volume rm testB Error response from daemon: remove testB: volume is in use - [bd97e69ac22a8c46c97193549a76f92efdea30fb6dd635847624a621fb6cc42b] [root@192 docker]# docker stop bd97e69ac22a8c46c97193549a76f92efdea30fb6dd635847624a621fb6cc42b bd97e69ac22a8c46c97193549a76f92efdea30fb6dd635847624a621fb6cc42b [root@192 docker]# docker rm bd97e69ac22a8c46c97193549a76f92efdea30fb6dd635847624a621fb6cc42b bd97e69ac22a8c46c97193549a76f92efdea30fb6dd635847624a621fb6cc42b [root@192 docker]# docker volume rm testB testB 批量删除卷:docker volume prune,可以批量删除所有的没有被任何容器使用的卷 [root@localhost docker]# docker volume ls DRIVER VOLUME NAME local 3a013d85bbae342e48115c44183398dcb1dff401e628f61b1f4eeb0e8248e710 local 138a958c673e8f3b21b32bfa7f9adadbf3843725a255175977d1bfb9426c1b54 local 663b065945b00c691e5f619332e1700d3450dc80a66a757783d17c2d6f1a69cf local testA #删除testA和138a958c673e8f3b21b32bfa7f9adadbf3843725a255175977d1bfb9426c1b54对应的容器 [root@localhost docker]# docker volume prune WARNING! This will remove all local volumes not used by at least one container. Are you sure you want to continue? [y/N] y Deleted Volumes: 138a958c673e8f3b21b32bfa7f9adadbf3843725a255175977d1bfb9426c1b54 testATotal reclaimed space: 8B [root@localhost docker]# docker volume ls DRIVER VOLUME NAME local 3a013d85bbae342e48115c44183398dcb1dff401e628f61b1f4eeb0e8248e710 local 663b065945b00c691e5f619332e1700d3450dc80a66a757783d17c2d6f1a69cf 可以看到,没有使用的卷被删除匿名卷和命名卷相比,多了个自动删除的特性,当匿名卷与docker run 命令的--rm选项配合使用时,如果容器被停止删除,匿名卷也会被自动删除,当docker run 命令的--rm选项的作用,--rm选项表示容器停止时,自动删除对应的容器 [root@localhost docker]# docker run --rm -td --name test5 -v /data alpine b2eaacb3ee15691efbf2ef9f2d2ba449c3aa3668533dc644f0bc2d8ef5d16882 [root@localhost docker]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b2eaacb3ee15 alpine "/bin/sh" 12 seconds ago Up 11 seconds test5 cbc03f2ff37a postgres "docker-entrypoint.s…" 18 hours ago Up 9 minutes 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp postgres e000c8e41801 mysql "docker-entrypoint.s…" 23 hours ago Exited (0) 17 hours ago mysql01 [root@localhost docker]# docker volume ls DRIVER VOLUME NAME local 3a013d85bbae342e48115c44183398dcb1dff401e628f61b1f4eeb0e8248e710 local 663b065945b00c691e5f619332e1700d3450dc80a66a757783d17c2d6f1a69cf local 9606f850ea8ec1a9a8c8da265fa010728819bf8f4ab7005d4878bfcc05668aa4 #停止容器 [root@localhost docker]# docker stop test5 test5 [root@localhost docker]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cbc03f2ff37a postgres "docker-entrypoint.s…" 18 hours ago Up 10 minutes 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp postgres e000c8e41801 mysql "docker-entrypoint.s…" 23 hours ago Exited (0) 17 hours ago mysql01 [root@localhost docker]# docker volume ls DRIVER VOLUME NAME local 3a013d85bbae342e48115c44183398dcb1dff401e628f61b1f4eeb0e8248e710 local 663b065945b00c691e5f619332e1700d3450dc80a66a757783d17c2d6f1a69cf查看容器使用了那些卷 docker inspect testconc 可以使用简化命令:docker inspect testconc -f '{{.Mounts}}' [root@192 docker]# docker inspect testconc -f '{{.Mounts}}' [{volume 138a958c673e8f3b21b32bfa7f9adadbf3843725a255175977d1bfb9426c1b54 /var/lib/docker/volumes/138a958c673e8f3b21b32bfa7f9adadbf3843725a255175977d1bfb9426c1b54/_data /data local true }] 查看数据卷被那些容器使用: [root@192 docker]# docker ps -a -f "volume=testA" CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 028602fa5abe alpine "/bin/sh" About an hour ago Up About an hour testcon 绑定挂载:任然使用-volume或者-v: #在宿主机root目录下创建b.log文件 [root@localhost ~]# echo 'ysjd' > b.log [root@localhost ~]# ls anaconda-ks.cfg b.log root [root@localhost ~]# cat b.log ysjd #创建容器绑定挂载 [root@localhost docker]# docker run -td --name test6 -v /root:/data alpine e3d38e92336b040375cad8499897149dbe5cbfb743ad283153be472b517744c0 [root@localhost docker]# docker exec -it test6 sh / # cd data /data # cat b.log ysjd 拓展:--volumes-from 选项可以让一个容器去使用另一个容器的卷,比如: 容器A使用了两个卷,当我们创建容器B时,明确告诉容器B:“容器A用了哪些卷,你就用哪些卷”,就好像让B去抄A的作业一样,示例如下:[root@localhost docker]# docker run -td --name test8 -v /root/root/java/log:/data/log alpine d37fa5be68cacf2bdfc1c32720279622c50e03847fe8852ecf21cd4fb11de742[root@localhost docker]# docker run -td --name test9 --volumes-from test8 alpine c106d315f33f02b87dfe188d64c0b4943f3db99ecf1667e0ef8932db2370fabd [root@localhost docker]# docker exec -it test9 sh / # cat /data/log/a.log hhhh #查看容器test8和test9两个容器的挂载路径 [root@localhost docker]# docker inspect test8 -f '{{.Mounts}}' [{bind /root/root/java/log /data/log true rprivate}] [root@localhost docker]# docker inspect test9 -f '{{.Mounts}}' [{bind /root/root/java/log /data/log true rprivate}] --mount选项的写法似乎更加清晰,在--mount选项中,type用于指定挂载类型,上例中的type=volume表示使用卷,type=bind表示使用绑定挂载,无论是命名卷还是匿名卷,都使用type=volume,当使用卷时,如果使用的是命名卷,就使用source参数指定对应的卷名,如果使用匿名卷,则省略source参数,target参数用于指定将卷或者宿主机目录挂载到容器的哪个目录上,如果使用绑定挂载,source参数对应宿主机上的目录。source参数可以写成src,target参数可以写成dst或者destination,即如下两条命令是等效的。 [root@localhost docker]# docker run --rm -td --name test4 --mount type=volume,src=testB,dst=/data alpine aadcb4db39f289d7fcb17dbca188ecc9dd542f81f6164d470cd14280f4336bfa 结束!!!
docker学习--数据卷相关推荐
- 【Docker学习笔记 五】深入理解Docker容器数据卷机制
前几篇Blog是对Docker的一个入门和初识,本篇Blog开始就详细学习下一个新的理论基础概念:Volume,也就是容器数据卷,听起来名字高大上,实际上就是一个宿主机的目录而已,为什么需要容器数据卷 ...
- Docker系列 五.Docker容器数据卷
五.Docker容器数据卷 环境&工具: 阿里云轻量级服务器.CentOS 7系统.FinalShell(其他连接客户端也可以) 是什么 docker的理念将运行的环境打包形成容器运行,运行可 ...
- docker基础---数据卷volumes
1.数据卷 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性: 数据卷可以在容器之间共享和重用 对数据卷的修改会立马生效 对数据卷的更新,不会影响镜像 卷会一直存在 ...
- Docker容器数据卷讲解
概述 为什么Docker需要容器数据卷技术:如果没有数据卷技术,比如一个由mysql镜像创建运行的容器,产生的数据就会保存在容器中,数据的生命周期与容器的生命周期一致,如果删除了该容器,相应的数据也会 ...
- docker和数据卷问题探究
参考博文:Docker : 数据卷(创建.挂载.查看.删除) <Docker实践>第二版 <深入浅出Docker>
- Docker——Docker 容器数据卷(Volumes)
Docker 容器数据卷 容器数据卷(Volumes) 容器数据卷概述 使用数据卷 实现mysql数据同步 具名挂载和匿名挂载 匿名挂载 具名挂载 DockerFile里写Volumes配置 多个数据 ...
- Docker 挂载数据卷、查看数据卷、清理数据卷
Docker 挂载数据卷.查看数据卷.清理数据卷 创建容器并设置数据卷挂载 查看所有数据卷列表 查看`RabbitMQ`插件数据卷的具体信息 清除数据卷 创建容器并设置数据卷挂载 这里以允许Rabbi ...
- docker使用数据卷创建nginx容器
docker使用数据卷创建nginx容器 //创建存放网站的和配置文件的目录 [root@docker ~]# mkdir -p /var/www/html [root@docker ~]# mkdi ...
- Docker 学习之 Docker 容器数据卷
容器数据卷 什么是容器数据卷 docker 理念回顾 将应用和环境打包成一个镜像! 问题:数据?如果数据都在容器中,那么我们删除容器,数据就会丢失!需求:数据可以持久化! 容器之前可以有一个数据共享技 ...
- Docker : 数据卷(创建、挂载、查看、删除)
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 数据卷 数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性: 数 ...
最新文章
- yolor 测试笔记
- ajax传值到ashx接收反序列
- 一些常用的CSS hack代码
- Java NIO总结
- python 查找算法_python快速查找算法应用实例
- Linux内存显示错误,使用mmap读取内存的内容,出现“Segmentation fault”错误,请
- 构造一条二次bezier曲线_那些处处连续,处处不可导的曲线
- 9.看板方法---建立输入节奏
- HP02: ssh: Could not resolve hostname hp02: Name or service not known HP01: ssh: Could not resolve h
- 使用R语言进行时间序列分析
- 分布式系统概念与设计——阅读笔记(一)
- C++ QT中国象棋双人单机对战代码总结
- 思科isis路由的优先级_通过改变 EIGRP 度量值设置优先路由
- html 磁贴自动布局,也来“玩”Metro UI之磁贴(一)_html/css_WEB-ITnose
- java 写出到文件
- 使用pip/pip3安装第三方模块,出现Cannot unpack file xxx的问题的解决以及pip安装速度慢或出现readtime out问题的解决。
- 去除input边框和去除当点击input框时显示的边框
- stata foreach循环语句的使用
- 位置关系C语言,C++/STL实现判断平面内两条线段的位置关系代码示例
- 【开发工具选集】遇到以下文件,用什么工具打开
热门文章
- N沟道MOSFET所需的高于电池的电源电压
- 基于Selenium爬取动态网页
- 视频编解码(一):ffmpeg编码H.264帧类型判断
- xp系统配置打印服务器,xp系统打印机纸张大小的自定义设置方法
- WinEdit10 添加论文引用,XeLaTex编译后论文中的引用变成了【?】
- Android 在mac上显示手机屏幕 MAC 投影 安卓手机
- 小白入门之HTML--第五章 块状元素,行内元素,盒子模型
- IDEA Unable to import maven project: See logs for details (maven的坑)
- 关于JSON的常见问题以及首字母大写的JSON
- Android穿山甲SDK激励视频