Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume)。数据卷可以用来存储Docker应用的数据,也可以用来在Docker容器间进行数据共享。数据卷呈现给Docker容器的形式就是一个目录,支持多个容器间共享,修改也不会影响镜像。使用Docker的数据卷,类似在系统中使用 mount 挂载一个文件系统。操作Docker数据卷,需要理解以下几点:
============================================================================
1)一个数据卷是一个特别指定的目录,该目录利用容器的UFS文件系统可以为容器提供一些稳定的特性或者数据共享。数据卷可以在多个容器之间共享。
============================================================================
2)创建数据卷,只要在docker run命令后面跟上-v参数即可创建一个数据卷,当然也可以跟多个-v参数来创建多个数据卷,当创建好带有数据卷的容器后,就可以在其他容器中通过--volumes-froms参数来挂载该数据卷了,而不管该容器是否运行。也可以在Dockerfile中通过VOLUME指令来增加一个或者多个数据卷。
============================================================================
3)如果有一些数据想在多个容器间共享,或者想在一些临时性的容器中使用该数据,那么最好的方案就是你创建一个数据卷容器,然后从该临时性的容器中挂载该数据卷容器的数据。这样,即使删除了刚开始的第一个数据卷容器或者中间层的数据卷容器,只要有其他容器使用数据卷,数据卷都不会被删除的。
============================================================================
4)不能使用docker export、save、cp等命令来备份数据卷的内容,因为数据卷是存在于镜像之外的。备份方法: 创建一个新容器,挂载数据卷容器,同时挂载一个本地目录,然后把远程数据卷容器的数据卷通过备份命令备份到映射的本地目录里面。如下:
# docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
============================================================================
5)可以把一个本地主机的目录当做数据卷挂载在容器上,同样是在docker run后面跟-v参数,不过-v后面跟的不再是单独的目录了,它是[host-dir]:[container-dir]:[rw|ro]这样格式的,其中host-dir是一个绝对路径的地址,如果host-dir不存在,则docker会创建一个新的数据卷,如果host-dir存在,但是指向的是一个不存在的目录,则docker也会创建该目录,然后使用该目录做数据源。

Docker Volume数据卷可以实现:
-> 绕过“拷贝写”系统,以达到本地磁盘IO的性能,(比如运行一个容器,在容器中对数据卷修改内容,会直接改变宿主机上的数据卷中的内容,所以是本地磁盘IO的性能,而不是先在容器中写一份,最后还要将容器中的修改的内容拷贝出来进行同步。)
-> 绕过“拷贝写”系统,有些文件不需要在docker commit打包进镜像文件。
-> 数据卷可以在容器间共享和重用数据
-> 数据卷可以在宿主和容器间共享数据
-> 数据卷数据改变是直接修改的
-> 数据卷是持续性的,直到没有容器使用它们。即便是初始的数据卷容器或中间层的数据卷容器删除了,只要还有其他的容器使用数据卷,那么里面的数据都不会丢失。

Docker数据持久化:
容器在运行期间产生的数据是不会写在镜像里面的,重新用此镜像启动新的容器就会初始化镜像,会加一个全新的读写入层来保存数据。如果想做到数据持久化,Docker提供数据卷(Data volume)或者数据容器卷来解决问题,另外还可以通过commit提交一个新的镜像来保存产生的数据。

