Docker容器数据卷原理及使用方法解析

Docker容器数据卷原理及使用方法解析,第1张

Docker容器数据卷原理及使用方法解析

本文主要介绍Docker容器数据卷的原理和用法分析。通过示例代码进行了非常详细的介绍,对大家的学习或工作有一定的参考价值。有需要的朋友可以参考一下。

什么是容器数据卷

如果所有的数据都在容器里,一旦容器被删除,数据就会丢失!

例:MySQL容器被删除,也就是我们常说的删库跑路。要求:数据可以持久化,容器可以立即删除。我们的数据还在
容器可以直接有数据共享技术!Docker容器生成的数据是本地同步的!

这就是滚技术!挂载目录,并在linux上挂载我们的容器的目录!

总结:卷技术是为了实现数据的持久化和同步化,数据可以在容器间共享。

使用数据卷

方法一:直接使用命令mount-v。

#命令 dockerrun-it-v主机的目录:容器内目录-p主机端口:容器端口 #测试 #主机home目录下为空 [root@bogonhome]#ls #启动contes镜像将主机的home与容器的home进行绑定 [root@bogonhome]#dockerrun-v/home:/home/-itcentos [root@8dc073caf39c/]#cdhome/ #容器home目录下为空 [root@8dc073caf39chome]#ls #在容器目录下创建test.java文件 [root@8dc073caf39chome]#touchtest.java [root@8dc073caf39chome]#ls test.java #切换到主机home目录后发现出现了test.java文件 [root@8dc073caf39chome]#[root@bogonhome]#ls test.java #在主机home目录下创建test2.java文件 [root@bogonhome]#touchtest2.java [root@bogonhome]#ls test2.javatest.java [root@bogonhome]#dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 8dc073caf39ccentos"/bin/bash"3minutesagoUp3minutesfocused_nobel #进入正在运行的容器 [root@bogonhome]#dockerexec-it8dc073caf39c/bin/bash #进入容器home目录 [root@8dc073caf39c/]#cdhome/ #发现存在test2.java文件 [root@8dc073caf39chome]#ls test.javatest2.java #通过inspect命令查看容器信息 [root@bogonhome]#dockerinspect8dc073caf39c "Mounts":[ { "Type":"bind", "Source":"/home",#主机目录 "Destination":"/home",#容器目录 "Mode":"", "RW":true, "Propagation":"rprivate" } ], ##结论:如果我们使用-v做了数据绑定 #1、容器停止,主机对数据做出修改容器启动后数据也会同步过来 #2、删除容器,主机该目录下数据还存在 ##好处:在使用了数据卷后,我们以后修改配置文件时,只需要在本地修改,容器内会自动同步

安装mysql

mysql的数据持久性

#-eMYSQL_ROOT_PASSWORD=my-secret-pw设置初始密码为my-secret-pw #官方命令:dockerrun--namesome-mysql-eMYSQL_ROOT_PASSWORD=my-secret-pw-dmysql:tag #测试 #解读 #-d后台运行 #-p3306:3306绑定端口 #-v/home/mysql/conf:/etc/mysql/conf.d数据卷挂载技术绑定mysql配置文件 #-v/home/mysql/data:/var/lib/mysql数据卷挂载技术绑定mysql数据 #-eMYSQL_ROOT_PASSWORD=123456环境配置---》设置mysql初始密码为123456 #--namemysql0给容器起名为mysql01 [root@bogonhome]#dockerrun-d-p3306:3306-v/home/mysql/conf:/etc/mysql/conf.d-v/home/mysql/data:/var/lib/mysql-eMYSQL_ROOT_PASSWORD=123456--namemysql01mysql 6d75b6312f725de2c71709116af5755604ea60cd073f1daf3755c578c1e64f57

命名和匿名装载

