分享

Docker容器的数据管理

 青叶i生活 2018-02-22

 

先说点题外话,楼主前段时间听着学校的银行工作人员在宣传可以办个银行卡,这样的话,外地存款是没有手续费的,楼主想这样挺好的,就办了一行,办了一张楼主一次都没用过,结果今天给楼主来短信时候楼主欠了80块钱,需要还款,楼主很莫名其妙啊,怎么回事?楼主打电话问了一下农业银行的工作人员,工作人员告诉我确实得还款,因为那张卡是张信用卡,信用卡需要交纳80的年费,好吧,我在这里想说的是,隔行如隔山,不要被某些单位,某些个人欺骗了,我问了一下我的一个懂这方面的同学,我同学说,你办一张信用卡,人家最少可提成50,所以人家会努力让你班信用卡,我日,我说当初这些人为啥不说一年需要交纳80元的手续费,如果说了的话,估计没人办了,,社会如此险恶!!如果你是一个和楼主一样没用过信用卡的屌丝,赶快把手里的信用卡注销了吧,楼主再说一句,不要乱办卡!!!东西可以乱吃,卡不要乱办.

 

 

Docker容器的数据卷

 

数据卷就是一个可供容器使用的目录,它绕过了文件系统,特性如下:

1.数据卷可以在容器之间共享和重用

2.对数据卷的修改会立马生效

3.对数据卷的更新不影响镜像

4.卷会一直存在,知道没有容器使用

 

主要作用使用来共享的.

 

类似linux下的挂载(mount)

 

演示

为容器中添加数据卷:

  1. syx@syx-VB:~$ docker run -it -v ~/datavolume:/data ubuntu /bin/bash  
  2. root@167d42cfebb8:/# ls -t  
  3. dev  sys  proc  data  etc  var  sbin  usr  tmp  bin  root  lib64  media  mnt  opt  run  srv  boot  home  lib  

使用-v选项创建数据卷,数据卷的位置~/datavolume:/data,如果此目录不存在,会直接创建一个.

  1. root@167d42cfebb8:/# touch /data/c1  
  2. root@167d42cfebb8:/# echo "hello world" > /data/c1  
  3. root@167d42cfebb8:/# exit  


  1. syx@syx-VB:~$ ls -l  
  2. 总用量 52  
  3. drwxr-xr-x 2 root root 4096  5月 12 13:58 datavolume  
  4. drwxrwxr-x 5 syx  syx  4096  5月 12 11:13 dockerfile  
  5. -rw-r--r-- 1 syx  syx  8980  5月  3 18:48 examples.desktop  
  6. drwxr-xr-x 2 syx  syx  4096  5月  3 19:17 公共的  
  7. drwxr-xr-x 2 syx  syx  4096  5月  3 19:17 模板  
  8. drwxr-xr-x 2 syx  syx  4096  5月  3 19:17 视频  
  9. drwxr-xr-x 2 syx  syx  4096  5月  3 19:17 图片  
  10. drwxr-xr-x 2 syx  syx  4096  5月  3 19:17 文档  
  11. drwxr-xr-x 2 syx  syx  4096  5月  3 19:17 下载  
  12. drwxr-xr-x 2 syx  syx  4096  5月  3 19:17 音乐  
  13. drwxr-xr-x 2 syx  syx  4096  5月  3 19:17 桌面  
  14. syx@syx-VB:~$ ls -l datavolume  
  15. 总用量 4  
  16. -rw-r--r-- 1 root root 12  5月 12 13:58 c1  
  17.   
  18. syx@syx-VB:~$ vim  datavolume/c1  


 

 

数据卷的使用

  1. syx@syx-VB:~$ docker run -it -v ~/datavolume:/data:ro --name dvt1 ubuntu /bin/bash  
  2. root@362cb8713da7:/# ls -l  
  3. total 68  
  4. drwxr-xr-x   2 root root 4096 May  3 15:53 bin  
  5. drwxr-xr-x   2 root root 4096 Apr 12 20:14 boot  
  6. drwxr-xr-x   2 root root 4096 May 12 05:58 data  
  7. drwxr-xr-x   5 root root  380 May 12 06:04 dev  
  8. drwxr-xr-x  44 root root 4096 May 12 06:04 etc  
  9. drwxr-xr-x   2 root root 4096 Apr 12 20:14 home  
  10. drwxr-xr-x   8 root root 4096 Sep 13  2015 lib  
  11. drwxr-xr-x   2 root root 4096 May  3 15:52 lib64  
  12. drwxr-xr-x   2 root root 4096 May  3 15:52 media  
  13. drwxr-xr-x   2 root root 4096 May  3 15:52 mnt  
  14. drwxr-xr-x   2 root root 4096 May  3 15:52 opt  
  15. dr-xr-xr-x 153 root root    0 May 12 06:04 proc  
  16. drwx------   2 root root 4096 May  3 15:52 root  
  17. drwxr-xr-x   4 root root 4096 May  3 15:52 run  
  18. drwxr-xr-x   2 root root 4096 May  3 23:12 sbin  
  19. drwxr-xr-x   2 root root 4096 May  3 15:52 srv  
  20. dr-xr-xr-x  13 root root    0 May 12 06:04 sys  
  21. drwxrwxrwt   2 root root 4096 May  3 15:53 tmp  
  22. drwxr-xr-x  11 root root 4096 May  3 23:12 usr  
  23. drwxr-xr-x  13 root root 4096 May  3 23:12 var  
  24. root@362cb8713da7:/# touch data/c2  
  25. touch: cannot touch 'data/c2': Read-only file system  