一、创建一个数据卷

  1. 如下为容器添加一个数据卷,并将容器名改为data。这个数据卷在容器里的目录是/opt/data
  2. [root@localhost ~]# docker images
  3. REPOSITORY TAG IMAGE ID CREATED SIZE
  4. docker.io/ubuntu latest 0ef2e08ed3fa 2 weeks ago 130 MB
  5.  
  6. [root@localhost ~]# docker run --name data -v /opt/data -t -i docker.io/ubuntu /bin/bash
  7. root@2b9aebcf6ce8:/# cd /opt/data/
  8. root@2b9aebcf6ce8:/opt/data# ls
  9. root@2b9aebcf6ce8:/opt/data# echo "123" > 123
  10. root@2b9aebcf6ce8:/opt/data# echo "123123" > 123123
  11. root@2b9aebcf6ce8:/opt/data# ls
  12. 123 123123
  13.  
  14. [root@localhost volumes]# docker ps
  15. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  16. 2b9aebcf6ce8 docker.io/ubuntu "/bin/bash" 49 seconds ago Up 48 seconds data
  17.  
  18. 在宿主机上,查看对应上面的那个数据卷的目录路径:
  19. [root@localhost ~]# docker inspect data|grep /var/lib/docker/volumes
  20. "Source": "/var/lib/docker/volumes/89d6562b9c1fe10dd21707cb697a5d481b3c1b000a69b762f540fa826a16972a/_data",
  21. [root@localhost ~]# ls /var/lib/docker/volumes/89d6562b9c1fe10dd21707cb697a5d481b3c1b000a69b762f540fa826a16972a/_data
  22. 123 123123
  23. [root@localhost ~]# echo "asdhfjashdfjk" >> /var/lib/docker/volumes/89d6562b9c1fe10dd21707cb697a5d481b3c1b000a69b762f540fa826a16972a/_data/123
  24. [root@localhost ~]#
  25.  
  26. root@2b9aebcf6ce8:/opt/data# ls
  27. 123 123123
  28. root@2b9aebcf6ce8:/opt/data# cat 123
  29. 123
  30. asdhfjashdfjk

二、挂载宿主机文件或目录到容器数据卷

  1. 可以直接挂载宿主机文件或目录到容器里,可以理解为目录映射,这样就可以让所有的容器共享宿主机数据,从而只需要改变宿主机的数据源就能够影响到所有的容器数据。
  2.  
  3. 注意:
  4. -v后面的映射关系是"宿主机文件/目录:容器里对应的文件/目录",其中,宿主机上的文件/目录是要提前存在的,容器里对应的文件/目录会自动创建。
  5.  
  6. 数据卷权限:
  7. 挂载的数据默认为可读写权限。
  8. 但也可以根据自己的需求,将容器里挂载共享的数据设置为只读,这样数据修改就只能在宿主机上操作。如下实例:
  9.  
  10. 1)挂载宿主机文件到容器上
  11. [root@localhost ~]# cat /etc/web.list
  12. 192.168.1.100
  13. 192.168.1.101
  14. 192.168.1.103
  15. [root@localhost ~]# docker run -t -i --name test -v /etc/web.list:/etc/web.list:ro docker.io/centos /bin/bash
  16. [root@e21a3fefa3ae /]# cat /etc/web.list
  17. 192.168.1.100
  18. 192.168.1.101
  19. 192.168.1.103
  20. [root@e21a3fefa3ae /]# echo "192.168.1.115" >> /etc/web.list
  21. bash: /etc/web.list: Read-only file system
  22. [root@e21a3fefa3ae /]#
  23.  
  24. 在宿主机上修改共享数据
  25. [root@localhost ~]# echo "192.168.1.115" >> /etc/web.list
  26. [root@localhost ~]#
  27.  
  28. [root@e21a3fefa3ae /]# cat /etc/web.list
  29. 192.168.1.100
  30. 192.168.1.101
  31. 192.168.1.103
  32. 192.168.1.115
  33.  
  34. 2)挂载宿主机目录到容器上
  35. [root@localhost ~]# mkdir /var/huanqiupc
  36. [root@localhost ~]# echo "test" > /var/huanqiupc/test
  37. [root@localhost ~]# echo "test1" > /var/huanqiupc/test1
  38. [root@localhost ~]# docker run -t -i --name hqsb -v /var/huanqiupc:/opt/huantime docker.io/centos /bin/bash
  39. [root@87cf93ce46a9 /]# cd /opt/huantime/
  40. [root@87cf93ce46a9 huantime]# ls
  41. test test1
  42. [root@87cf93ce46a9 huantime]# cat test
  43. test
  44. [root@87cf93ce46a9 huantime]# cat test1
  45. test1
  46. [root@87cf93ce46a9 huantime]# echo "1231" >>test
  47. [root@87cf93ce46a9 huantime]# echo "44444" >>test1
  48.  
  49. 宿主机上查看
  50. [root@localhost ~]# cat /var/huanqiupc/test
  51. test
  52. 1231
  53. [root@localhost ~]# cat /var/huanqiupc/test1
  54. test1
  55. 44444
  56.  
  57. 3)挂载多个目录
  58. [root@localhost ~]# mkdir /opt/data1 /opt/data2
  59. [root@localhost ~]# echo "123456" > /opt/data1/test1
  60. [root@localhost ~]# echo "abcdef" > /opt/data2/test2
  61. [root@localhost ~]# docker run --name data -v /opt/data1:/var/www/data1 -v /opt/data2:/var/www/data2:ro -t -i docker.io/ubuntu /bin/bash
  62. root@cf2d57b9bee1:/# ls /var/www/data1
  63. test1
  64. root@cf2d57b9bee1:/# ls /var/www/data2
  65. test2
  66. root@cf2d57b9bee1:/# cat /var/www/data1/test1
  67. 123456
  68. root@cf2d57b9bee1:/# cat /var/www/data2/test2
  69. abcdef
  70. root@cf2d57b9bee1:/# echo "date1" >> /var/www/data1/test1
  71. root@cf2d57b9bee1:/# echo "date2" >> /var/www/data2/test2
  72. bash: /var/www/data2/test2: Read-only file system
  73. root@cf2d57b9bee1:/#

