启动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学习--数据卷相关推荐

  1. 【Docker学习笔记 五】深入理解Docker容器数据卷机制

    前几篇Blog是对Docker的一个入门和初识,本篇Blog开始就详细学习下一个新的理论基础概念:Volume,也就是容器数据卷,听起来名字高大上,实际上就是一个宿主机的目录而已,为什么需要容器数据卷 ...

  2. Docker系列 五.Docker容器数据卷

    五.Docker容器数据卷 环境&工具: 阿里云轻量级服务器.CentOS 7系统.FinalShell(其他连接客户端也可以) 是什么 docker的理念将运行的环境打包形成容器运行,运行可 ...

  3. docker基础---数据卷volumes

    1.数据卷 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性: 数据卷可以在容器之间共享和重用 对数据卷的修改会立马生效 对数据卷的更新,不会影响镜像 卷会一直存在 ...

  4. Docker容器数据卷讲解

    概述 为什么Docker需要容器数据卷技术:如果没有数据卷技术,比如一个由mysql镜像创建运行的容器,产生的数据就会保存在容器中,数据的生命周期与容器的生命周期一致,如果删除了该容器,相应的数据也会 ...

  5. docker和数据卷问题探究

    参考博文:Docker : 数据卷(创建.挂载.查看.删除) <Docker实践>第二版 <深入浅出Docker>

  6. Docker——Docker 容器数据卷(Volumes)

    Docker 容器数据卷 容器数据卷(Volumes) 容器数据卷概述 使用数据卷 实现mysql数据同步 具名挂载和匿名挂载 匿名挂载 具名挂载 DockerFile里写Volumes配置 多个数据 ...

  7. Docker 挂载数据卷、查看数据卷、清理数据卷

    Docker 挂载数据卷.查看数据卷.清理数据卷 创建容器并设置数据卷挂载 查看所有数据卷列表 查看`RabbitMQ`插件数据卷的具体信息 清除数据卷 创建容器并设置数据卷挂载 这里以允许Rabbi ...

  8. docker使用数据卷创建nginx容器

    docker使用数据卷创建nginx容器 //创建存放网站的和配置文件的目录 [root@docker ~]# mkdir -p /var/www/html [root@docker ~]# mkdi ...

  9. Docker 学习之 Docker 容器数据卷

    容器数据卷 什么是容器数据卷 docker 理念回顾 将应用和环境打包成一个镜像! 问题:数据?如果数据都在容器中,那么我们删除容器,数据就会丢失!需求:数据可以持久化! 容器之前可以有一个数据共享技 ...

  10. Docker : 数据卷(创建、挂载、查看、删除)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 数据卷 数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性: 数 ...

最新文章

  1. yolor 测试笔记
  2. ajax传值到ashx接收反序列
  3. 一些常用的CSS hack代码
  4. Java NIO总结
  5. python 查找算法_python快速查找算法应用实例
  6. Linux内存显示错误,使用mmap读取内存的内容,出现“Segmentation fault”错误,请
  7. 构造一条二次bezier曲线_那些处处连续,处处不可导的曲线
  8. 9.看板方法---建立输入节奏
  9. HP02: ssh: Could not resolve hostname hp02: Name or service not known HP01: ssh: Could not resolve h
  10. 使用R语言进行时间序列分析
  11. 分布式系统概念与设计——阅读笔记(一)
  12. C++ QT中国象棋双人单机对战代码总结
  13. 思科isis路由的优先级_通过改变 EIGRP 度量值设置优先路由
  14. html 磁贴自动布局,也来“玩”Metro UI之磁贴(一)_html/css_WEB-ITnose
  15. java 写出到文件
  16. 使用pip/pip3安装第三方模块,出现Cannot unpack file xxx的问题的解决以及pip安装速度慢或出现readtime out问题的解决。
  17. 去除input边框和去除当点击input框时显示的边框
  18. stata foreach循环语句的使用
  19. 位置关系C语言,C++/STL实现判断平面内两条线段的位置关系代码示例
  20. 【开发工具选集】遇到以下文件,用什么工具打开

热门文章

  1. N沟道MOSFET所需的高于电池的电源电压
  2. 基于Selenium爬取动态网页
  3. 视频编解码(一):ffmpeg编码H.264帧类型判断
  4. xp系统配置打印服务器,xp系统打印机纸张大小的自定义设置方法
  5. WinEdit10 添加论文引用,XeLaTex编译后论文中的引用变成了【?】
  6. Android 在mac上显示手机屏幕 MAC 投影 安卓手机
  7. 小白入门之HTML--第五章 块状元素,行内元素,盒子模型
  8. IDEA Unable to import maven project: See logs for details (maven的坑)
  9. 关于JSON的常见问题以及首字母大写的JSON
  10. Android穿山甲SDK激励视频