因为在创建数据卷的时候使用ro选项(readonly),所以不能在数据卷中创建文件.

docker inspect dvt1

 

    "Mounts": [

        {

            "Source": "/home/syx/datavolume",

            "Destination": "/data",

            "Mode": "ro",

            "RW": false

        }

    ],

通过上面得到的信息可以看出dvt1容器中数据卷的信息.

 

当然也可以通过Dockerfile文件构建包含数据卷的镜像.演示:

Dockerfile文件内容如下:

  1. FROM ubuntu  
  2. VOLUME ["/datavolume1","datavolume2"]  
  3. CMD /bin/bash  


  1.    
  2. syx@syx-VB:~/dockerfile/df_test4$ docker build -t syx/dvt .  
  3.    
  4. syx@syx-VB:~/dockerfile/df_test4$ docker run --name dvt3 -it syx/dvt  
  5.    
  6. root@dfbc828f264f:/# ls -l  
  7. total 72  
  8. drwxr-xr-x   2 root root 4096 May  3 15:53 bin  
  9. drwxr-xr-x   2 root root 4096 Apr 12 20:14 boot  
  10. drwxr-xr-x   2 root root 4096 May 12 06:16 datavolume1  
  11. drwxr-xr-x   2 root root 4096 May 12 06:16 datavolume2  
  12. drwxr-xr-x   5 root root  380 May 12 06:16 dev  
  13. drwxr-xr-x  44 root root 4096 May 12 06:16 etc  
  14. drwxr-xr-x   2 root root 4096 Apr 12 20:14 home  
  15. drwxr-xr-x   8 root root 4096 Sep 13  2015 lib  
  16. drwxr-xr-x   2 root root 4096 May  3 15:52 lib64  
  17. drwxr-xr-x   2 root root 4096 May  3 15:52 media  
  18. drwxr-xr-x   2 root root 4096 May  3 15:52 mnt  
  19. drwxr-xr-x   2 root root 4096 May  3 15:52 opt  
  20. dr-xr-xr-x 150 root root    0 May 12 06:16 proc  
  21. drwx------   2 root root 4096 May  3 15:52 root  
  22. drwxr-xr-x   4 root root 4096 May  3 15:52 run  
  23. drwxr-xr-x   2 root root 4096 May  3 23:12 sbin  
  24. drwxr-xr-x   2 root root 4096 May  3 15:52 srv  
  25. dr-xr-xr-x  13 root root    0 May 12 06:04 sys  
  26. drwxrwxrwt   2 root root 4096 May  3 15:53 tmp  
  27. drwxr-xr-x  11 root root 4096 May  3 23:12 usr  
  28. drwxr-xr-x  13 root root 4096 May  3 23:12 var  


能看到咱们创建的两个数据卷了.

 

  1. syx@syx-VB:~/dockerfile/df_test4$ docker inspect dvt3  


查看一下数据卷的信息.

 

 

Docker的数据卷容器

 

什么是数据卷容器?

命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫做数据卷容器.

 

是不是很绕口?

演示

前面创建了一个包含数据卷的镜像:syx/dvt

使用这个镜像创建几个容器:

  1. syx@syx-VB:~$ docker run -it --name dvt4 syx/dvt  
  2. root@f5e9f5629ae7:/# ls  
  3. bin  boot  datavolume1  datavolume2  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  


看到了咱们在前面的床架的两个数据卷

  1. root@f5e9f5629ae7:/# touch /datavolume1/dvt4_1  
  2. root@f5e9f5629ae7:/# ls /datavolume1  
  3. dvt4_1  


退出容器

  1. root@f5e9f5629ae7:/# exit  


再创建一个容器:

  1. syx@syx-VB:~$ docker run -it --name dvt6 --volumes-from dvt4 ubuntu /bin/bash  


依然看到了咱们前面创建的两个数据卷:

  1. root@94967ac367d4:/# ls  
  2. bin  boot  datavolume1  datavolume2  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  


可以看到咱们前面在dvt4容器中创建的dvt4-1的文件

  1. root@94967ac367d4:/# ls /datavolume1  
  2. dvt4_1  


dvt6容器中创建一个dvt5_1

  1. root@94967ac367d4:/# touch /datavolume1/dvt5_1  


可以看到在dvt4dvt6中分别创建的文件:

  1. root@94967ac367d4:/# ls /datavolume1      
  2. dvt4_1  dvt5_1  


退出dct6容器

  1. root@94967ac367d4:/# exit  
  2. exit  

创建一个dvt7容器

  1. syx@syx-VB:~$ docker run -it --name dvt7 --volumes-from dvt4 ubuntu /bin/bash  