三、创建数据卷容器
启动一个名为xqsj_Container容器,此容器包含两个数据卷/var/volume1和/var/volume2(这两个数据卷目录是在容器里的,容器创建的时候会自动生成这两目录)

  1. 注意一个细节:
  2. 下面的创建命令中,没有加-t和-i参数,所以这个容器创建好之后是登陆不了的!
  3. -i:表示以“交互模式”运行容器
  4. -t:表示容器启动后会进入其命令行
  5. [root@linux-node2 ~]# docker run -v /var/volume1 -v /var/volume2 --name xqsj_Container centos /bin/bash
  6. [root@linux-node2 ~]#
  7.  
  8. 所以要想创建容器后能正常登陆,就需要添加上面两个参数
  9. [root@localhost ~]# docker run -t -i -v /var/volume1 -v /var/volume2 --name xqsj_Container centos /bin/bash
  10. [root@73a34f3c1cd9 /]#

查看宿主机上与数据卷对应的目录路径:

  1. [root@localhost ~]# docker inspect xqsj_Container|grep /var/lib/docker/volumes
  2. "Source": "/var/lib/docker/volumes/b8d2e5bcadf2550abd36ff5aa544c721a45464a4406fb50979815de773086627/_data",
  3. "Source": "/var/lib/docker/volumes/a34fa3a0a7a2f126b0d30a32b1034f20917ca7bd0dda346014d768b5ebb68f6b/_data",
  4. 由上面命令结果可以查到,两个数据卷/var/volume1和/var/volume2下的数据在/var/lib/docker/volumes/下对于的两个目录的_data下面

创建App_Container容器,挂载xqsj_Container容器中的数据卷
[root@linux-node2 ~]# docker run -t -i --rm --volumes-from xqsj_Container --name App_Container centos /bin/bash
[root@b9891bcdfed0 /]# ls /var/volume1                           //发现这两个数据卷都存在
[root@b9891bcdfed0 /]# ls /var/volume2
[root@b9891bcdfed0 /]# echo "this is volume1" > /var/volume1/test1
[root@b9891bcdfed0 /]# echo "this is volume2" > /var/volume1/test2

可以再创建一个容器,挂载App_Container中从xqsj_Container挂载的数据卷。当然也可以直接挂载初始的xqsj_Container容器数据卷
[root@linux-node2 ~]# docker run -t -i --rm --volumes-from App_Container --name LastApp_Container centos /bin/bash
[root@b4c27e360614 /]# ls /var/volume1
test1
[root@b4c27e360614 /]# ls /var/volume2
test2
[root@b4c27e360614 /]# cat /var/volume1/test1
this is volume1
[root@b4c27e360614 /]# cat /var/volume2/test2
this is volume2

即便是删除了初始的数据卷容器xqsj_Container,或是删除了其它容器,但只要是有容器在使用该数据卷,那么它里面的数据就不会丢失!(除非是没有容器在使用它们)