#匿名挂载 -v容器内路径! dockerrun-d-P--namenginx01-v/etc/nginxnginx #具名挂载 -v卷名:容器内路径 dockerrun-d-P--namenginx02-vjuming-nginx:/etc/nginxnginx #测试匿名挂载 [root@localhosttest]#dockerrun-d-P--namenginx01-v/etc/nginxnginx 214dab398d9997a730b970b6e3bb08fa7e39bbb0ca91ad59f6b3f235d8f1b9bc #查看所有volume的情况 [root@localhosttest]#dockervolumels DRIVERVOLUMENAME local2c22e1c50ff7330b815b692f8f71a1fca878209223846c95626f7efd9dc2a83b#匿名挂载 #测试具名挂载 #通过-v卷名:容器内路径 [root@localhosttest]#dockerrun-d-P--namenginx02-vjuming-nginx:/etc/nginxnginx a678d79886565601bf466ff41734cb5334bdaf9e881b9cbf11edb84e9d790251 #查看所有volume的情况 [root@localhosttest]#dockervolumels DRIVERVOLUMENAME local2c22e1c50ff7330b815b692f8f71a1fca878209223846c95626f7efd9dc2a83b#匿名挂载 localjuming-nginx#具名挂载 #查看某个数据卷的信息 #命令 dockervolumeinspect卷名 #所有docker容器内的卷在没有指定目录的情况下都在/var/lib/docker/volumes/XXX/_data [root@localhosttest]#dockervolumeinspectjuming-nginx [ { "CreatedAt":"2020-08-13T09:18:34+08:00", "Driver":"local", "Labels":null, "Mountpoint":"/var/lib/docker/volumes/juming-nginx/_data", "Name":"juming-nginx", "Options":null, "Scope":"local" } ] #我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在使用的----具名挂载 #如何确定是具名挂载还是匿名挂载还是指定路径挂载! #-v容器内路径#匿名挂载 #-v卷名:容器内路径#具名挂载 #-v主机路径:容器内路径#指定路径挂载

发展

#通过-v卷名:容器内路径:rorw改变读写权限 #ro--->readonly只读 #rw--->readwrite读写 dockerrun-d-P--namenginx01-vjuming-nginx:/etc/nginx:ronginx dockerrun-d-P--namenginx01-vjuming-nginx:/etc/nginx:ronginx

第一次见dockerfile

DockerFile是用于构建Docker映像的构建文件!命令脚本!先体验一下!

