Docker基础学习之数据管理
前言
docker容器中管理数据主要有两种方式,数据卷(DataVolumes)和数据卷容器(DataVolumeContainers),下面我们详细介绍Docker中的数据管理,有需要的一起来学习学习吧。
数据卷
数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:
数据卷可以在容器之间共享和重用;
对数据卷的修改会立马有效;
对数据卷的更新,不会影响镜像;
卷会一直存在,直到没有容器使用。
数据卷的使用,类似于Linux下对目录或文件进行mount操作。
挂载本地的目录到容器里
[root@localhost~]#dockerimages REPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZE registrylatest5c929a8b587a29hoursago33.27MB genesis_centoslatest85bc3a58f1345daysago277.6MB 192.168.1.179:5000/busyboxlatest9967c5ad88de12daysago1.093MB busyboxlatest9967c5ad88de12daysago1.093MB centos-6-x86latest8fca9486a39b13daysago341.3MB centos_with_netlatest3e8ea8607f084weeksago294.9MB centoslatest9baab0af79c46weeksago196.7MB [root@localhost~]#ls/data/ ls:无法访问/data/:没有那个文件或目录 [root@localhost~]#mkdir/data/ [root@localhost~]#dockerrun-itd-v/data/:/data1centosbash 096460f831bfd72b2efc6ba6b7e7bb060152afa49506ef26e0fa3cb03974f8d5
-v用来指定挂载目录
“:”前面的/data/为本地目录
“:”后面的/data1/为容器里的目录
[root@localhost~]#touch/data/1.txt [root@localhost~]#echo"test">/data/1.txt [root@localhost~]#dockerexec-it09646bash [root@096460f831bf/]#df-h FilesystemSizeUsedAvailUse%Mountedon /dev/mapper/docker-253:0-1447735-096460f831bfd72b2efc6ba6b7e7bb060152afa49506ef26e0fa3cb03974f8d59.8G231M9.0G3%/ tmpfs936M0936M0%/dev shm64M064M0%/dev/shm /dev/mapper/VolGroup-lv_root35G6.0G28G18%/data1 [root@096460f831bf/]#ls/data1/ 1.txt [root@096460f831bf/]#cat/data1/1.txt test [root@096460f831bf/]#touch/data1/2.txt [root@096460f831bf/]#exit exit [root@localhost~]#ls/data/ 1.txt2.txt
不管是把容器停掉、还是删除,数据还是存在的
[root@localhost~]#dockerstop09646 09646 [root@localhost~]#ls/data/ 1.txt2.txt [root@localhost~]#dockerrm09646 09646 [root@localhost~]#ls/data/ 1.txt2.txt
挂载数据卷
[root@localhost~]#dockerrun-itd-v/data/:/data1centosbash e136b27a8e177d878e76c60aafade32df947a60f77b3f95dcaf0680b7ffbc6e8 [root@localhost~]#dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES e136b27a8e17centos"bash"14secondsagoUp13secondstender_euclid
其实挂载目录的时候可以指定容器name,如果不指定就随机定义了。比如上面我们没有指定它,就生成了一个名字为tender_euclid,这个名字可以使用命令Dockerps看最右侧一列。
[root@localhost~]#dockerrun-itd--volumes-fromtender_euclidcentosbash 3222c7c5c45687e0650b699a9291bc50ecc85030acf8f388c1c6a50b0dc67164
这样我们使用centos镜像创建了新的容器,并且使用了tender_euclid容器的数据卷。
[root@localhost~]#dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 3222c7c5c456centos"bash"26secondsagoUp25secondssick_albattani e136b27a8e17centos"bash"6minutesagoUp6minutestender_euclid [root@localhost~]#dockerexec-it3222bash [root@3222c7c5c456/]#df-h FilesystemSizeUsedAvailUse%Mountedon /dev/mapper/docker-253:0-1447735-3222c7c5c45687e0650b699a9291bc50ecc85030acf8f388c1c6a50b0dc671649.8G231M9.0G3%/ tmpfs936M0936M0%/dev shm64M064M0%/dev/shm /dev/mapper/VolGroup-lv_root35G6.0G28G18%/data1 [root@3222c7c5c456/]#ls/data1/ 1.txt2.txt [root@3222c7c5c456/]#touch/data1/3.txt [root@3222c7c5c456/]#ls-l/data1/ total4 -rw-r--r--.1rootroot5Oct2005:531.txt -rw-r--r--.1rootroot0Oct2005:592.txt -rw-r--r--.1rootroot0Oct2006:313.txt [root@3222c7c5c456/]#exit exit [root@localhost~]#ls/data/ 1.txt2.txt3.txt
数据卷容器
定义数据卷容器
有时候,我们需要多个容器之间相互共享数据,类似于linux里面的NFS。所以就可以搭建一个专门的数据卷容器,然后其他容器直接挂载该数据卷。
首先建立数据卷容器
[root@localhost~]#dockerrun-itd-v/data/--namecent_testvcentosbash fb45150dbc218e71ff07eca44be3603e004e01b94effcca14c2bd8b3a998f096
注意:这里的/data/是容器的/data目录,并非本地的/data/目录
[root@localhost~]#dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES fb45150dbc21centos"bash"8minutesagoUp8minutescent_testv 3222c7c5c456centos"bash"52minutesagoUp52minutessick_albattani e136b27a8e17centos"bash"58minutesagoUp58minutestender_euclid
[root@localhost~]#dockerexec-itcent_testvbash [root@fb45150dbc21/]#df-h FilesystemSizeUsedAvailUse%Mountedon /dev/mapper/docker-253:0-1447735-fb45150dbc218e71ff07eca44be3603e004e01b94effcca14c2bd8b3a998f0969.8G231M9.0G3%/ tmpfs936M0936M0%/dev shm64M064M0%/dev/shm /dev/mapper/VolGroup-lv_root35G6.0G28G18%/data [root@fb45150dbc21/]#ls/data/ [root@fb45150dbc21/]#exit exit [root@localhost~]#ls/data/ 1.txt2.txt3.txt
其他容器挂载该数据卷
[root@localhost~]#dockerrun-itd--volumes-fromcent_testvcentosbash 0a80861145c9a2627618a78db2b7225eba64137d4664d3706e02c1c623cde5e3
注意:使用–volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态
[root@localhost~]#dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 0a80861145c9centos"bash"3secondsagoUp2secondsmad_carson fb45150dbc21centos"bash"14minutesagoUp14minutescent_testv 3222c7c5c456centos"bash"58minutesagoUp58minutessick_albattani e136b27a8e17centos"bash"AboutanhouragoUpAboutanhourtender_euclid [root@localhost~]#dockerexec-it0a8086bash [root@0a80861145c9/]#df-h FilesystemSizeUsedAvailUse%Mountedon /dev/mapper/docker-253:0-1447735-0a80861145c9a2627618a78db2b7225eba64137d4664d3706e02c1c623cde5e39.8G231M9.0G3%/ tmpfs936M0936M0%/dev shm64M064M0%/dev/shm /dev/mapper/VolGroup-lv_root35G6.0G28G18%/data
[root@0a80861145c9/]#touch/data/fight.txt [root@0a80861145c9/]#exit exit [root@localhost~]#dockerexec-itcent_testvbash [root@fb45150dbc21/]#ls/data/ fight.txt [root@fb45150dbc21/]#exit exit
利用数据卷容器迁移数据
数据卷的备份
[root@localhost~]#dockerrun-itd--volumes-fromcent_testv-v/vol_data_backup/:/backupcentosbash 4f5bf6f33f2c78197e54e5145824e98bf89d802376e83019c2913b336fbd9d20
首先我们需要使用cent_testv数据卷新开一个容器,同时我们还需要把本地的/vol_data_backup/目录挂载到该容器的/backup下,这样在容器中/backup目录里面新建的文件我们就可以直接在/vol_data_backup/目录中看到了。然后再把/data/目录下面的文件打包到成data.tar文件放到/backup目录下面。
[root@localhost~]#dockerexec-it4f5bfbash [root@4f5bf6f33f2c/]#df-h FilesystemSizeUsedAvailUse%Mountedon /dev/mapper/docker-253:0-1447735-4f5bf6f33f2c78197e54e5145824e98bf89d802376e83019c2913b336fbd9d209.8G231M9.0G3%/ tmpfs936M0936M0%/dev shm64M064M0%/dev/shm /dev/mapper/VolGroup-lv_root35G6.0G28G18%/data [root@4f5bf6f33f2c/]#ls/backup/ [root@4f5bf6f33f2c/]#ls/data/ fight.txt [root@4f5bf6f33f2c/]#tarcvf/backup/data.tar/data/ tar:Removingleading`/'frommembernames /data/ /data/fight.txt [root@4f5bf6f33f2c/]#exit exit [root@localhost~]#ls/vol_data_backup/ data.tar
恢复
先新建一个数据卷容器,再建一个新的容器并挂载该数据卷容器,然后再把tar包解包。
[root@localhost~]#dockerrun-itd-v/data--namecent_testv2centosbash 4cd696928bbe6e0aec9bf8b6856323d7228eb65006b21849eff9f0d41dcea90f [root@localhost~]#dockerrun-itd--volumes-fromcent_testv2-v/vol_data_backup/:/backupcentos 7169e8be6d3e5836b626806696046195ed600a1f95b308495e90e6c7b15170d5 [root@localhost~]#dockerexec-it7169bash [root@7169e8be6d3e/]#df-h FilesystemSizeUsedAvailUse%Mountedon /dev/mapper/docker-253:0-1447735-7169e8be6d3e5836b626806696046195ed600a1f95b308495e90e6c7b15170d59.8G231M9.0G3%/ tmpfs936M0936M0%/dev shm64M064M0%/dev/shm /dev/mapper/VolGroup-lv_root35G6.0G28G18%/data [root@7169e8be6d3e/]#ls/backup/ data.tar [root@7169e8be6d3e/]#mv/backup/data.tar. [root@7169e8be6d3e/]#ls anaconda-post.logbindata.taretcliblost+foundmntprocrunsrvtmpvar backupdatadevhomelib64mediaoptrootsbinsysusr [root@7169e8be6d3e/]#tarxvfdata.tar data/ data/fight.txt [root@7169e8be6d3e/]#ls/data/ fight.txt [root@7169e8be6d3e/]#exit exit [root@localhost~]#ls/vol_data_backup/ [root@localhost~]#
总结
docker为数据管理提供了充分的支持,并且,使用数据卷容器是一个不错的选择。以上就是这篇文章的全部内容了,希望能对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。