四、备份数据卷

  1. $ sudo docker run --rm --volumes-from test -v $(pwd):/backup ubuntu:14.04 tar cvf /backup/test.tar /test
  2. tar: Removing leading `/' from member names
  3. /test/
  4. /test/b
  5. /test/d
  6. /test/c
  7. /test/a
  8.  
  9. 以上命令表示:
  10. 启动一个新的容器并且从test容器中挂载卷,然后挂载当前目录到容器中为backup,并备份test卷中所有的数据为test.tar,执行完成之后删除容器--rm,此时备份就在当前的目录下,名为test.tar。
  11. 注意:后面的/test是数据卷的目录路径(即数据卷创建时在容器里的路径)
  12.  
  13. $ ls
  14. 宿主机当前目录下产生了test卷的备份文件test.tar
  15.  
  16. ---------------------------------------------看看下面的一个实例---------------------------------------------
  17. 先创建一个容器wang,包含两个数据卷/var/volume1和/var/volume2(这两个目录是在容器里的数据卷路径)
  18. [root@localhost ~]# docker run -t -i -v /var/volume1 -v /var/volume2 --name wang docker.io/centos /bin/bash
  19. [root@83eb43492ae7 /]#
  20.  
  21. 根据Docker的数据持久化之数据卷容器可知,上面创建的wang数据卷容器挂载了/var/volume1和/var/volume2两个目录
  22. 然后在数据卷里写些数据,以供测试。
  23. [root@83eb43492ae7 /]# cd /var/volume1
  24. [root@83eb43492ae7 volume1]# echo "test1" > test1
  25. [root@83eb43492ae7 volume1]# echo "test11" > test11
  26. [root@83eb43492ae7 volume1]# echo "test111" > test111
  27. [root@83eb43492ae7 volume1]# ls
  28. test1 test11 test111
  29. [root@83eb43492ae7 volume1]# cd ../volume2
  30. [root@83eb43492ae7 volume2]# echo "test2" > test2
  31. [root@83eb43492ae7 volume2]# echo "test22" > test22
  32. [root@83eb43492ae7 volume2]# echo "test222" > test222
  33. [root@83eb43492ae7 volume2]# ls
  34. test2 test22 test222
  35. [root@83eb43492ae7 volume2]#
  36.  
  37. 然后进行这两个数据卷的备份
  38. [root@localhost ~]# docker ps
  39. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  40. 83eb43492ae7 docker.io/centos "/bin/bash" 2 minutes ago Up 2 minutes wang
  41.  
  42. 现在开始进行数据卷的备份操作:
  43. 为了利用数据卷容器备份,使用--volumes-from标记来创建一个加载wang容器卷的容器,并从主机挂载当前目录到容器的/backup目录。并备份wang卷中的数据,执行完成之后删除容器--rm,此时备份就在当前的目录下了。
  44.  
  45. 1)备份wang容器中的/var/volume1数据卷数据(注意下面:命令中的-i和-t这两个参数加不加都可以;--rm加上,备份后就会自动删除这个容器,如果不加这个--rm参数,那么备份后的容器就会保留,docker ps -a就会查看到)
  46. [root@localhost ~]# docker run -i -t --rm --volumes-from wang -v $(pwd):/backup docker.io/centos tar cvf /backup/backup1.tar /var/volume1
  47. tar: Removing leading `/' from member names
  48. /var/volume1/
  49. /var/volume1/test1
  50. /var/volume1/test11
  51. /var/volume1/test111
  52.  
  53. 2)备份wang容器中的/var/volume2数据卷数据
  54. [root@localhost ~]# docker run -i -t --rm --volumes-from wang -v $(pwd):/backup docker.io/centos tar cvf /backup/backup2.tar /var/volume2
  55. tar: Removing leading `/' from member names
  56. /var/volume2/
  57. /var/volume2/test2
  58. /var/volume2/test22
  59. /var/volume2/test222
  60.  
  61. 3)备份wang容器中的/var/volume1和/var/volume2数据卷数据
  62. [root@localhost ~]# docker run -i -t --rm --volumes-from wang -v $(pwd):/backup docker.io/centos tar cvf /backup/backup.tar /var/volume1 /var/volume2
  63. tar: Removing leading `/' from member names
  64. /var/volume1/
  65. /var/volume1/test1
  66. /var/volume1/test11
  67. /var/volume1/test111
  68. /var/volume2/
  69. /var/volume2/test2
  70. /var/volume2/test22
  71. /var/volume2/test222
  72. [root@localhost ~]# ls
  73. anaconda-ks.cfg a.py backup1.tar backup2.tar backup.tar mkimage-yum.sh pipework var wang.tar
  74.  
  75. 这样,数据卷容器中的数据就备份完成了. 简言之就是:
  76. 先创建一个容器,并挂载要备份的容器数据卷,再挂载数据卷(pwd):/backup目录到容器/bakcup,在容器中执行备份/data目录到/backup,也就是备份到宿主机$(pwd):/backup目录。