[root@localhostdocker-test-volume]#catdockerfile FORMcentos VOLUME["volume01","volume02"] CMDecho"-----end-----" CMD/bin/bash #构建 #命令dockerbuild-fshell脚本文件-t镜像名:版本号 [root@localhostdocker-test-volume]#dockerbuild-f/home/docker-test-volume/dockerfile1-tcentos:1.0. SendingbuildcontexttoDockerdaemon2.048kB Step1/4:FROMcentos --->0d120b6ccaa8 Step2/4:VOLUME["volume01","volume02"] --->Runningin4e6de7bc2f15 Removingintermediatecontainer4e6de7bc2f15 --->f9e48207902b Step3/4:CMDecho"-----end-----" --->Runninginb22adea363e5 Removingintermediatecontainerb22adea363e5 --->a7518e2e1c72 Step4/4:CMD/bin/bash --->Runninginae1b746bef6b Removingintermediatecontainerae1b746bef6b --->d840628c30a9 Successfullybuiltd840628c30a9 Successfullytaggedcentos:1.0 #查看镜像 [root@localhostoverlay2]#dockerimages REPOSITORYTAGIMAGEIDCREATEDSIZE centos1.0d840628c30a912minutesago215MB#我们自己生成的镜像 centoslatest0d120b6ccaa82daysago215MB #启动我们生成的镜像 [root@1af673cf9c88/]#dockerrun-itd840628c30a9/bin/bash [root@1af673cf9c88/]#ls-l total0 lrwxrwxrwx.1rootroot7May112019bin->usr/bin drwxr-xr-x.5rootroot360Aug1302:18dev drwxr-xr-x.1rootroot66Aug1302:18etc drwxr-xr-x.2rootroot6May112019home lrwxrwxrwx.1rootroot7May112019lib->usr/lib lrwxrwxrwx.1rootroot9May112019lib64->usr/lib64 drwx------.2rootroot6Aug921:40lost+found drwxr-xr-x.2rootroot6May112019media drwxr-xr-x.2rootroot6May112019mnt drwxr-xr-x.2rootroot6May112019opt dr-xr-xr-x.117rootroot0Aug1302:18proc dr-xr-x---.2rootroot162Aug921:40root drwxr-xr-x.11rootroot163Aug921:40run lrwxrwxrwx.1rootroot8May112019sbin->usr/sbin drwxr-xr-x.2rootroot6May112019srv dr-xr-xr-x.13rootroot0Aug1109:58sys drwxrwxrwt.7rootroot145Aug921:40tmp drwxr-xr-x.12rootroot144Aug921:40usr drwxr-xr-x.20rootroot262Aug921:40var drwxr-xr-x.2rootroot6Aug1302:18volume01#这是我们生成镜像的时候自动挂载的数据卷目录 drwxr-xr-x.2rootroot6Aug1302:18volume02 #这个卷和外部一定有一个同步的目录!我们来找一下 #1、根据容器id查询该容器的信息--》数据卷信息 #dockerinspect1af673cf9c88 #2、根据数据卷信息找到volume01对应的数据卷名称 #dockervolumeinspect8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3 #3、根据数据卷名称查询数据卷的信息--》找到linux中对应的目录 #dockervolumeinspect8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3 #在容器内部创建一个文件在数据卷volume01中创建了test.java文件 [root@1af673cf9c88volume01]#touchtest.java [root@1af673cf9c88volume01]#ls test.java #退出容器 [root@1af673cf9c88volume01]#exit exit #查看该容器的信息 [root@localhostoverlay2]#dockerinspect1af673cf9c88 #找到挂载卷volume01对应的的名字,即:8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3 "Mounts":[ { "Type":"volume", "Name":"8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3", "Source":"/var/lib/docker/volumes/8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3/_data", "Destination":"volume01", "Driver":"local", "Mode":"", "RW":true, "Propagation":"" }, { "Type":"volume", "Name":"046d0baa3cc0bc3540c5e7248808358371641bfba4e0bbd139c99fe851751da2", "Source":"/var/lib/docker/volumes/046d0baa3cc0bc3540c5e7248808358371641bfba4e0bbd139c99fe851751da2/_data", "Destination":"volume02", "Driver":"local", "Mode":"", "RW":true, "Propagation":"" } ], #根据数据卷名字8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3找到该卷在linux所在位置 [root@localhostoverlay2]#dockervolumeinspect8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3 [ { "CreatedAt":"2020-08-13T10:27:12+08:00", "Driver":"local", "Labels":null, "Mountpoint":"/var/lib/docker/volumes/8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3/_data", "Name":"8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3", "Options":null, "Scope":"local" } ] #在/var/lib/docker/volumes/8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3/_data/目录下找到我们的test.java文件 [root@localhostvolumes]#cd/var/lib/docker/volumes/8c3486526093c755785725111b4063cd93a5ba88f9c2ac09f45741a0f1d08fd3/_data/ [root@localhost_data]#ls test.java

数据卷容器

多个mysql数据同步!