可以看到两个数据卷

  1. root@a682dbe57bec:/# ls  
  2. bin  boot  datavolume1  datavolume2  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  


可以看到在数据卷中我们在前两个是容器中创建的两个文件

  1. root@a682dbe57bec:/# ls /datavolume1  
  2. dvt4_1  dvt5_1  


 

使用数据卷容器可以很容易的在不同的容器中共享数据,同时我们并不需要使用者确切的连接到已知的docker已知的宿主机目录.我们可以不暴露我们宿主机的实际目录.

 

如果我们删除dvt4

  1. syx@syx-VB:~$ docker rm dvt4  
  2. syx@syx-VB:~$ docker ps -a  

可以看到dvt4容器没有了.

 

进入dvt6容器

  1. syx@syx-VB:~$ docker start -i dvt6  
  2. root@94967ac367d4:/# ls  

  1. bin  boot  datavolume1  datavolume2  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  

还能看到原来的东西.


  1. root@94967ac367d4:/# ls /datavolume1  
  2. dvt4_1  dvt5_1  
  3.    
  4. root@94967ac367d4:/# touch /datavolume1/dvt6_1  
  5. root@94967ac367d4:/# ls /datavolume1  
  6. dvt4_1  dvt5_1  dvt6_1  
  7. root@94967ac367d4:/# exit  
  8. exit  
  9. syx@syx-VB:~$ docker start -i dvt7  
  10. root@a682dbe57bec:/# ls /datavolume1  
  11. dvt4_1  dvt5_1  dvt6_1  


就算删除了dvt4这个数据卷容器,依然没有任何问题,数据仍然可以共享.

 

 

  1. syx@syx-VB:~$ docker run --name dvt8 syx/dvt  
  2. syx@syx-VB:~$ docker run --name dvt9 -it --volumes-from  dvt8 ubuntu /bin/bash  
  3. root@d2c330659d64:/# ls  
  4. bin  boot  datavolume1  datavolume2  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  
  5. root@d2c330659d64:/# touch /datavolume1/dvt9_1  
  6. root@d2c330659d64:/# ls /datavolume1  
  7. dvt9_1  
  8. root@d2c330659d64:/# exit  
  9. exit  
  10. syx@syx-VB:~$ docker rm -v dvt8  
  11. dvt8  
  12. syx@syx-VB:~$ docker start -i dvt9  
  13. root@d2c330659d64:/# ls  
  14. bin  boot  datavolume1  datavolume2  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  
  15. root@d2c330659d64:/# touch datavolume1/dvt9_2  
  16. root@d2c330659d64:/# ls /datavolume1  
  17. dvt9_1  dvt9_2  

 

上面这些东西楼主就不一一说明了,注释单纯的说一下结论:

docker,如果一个数据卷还在本容器使用,那么它就会一直存在,使用数据卷容器来挂载数据,实际上这个容器所起到的作用仅仅是将数据卷挂载的配置传递到挂在了数据卷容器的新容器中.

 

数据卷的备份和还原

 

讲一个包含数据卷的容器中的数据通过一个容器执行一个压缩命令从而将数据备份出来:

需要一个有数据卷的容器,前面我们已经创建了dvt6

  1. syx@syx-VB:~$ docker start -i dvt6  
  2. root@94967ac367d4:/# ls /datavolume1  
  3. dvt4_1  dvt5_1  dvt6_1  
  4. root@94967ac367d4:/# exit  
  5. exit  


我们将dvt6的数据备份一下:

  1. syx@syx-VB:~$ docker run --volumes-from dvt6 -v ~/backup:/backup --name dvt10 ubuntu tar cvf /backup/dvt6.tar /datavolume1  
  2. tar: Removing leading `/' from member names  
  3. /datavolume1/  
  4. /datavolume1/dvt6_1  
  5. /datavolume1/dvt4_1  
  6. /datavolume1/dvt5_1  


生成了dvt6.tar的文件,该文件就是dvt6容器卷的备份文件.

  1. syx@syx-VB:~$ ls backup/  
  2. dvt6.tar  


解释一下上面的命令,使用--volumes-from标记来创建一个加载dvt6容器卷的容器,并从本地主机的~/backup挂载到当前容器的/backup目录.

 

数据还原

docker run --volumes-from [容器名字] -v $(pwd):/backup ubuntu tar xvf /backup/backup.atr [容器数据卷]

 

$(pwd)docker直接的指定当前目录的方法.

 

还是需要创建一个带有空数据卷的容器dvt11

  1. syx@syx-VB:~$ docker run -it --name dvt11 syx/dvt  
  2.    
  3. root@77632b276601:/# ls /datavolume1  


什么都没有

  1. syx@syx-VB:~$ docker run --volumes-from dvt11 -v ~/backup:/backup ubuntu tar xvf /backup/dvt6.tar  
  2. datavolume1/  
  3. datavolume1/dvt6_1  
  4. datavolume1/dvt4_1  
  5. datavolume1/dvt5_1  
  6.    
  7. syx@syx-VB:~$ docker start -i dvt11  
  8. root@77632b276601:/# ls /datavolume1  
  9. dvt4_1  dvt5_1  dvt6_1  


 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约