五、恢复或迁移数据卷

  1. 可以恢复给同一个容器或者另外的容器,新建容器并解压备份文件到新的容器数据卷
  2. $ sudo docker run -t -i -d -v /test --name test4 ubuntu:14.04 /bin/bash
  3. $ sudo docker run --rm --volumes-from test4 -v $(pwd):/backup ubuntu:14.04 tar xvf /backup/test.tar -C /
  4. 恢复之前的文件到新建卷中,执行完后自动删除容器 test/ test/b test/d test/c test/a
  5.  
  6. -----------------------------接着上面的实例进行数据卷恢复操作--------------------------
  7. [root@localhost ~]# docker ps
  8. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  9. 531c9d8adf4c docker.io/centos "/bin/bash" 2 minutes ago Up 44 seconds wang
  10.  
  11. 1)恢复数据给同一个容器
  12. 测了测试效果,先删除数据卷(注意:数据卷目录删除不了,只能删除其中的数据。)
  13. [root@localhost ~]# docker attach wang
  14. [root@531c9d8adf4c ~]# ls /var/volume1
  15. test1 test11 test111
  16. [root@531c9d8adf4c ~]# ls /var/volume2
  17. test2 test22 test222
  18. [root@531c9d8adf4c ~]# rm -rf /var/volume1 /var/volume2
  19. rm: cannot remove '/var/volume1': Device or resource busy
  20. rm: cannot remove '/var/volume2': Device or resource busy
  21. [root@531c9d8adf4c ~]# ls /var/volume2
  22. [root@531c9d8adf4c ~]# ls /var/volume1
  23.  
  24. 现在进行数据卷恢复,恢复数据卷中的所有数据:
  25. [root@localhost ~]# ls
  26. anaconda-ks.cfg a.py backup1.tar backup2.tar backup.tar mkimage-yum.sh pipework var wang.tar
  27.  
  28. 注意-C后面的路径,这个路径表示将数据恢复到容器里的路径。
  29. 命令中用"/",即表示将backup.tar中的数据解压到容器的/路径下。后面跟什么路径,就解压到这个路径下。因此这里用"/"
  30. [root@localhost ~]# docker run --rm --volumes-from wang -v $(pwd):/backup docker.io/centos tar xvf /backup/backup.tar -C /
  31. var/volume1/
  32. var/volume1/test1
  33. var/volume1/test11
  34. var/volume1/test111
  35. var/volume2/
  36. var/volume2/test2
  37. var/volume2/test22
  38. var/volume2/test222
  39.  
  40. 再次到容器里查看,发现数据卷里的数据已经恢复了
  41. [root@531c9d8adf4c ~]# ls /var/volume1
  42. test1 test11 test111
  43. [root@531c9d8adf4c ~]# ls /var/volume2
  44. test2 test22 test222
  45.  
  46. 2)恢复数据给另外的容器,新建容器并解压备份文件到新的容器数据卷
  47. 即新建一个容器huihui,将上面备份的数据卷数据恢复到这个新容器里。
  48. [root@localhost ~]# docker run -t -i -v /var/volume1 -v /var/volume2 --name huihui docker.io/centos /bin/bash
  49. [root@f6ff380e0b7f var]# ls /var/volume1
  50. [root@f6ff380e0b7f var]# ls /var/volume2
  51.  
  52. [root@localhost ~]# ls
  53. anaconda-ks.cfg a.py backup1.tar backup2.tar backup.tar mkimage-yum.sh pipework var wang.tar
  54.  
  55. [root@localhost ~]# docker run --rm --volumes-from huihui -v $(pwd):/backup docker.io/centos tar xvf /backup/backup.tar -C /
  56. var/volume1/
  57. var/volume1/test1
  58. var/volume1/test11
  59. var/volume1/test111
  60. var/volume2/
  61. var/volume2/test2
  62. var/volume2/test22
  63. var/volume2/test222
  64.  
  65. [root@localhost ~]# docker ps
  66. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  67. 813afe297b60 docker.io/centos "/bin/bash" 17 seconds ago Up 16 seconds huihui
  68.  
  69. 这里注意一下:
  70. 新容器创建时挂载的数据卷路径最好是和之前备份的数据卷路径一致
  71. 如下:
  72. 1)新建容器挂载的数据卷只是备份数据卷的一部分,那么恢复的时候也只是恢复一部分数据。如下,新容器创建时只挂载/var/volume1
  73. [root@localhost ~]# docker run -t -i -v /var/volume1 --name huihui docker.io/centos /bin/bash
  74. [root@12dd8d742259 /]# ls /var/volume1/
  75. [root@12dd8d742259 /]# ls /var/volume2
  76. ls: cannot access /var/volume2: No such file or directory
  77.  
  78. [root@localhost ~]# docker run --rm --volumes-from huihui -v $(pwd):/backup docker.io/centos tar xvf /backup/backup.tar -C /
  79. var/volume1/
  80. var/volume1/test1
  81. var/volume1/test11
  82. var/volume1/test111
  83. var/volume2/
  84. var/volume2/test2
  85. var/volume2/test22
  86. var/volume2/test222
  87. [root@localhost ~]#
  88.  
  89. 查看容器,发现只恢复了/var/volume1的数据,/var/volume2数据没有恢复,因为没有容器创建时没有挂载这个。
  90. [root@localhost ~]# docker run -t -i -v /var/volume1 --name huihui docker.io/centos /bin/bash
  91. [root@12dd8d742259 /]# ls /var/volume1/
  92. [root@12dd8d742259 /]# ls /var/volume2
  93. ls: cannot access /var/volume2: No such file or directory
  94.  
  95. 2)新容器创建时只挂载/var/volume2
  96. [root@localhost ~]# docker run -t -i -v /var/volume2 --name huihui docker.io/centos /bin/bash
  97. [root@da3a3d2c95e0 /]# ls /var/volume2/
  98. [root@da3a3d2c95e0 /]# ls /var/volume1
  99. ls: cannot access /var/volume1: No such file or directory
  100.  
  101. [root@localhost ~]# docker run --rm --volumes-from huihui -v $(pwd):/backup docker.io/centos tar xvf /backup/backup.tar -C /
  102. var/volume1/
  103. var/volume1/test1
  104. var/volume1/test11
  105. var/volume1/test111
  106. var/volume2/
  107. var/volume2/test2
  108. var/volume2/test22
  109. var/volume2/test222
  110. [root@localhost ~]#
  111.  
  112. [root@da3a3d2c95e0 /]# ls /var/volume1
  113. ls: cannot access /var/volume1: No such file or directory
  114. [root@da3a3d2c95e0 /]# ls /var/volume2/
  115. test2 test22 test222
  116.  
  117. 3)如果新容器创建时挂载的数据卷目录跟之前备份的路径不一致
  118. [root@localhost ~]# docker run -t -i -v /var/huihui --name huihui docker.io/centos /bin/bash
  119. [root@9bad9b3bde71 /]# ls /var/huihui/
  120. [root@9bad9b3bde71 /]#
  121.  
  122. 如果解压时-C后面跟的路径不是容器挂载的容器,那么数据恢复不了,如下
  123. [root@localhost ~]# docker run --rm --volumes-from huihui -v $(pwd):/backup docker.io/centos tar xvf /backup/backup.tar -C /
  124. var/volume1/
  125. var/volume1/test1
  126. var/volume1/test11
  127. var/volume1/test111
  128. var/volume2/
  129. var/volume2/test2
  130. var/volume2/test22
  131. var/volume2/test222
  132.  
  133. 发现容器内数据没有恢复
  134. [root@9bad9b3bde71 /]# ls /var/huihui/
  135. [root@9bad9b3bde71 /]#
  136.  
  137. 但是如果解压时-C后面跟的是容器挂载的路径,数据就能正常恢复
  138. [root@localhost ~]# docker run --rm --volumes-from huihui -v $(pwd):/backup docker.io/centos tar xvf /backup/backup.tar -C /var/huihui
  139. var/volume1/
  140. var/volume1/test1
  141. var/volume1/test11
  142. var/volume1/test111
  143. var/volume2/
  144. var/volume2/test2
  145. var/volume2/test22
  146. var/volume2/test222
  147. [root@localhost ~]#
  148.  
  149. 发现容器内数据已经恢复了
  150. [root@9bad9b3bde71 /]# ls /var/huihui/
  151. var
  152. [root@9bad9b3bde71 /]# ls /var/huihui/var/
  153. volume1 volume2
  154. [root@9bad9b3bde71 /]# ls /var/huihui/var/volume1
  155. test1 test11 test111
  156. [root@9bad9b3bde71 /]# ls /var/huihui/var/volume2
  157. test2 test22 test222

