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]#
原文地址:https://www.cnblogs.com/ajunyu/p/11213292.html