#通过--volumes-from容器名实现容器间的数据共享 #启动一个镜像名字是docker01 [root@localhost_data]#dockerrun-it--namedocker01centos:1.0/bin/bash [root@a85fbed0ebc9/]#ls bindevetchomeliblib64lost+foundmediamntoptprocrootrunsbinsrvsystmpusrvarvolume01volume02 #启动同一个镜像名字是docker02关联docker01此时,docker01被称为数据卷容器 [root@localhost_data]#dockerrun-it--namedocker02--volumes-fromdocker01centos:1.0 [root@a89fb82eeeb5/]#ls bindevetchomeliblib64lost+foundmediamntoptprocrootrunsbinsrvsystmpusrvarvolume01volume02 #在容器docker02的volume01目录下创建test.txt [root@a89fb82eeeb5/]#cdvolume01/ [root@a89fb82eeeb5volume01]#ls [root@a89fb82eeeb5volume01]#touchtest.txt [root@a89fb82eeeb5volume01]#ls test.txt #查看容器信息 [root@a89fb82eeeb5volume01]#[root@localhost_data]#dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES a89fb82eeeb5centos:1.0"/bin/sh-c/bin/bash"AboutaminuteagoUpAboutaminutedocker02 a85fbed0ebc9centos:1.0"/bin/bash"4minutesagoUp4minutesdocker01 #进入容器名为docker01的容器 [root@localhost_data]#dockerexec-ita85fbed0ebc9/bin/bash [root@a85fbed0ebc9/]#ls bindevetchomeliblib64lost+foundmediamntoptprocrootrunsbinsrvsystmpusrvarvolume01volume02 #进入该容器的volume01目录下 [root@a85fbed0ebc9/]#cdvolume01/ #发现test.txt文件 [root@a85fbed0ebc9volume01]#ls test.txt #创建test01.txt [root@a85fbed0ebc9volume01]#touchtest01.txt [root@a85fbed0ebc9volume01]#ls test.txttest01.txt #进入容器名为docker02的容器 [root@localhost_data]#dockerexec-ita89fb82eeeb5/bin/bash [root@a89fb82eeeb5/]#ls bindevetchomeliblib64lost+foundmediamntoptprocrootrunsbinsrvsystmpusrvarvolume01volume02 [root@a89fb82eeeb5/]#cdvolume01/ #发现test01.txt文件 [root@a89fb82eeeb5volume01]#ls test.txttest01.txt #启动同一个镜像名字是docker03关联docker01 [root@localhost_data]#dockerrun-it--namedocker03--volumes-fromdocker01centos:1.0 #进入volume01目录下发现test.txttest01.txt文件 [root@11d93f9bcd89/]#cdvolume01/ [root@11d93f9bcd89volume01]#ls test.txttest01.txt #测试过程:1、运行centos:1.0镜像容器名为docker01 #2、运行centos:1.0镜像容器名为docker02通过--volumes-fromdocker01与其进行数据共享 #3、运行centos:1.0镜像容器名为docker03通过--volumes-fromdocker01与其进行数据共享 #4、运行centos:1.0镜像容器名为docker04通过--volumes-fromdocker03与其进行数据共享 #5、运行centos镜像容器名为docker05通过--volumes-fromdocker03与其进行数据共享 #经过测试发现: #1、在任何一个容器的volume01目录中添加文件,其他四个容器中的该目录都会出现添加的这个文件,进行数据共享 #2、停止并删除容器名为docker01的容器,其他四个容器中volume01目录下的文件还存在 #3、停止并删除容器名为docker01的容器,向其他四个容器任意一个容器的volume01目录下添加文件,其余三个容器也会做数据共享 #4、各个容器中的数据卷名称不同,但是对应同一个linux系统中数据目录;即各个容器中的数据卷目录都指向linux系统中同一个数据目录 [root@localhost_data]#dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 78cd51a35c41centos"/bin/bash"17minutesagoUp17minutestrusting_tharp e6e0988c50cdcentos"/bin/bash"17minutesagoUp17minutesdocker05 c5ebc03e6819centos:1.0"/bin/sh-c/bin/bash"19minutesagoUp19minutesdocker04 11d93f9bcd89centos:1.0"/bin/sh-c/bin/bash"22minutesagoUp22minutesdocker03 a89fb82eeeb5centos:1.0"/bin/sh-c/bin/bash"31minutesagoUp31minutesdocker02 [root@localhost_data]#dockerinspecte6e0988c50cd "Mounts":[ { "Type":"volume", "Name":"fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62", "Source":"/var/lib/docker/volumes/fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62/_data", "Destination":"volume01", "Driver":"local", "Mode":"", "RW":true, "Propagation":"" }, ] [root@localhost_data]#dockerinspectc5ebc03e6819 "Mounts":[ { "Type":"volume", "Name":"fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62", "Source":"/var/lib/docker/volumes/fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62/_data", "Destination":"volume01", "Driver":"local", "Mode":"", "RW":true, "Propagation":"" }, ] [root@localhost_data]#dockerinspect11d93f9bcd89 "Mounts":[ { "Type":"volume", "Name":"fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62", "Source":"/var/lib/docker/volumes/fc54c991eea888057575be45a03fe22a32303a6b1239a0a4099dd201b0b41a62/_data", "Destination":"volume01", "Driver":"local", "Mode":"", "RW":true, "Propagation":"" }, ]

多个mysql实现数据共享

dockerrun-d-p3306:3306-v/etc/MYSQL/conf.d-v/var/lib/MYSQL-eMYSQL_ROOT_PASSWORD=123456-nameMYSQL01MYSQL
dockerrun-d-p3306:3306-eMYSQL_ROOT_PASSWORD=123456-nameMYSQL02-volumes-fromMYSQL01MYSQL

结论:

配置信息在容器之间传递,数据卷容器的生命周期一直持续到没有容器可用为止。

但是一旦本地持久化,此时本地数据将不会被删除。

这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/774364.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-03
下一篇 2022-05-03

发表评论

登录后才能评论

评论列表(0条)

保存