六、删除数据卷

  1. Volume 只有在下列情况下才能被删除:
  2. 1docker rm -v删除容器时添加了-v选项
  3. 2docker run --rm运行容器时添加了--rm选项
  4.  
  5. 否则,会在/var/lib/docker/volumes目录中遗留很多不明目录。
  6. 可以使用下面方式找出,然后删除_data目录下的数据文件
  7. [root@localhost volumes]# docker inspect huihui|grep /var/lib/docker/volumes
  8. "Source": "/var/lib/docker/volumes/97aa95420e66de20abbe618fad8d0c1da31c54ce97e32a3892fa921c7942d42b/_data",
  9.  
  10. 可以使用 docker rm -v 命令在删除容器时删除该容器的卷。示例如下:
  11. [root@localhost volumes]# docker run -d -P --name huihui -v /www docker.io/centos
  12. 69199905a74cb360935e32f4e99f7f11319f6aa36033a920aa0bae25874f5c69
  13.  
  14. [root@localhost volumes]# docker volume ls
  15. DRIVER VOLUME NAME
  16. local 5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330
  17. local 97aa95420e66de20abbe618fad8d0c1da31c54ce97e32a3892fa921c7942d42b
  18. local data_volume
  19.  
  20. [root@localhost volumes]# docker rm -vf huihui
  21. huihui
  22. [root@localhost volumes]# docker volume ls
  23. DRIVER VOLUME NAME
  24. local 5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330
  25. local data_volume

