Docker容器数据卷原理及使用方法解析
什么是容器数据卷
如果数据都在容器中,一旦容器删除,数据就会丢失!
eg:mysql容器删了,就是我们常说的删库跑路。需求:数据可以持久化,即时删掉容器,我们的数据还在
容器直接可以有一个数据共享的技术!Docker容器产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器的目录挂载到linux上面!
总结:卷技术就是为了实现数据的持久化和同步操作,容器间也是可以数据共享的
使用数据卷
方式一:直接使用命令来挂载-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+foundmediamntoptprocrootrunsbinsrvsystmpusrvarvolume01 volume02
#启动同一个镜像名字是docker02 关联 docker01此时,docker01被称为数据卷容器
[root@localhost_data]#dockerrun-it--namedocker02--volumes-fromdocker01centos:1.0
[root@a89fb82eeeb5/]#ls
bindevetchomeliblib64lost+foundmediamntoptprocrootrunsbinsrvsystmpusrvarvolume01 volume02
#在容器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+foundmediamntoptprocrootrunsbinsrvsystmpusrvarvolume01 volume02
#进入该容器的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+foundmediamntoptprocrootrunsbinsrvsystmpusrvarvolume01 volume02
[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
结论:
容器之间配置信息传递,数据卷容器的生命周期一直持续到没有容器使用位置。
但是一旦持久化到本地,这个时候,本地的数据不会删除。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。