Docker数据管理
1. docker存储资源类型
用户在使用 Docker 的过程中,势必需要查看容器内应用产生的数据,或者需要将容器内数据进行备份,甚至多个容器之间进行数据共享,这必然会涉及到容器的数据管理:
(1)Data Volume (数据卷);
(2)Data Volume Dontainers --- 数据卷容器。
2. 数据卷 DataVolume
Data Volume 本质上是 Docker Host 文件系统中的目录或文件,使用类似与 Linux 下对目录或者文件进行 mount 操作。数据卷可以在容器之间共享和重用,对数据卷的更改会立马生效,对数据卷的更新不会影响镜像,卷会一直存在,直到没有容器使用。
1> Data Volume 有以下特点:
a)Data Volume 是目录或文件,而非没有格式化的磁盘(块设备)。
b)容器可以读写 volume 中的数据。
c)volume 数据可以被永久的保存,即使使用它的容器已经销毁。
2> DataVolume的使用
通过-v 参数格式为 <host path>:<container path>
a)运行一个容器,并创建一个数据卷挂载到容器的目录上
[root@alph ~]# docker run -itd -v /web centos:6 /bin/bash 5d6d2585218274be7b468ef62df1391e9719619408d856effac36f616f0b3fac [root@alph ~]# cd / [root@alph /]# ls #跟下面没有web挂载点 bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr [root@alph ~]# docker exec -it 5d6d2585218274be7b468ef62df1391e9719619408d856effac36f616f0b3fac /bin/bash [root@5d6d25852182 /]# ls bin etc lib lost+found mnt proc sbin srv tmp var dev home lib64 media opt root selinux sys usr web #数据卷
利用 centos:7.0 的镜像运行一个容器,并在容器内创建一个数据卷挂载到容器的 /web 目录上
b)运行一个容器,本地创建/test目录,挂载到容器的/web目录上
[root@alph ~]# mkdir test [root@alph ~]# cd test [root@alph test]# touch a d c [root@alph test]# cd [root@alph ~]# ls 192.168.16 centos.tar.gz docker test anaconda-ks.cfg doc_file registry.tar.gz yum-repo.sh [root@alph ~]# docker run -itd -v /root/test:/web centos:6 /bin/bash #映射本地目录到数据卷 409d2ea1236e26028a20e983bfeae04613c20b4d89548ff873dfe7f118a94766 [root@alph ~]# docker exec -it 409d2ea1236e26028a20e983bfeae04613c20b4d89548ff873dfe7f118a94766 /bin/bash [root@409d2ea1236e /]# cd /web/ [root@409d2ea1236e web]# ls a c d
在运行的容器内创建一个文件,然后再删除该容器,查看数据卷内数据是否存在。
[root@409d2ea1236e web]# echo "you are beautiful" > zxj [root@409d2ea1236e web]# exit exit [root@alph ~]# docker stop 409d2ea1236e26028a20e983bfeae04613c20b4d89548ff873dfe7f118a94766 [root@alph ~]# docker rm 409d2ea1236e26028a20e983bfeae04613c20b4d89548ff873dfe7f118a94766 [root@alph ~]# ls 192.168.16 centos.tar.gz docker test anaconda-ks.cfg doc_file registry.tar.gz yum-repo.sh [root@alph ~]# cd test #数据卷内数据还存在 [root@alph test]# ls a c d zxj [root@alph test]# cat zxj you are beautiful
3. 数据卷容器
数据卷容器Data Volume Dontainers
如果用户需要在容器之间共享一些持续更新的数据,最简单的方法就是使用数据卷容器,其实数据卷容器就是一个普通的容器,只不过是专门用它提供数据卷供其他容器挂载使用。
Data Volume Dontainers使用:
a)创建一个名为 dbdata 的数据卷,并在其中创建一个数据卷挂载到 /test下
[root@alph test]# docker run -it -v /root/test:/dbdate --name dbser centos:6 [root@ad2e4c1651ee /]# ls bin dbdate dev etc home lib lib64 lost+found media mnt opt proc root sbin selinux srv sys tmp usr var [root@ad2e4c1651ee /]# cd dbdate/ [root@ad2e4c1651ee dbdate]# ls a c d zxj [root@ad2e4c1651ee dbdate]#exit [root@alph test]# docker start ad2e4c1651ee ad2e4c1651ee
数据卷容器创建完成。
--name 参数为给容器指定名字为dbser方便记忆
3> 其他容器使用 --volumes-from命令去挂载dbdata数据卷
[root@alph ~]# docker run -itd --volumes-from dbser --name db1 centos:6 f107f0e239478a3ec3b0d42eb2bce69fb54f1b079a9c22d6ac1248570c5840ed [root@alph ~]# docker run -itd --volumes-from dbser --name db2 centos:6 5aa6a95b299aa5edcab8d7761a9ca95c46afc221bd74ac5ce6a5d160c60eeeee
此时,容器 db1 和 db2 同时挂载了同一个数据卷到本地相同 /dbdata目录。三个容器任何一个目录下的写入,都可以时时同步到另外两个。
[root@alph ~]# docker exec -it db1 /bin/bash [root@f107f0e23947 /]# ls bin dev home lib64 media opt root selinux sys usr dbdate etc lib lost+found mnt proc sbin srv tmp var [root@f107f0e23947 /]# cd dbdate/ [root@f107f0e23947 dbdate]# ls a c d zxj [root@f107f0e23947 dbdate]# touch 123 [root@f107f0e23947 dbdate]# exit exit [root@alph ~]# docker exec -it db2 /bin/bash [root@5aa6a95b299a /]# ls bin dev home lib64 media opt root selinux sys usr dbdate etc lib lost+found mnt proc sbin srv tmp var [root@5aa6a95b299a /]# cd dbdate/ [root@5aa6a95b299a dbdate]# ls 123 a c d zxj [root@5aa6a95b299a dbdate]#
删除相应的容器,再查看数据卷数据
[root@alph ~]# docker stop db1 db1 [root@alph ~]# docker stop db2 db2 [root@alph ~]# docker stop dbser dbser 删除数据卷容器dbser [root@alph ~]# docker rm dbser dbser 数据还存在于数据卷 [root@alph ~]# cd test [root@alph test]# ls 123 a c d zxj [root@alph test]#