=====================  Docker新版本出现docker volume 命令:创建数据卷 ======================

  1. Docker 新版本中引入了 docker volume 命令来管理 Docker volume
  2.  
  3. 使用默认的 'local' driver 创建一个volume数据卷
  4. [root@localhost ~]# docker volume create --name kevin
  5. kevin
  6.  
  7. [root@localhost ~]# docker volume ls
  8. DRIVER VOLUME NAME
  9. local kevin
  10.  
  11. [root@localhost ~]# ll /var/lib/docker/volumes
  12. total 24
  13. drwxr-xr-x 3 root root 19 Oct 28 00:32 kevin
  14. -rw------- 1 root root 32768 Oct 28 00:32 metadata.db
  15.  
  16. 使用这个名为kevin的数据卷
  17. [root@localhost ~]# docker run -d -P --name test1 -v kevin:/volume docker.io/centos
  18. 375ef74722404f5c52fde9f2ea7ea322c57e07fbac0b0e69825f077328fdb363
  19.  
  20. [root@localhost ~]# docker inspect test1
  21. .........
  22. "Mounts": [
  23. {
  24. "Type": "volume",
  25. "Name": "kevin",
  26. "Source": "/var/lib/docker/volumes/kevin/_data",
  27. "Destination": "/volume",
  28. "Driver": "local",
  29. "Mode": "z",
  30. "RW": true,
  31. "Propagation": ""
  32. }
  33.  
  34. 即将kevin数据卷对应在本机上的目录/var/lib/docker/volumes/kevin/_data挂载给容器内的 /volume 目录。

Docker容器学习梳理 - Volume数据卷使用的更多相关文章

  1. Docker容器学习梳理 - 日常操作总结

    使用Docker已有一段时间了,今天正好有空梳理下自己平时操作Docker时的一些命令和注意细节: Docker 命令帮助 $ sudo docker Commands: attach Attach ...

  2. Docker容器学习梳理 - 应用程序容器环境部署

    关于国内Docker镜像,可以参考:Docker容器学习梳理--基础知识(2) 的Docker镜像使用. 如果我们需要在Docker环境下部署tomcat.redis.mysql.nginx.php等 ...

  3. docker进阶篇(一) ---- Volume(数据卷)

    引言 docker的镜像是由多个只读的文件系统叠加在一起形成的.当我们在我启动一个容器的时候,docker会加载这些只读层并在这些只读层的上面(栈顶)增加一个读写层.这时如果修改正在运行的容器中已有的 ...

  4. Docker容器学习梳理 - 容器硬盘热扩容

    前面已介绍了docker很多知识点的操作记录,今天这里梳理下docker容器空间扩展的操作.默认情况下,物理机下创建的docker容器的空间是10G(虚拟机下创建的docker容器空间就是虚拟机的空间 ...

  5. Docker容器学习梳理 - Dockerfile构建镜像

    在Docker的运用中,从下载镜像,启动容器,在容器中输入命令来运行程序,这些命令都是手工一条条往里输入的,无法重复利用,而且效率很低.所以就需要一 种文件或脚本,我们把想执行的操作以命令的方式写入其 ...

  6. Docker容器学习梳理 - 基础知识(2)

    之前已经总结了Docker容器学习梳理--基础知识(1),但是不够详细,下面再完整补充下Docker学习的一些基础. Docker是个什么东西 Docker是一个程序运行.测试.交付的开放平台,Doc ...

  7. Docker容器学习梳理 - 基础知识(1)

    Docker是PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源.Docker是通过内核虚拟化技 ...

  8. Docker容器学习梳理 - 容器间网络通信设置(Pipework和Open vSwitch)

    自从Docker容器出现以来,容器的网络通信就一直是被关注的焦点,也是生产环境的迫切需求.容器的网络通信又可以分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信.下面将分别针对这两方面,对容 ...

  9. Docker容器学习梳理 - 容器时间跟宿主机时间同步

    在Docker容器创建好之后,可能会发现容器时间跟宿主机时间不一致,这就需要同步它们的时间,让容器时间跟宿主机时间保持一致.如下: 宿主机时间 [root@slave-1 ~]# date Fri M ...

随机推荐

  1. JS代码段:VUE下的时间,星期和年月日

    不为别的,只为以后复制粘贴方便 data() { return { date: "", time: "", week: "" }; }, / ...

  2. EasyUI tabs指定要显示的tab

    <div id="DivBox"  class="easyui-tabs" style="width: 100%; height: 100%;& ...

  3. C#从入门到精通视频教程(2009年最新)- 视频列表

    http://www.jz97.net/index.php/playlist/view/182/page/2 C#从入门到精通视频教程(2009年最新)- 视频列表

  4. RestTemplate 服务名请求

    @loadBalance注解修饰的restTemplate才能实现服务名的调用,没有修饰的restTemplate是没有该功能的. @loadBalance是Netflix的ribbon中的一个负载均 ...

  5. P1481 魔族密码 (LIS)

    题的连接:https://www.luogu.org/problemnew/show/P1481 简单思路: 就是LIS,最长上升子序列,当然把条件改一下,从模板里的A[ i ]> A[ j ] ...

  6. PCB (4)原理图导入PCB

    1导入原理图 打开原理图 之后出现对话框,检查错误,选择更新 2 自动对齐 2布线 手动布线 半自动布线 自动布线 输出

  7. var 全局变量 局部变量

    var 定义的不一定是局部变量 全局变量: 过程体(包括方法function(){},对象Object={})外的所有的变量,不管有没有加var关键字,他都是全局变量. 局部变量: 在过程体内(方法, ...

  8. C# 语法三 抽象类和接口

    1.抽象类 2.接口 一 抽象类 跟普通类的区别: a)用abstract标识类.抽象方法 b)抽象方法,只能声明,不能定义 c)抽象类不能实例化 二 接口 接口用interface标识,所有的成员( ...

  9. Android学习之触点事件的处理

    知识点: 1. Android开发中的运动事件:触摸屏(TouchScreen)和滚动球(TrackBall) 2.对运动事件的处理:MotionEvent 3.触摸时必发的三个MotionEvent ...

  10. Redis 安装部署

    1. 官网(https://redis.io/download)下载稳定版安装包 3.0.7或3.2或4.1; 2. 复制到部署服务器 /opt/redis4,解压 tar zxvf redis-4. ...