深入浅出Docker技术-Docker数据管理

简介:

   在Docker的使用过程中往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,所以这就涉及到Docker容器的数据操作。 
   容器中数据管理主要有两种方式:数据卷和数据卷容器。

     1. 数据卷(Data Volumes) 容器内数据直接映射到本地宿主机。

     2. 数据卷容器(Data Volume Containers) 使用特定容器维护数据卷。

数据卷:

  容器内数据直接映射到本地宿主机。类似于linux 的 软连接ln -s 命令;

  Linux 课外普及:

 ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;第二,ln的链接又软链接 和硬链接两种,软链接就是ln -s ** **,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接ln ** **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。

 【硬连接】
     硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

  【软连接】
    另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

实战:

  使用-v可以挂载一个本地的目录到容器中作为数据卷。

docker run -d --name=centos -v /data:/test -it centos /bin/bash

    上述命令是将主机的/data文件夹指向容器的/test目录,这个功能比如图片服务器的功能,通过数据卷可以作为图片文件的共享,这样不同的容器可以直接共享该图片数据;

runoob@runoob:~$ ls /data
runoob@runoob:~$ docker run -d --name=centos -v /data:/test -it centos /bin/bash;
runoob@runoob:~$ docker exec -it centos /bin/bash;
runoob@runoob:~$ ls /test;
runoob@runoob:~$ toush /xxoo;
查看主机与容器的数据信息,可以看到容器已经挂载到/data目录上,并有了其中的数据;

数据卷容器

如果容器之间需要共享一些持续更新的数据,最简单的方式就是是用户数据卷容器,数据卷容器就是一种普通容器,专门提供数据卷供其它容器挂载使用。

创建数据卷容器dbdata,并在其中创建一个数据卷挂载到dbdata;

创建数据卷容器dbdata

[root@wls12c /]$ docker run -it -v /dbdata:/dbdata --name dbdata centos

image.png

创建db1和db2两个容器,并使用–volumes-from挂载dbdata容器中的数据卷

[root@wls12c /]$ docker run -it --volumes-from dbdata --name db1 centos
[root@wls12c /]$ docker run -it --volumes-from dbdata --name db2 centos

这样三个容器任何一个容器在该目录下写入,其它容器都能看见。

image.png

例如在dbdata容器中创建一个xxoo文件;

runoob@runoob:~$ cd /dbdata;
runoob@runoob:~$ toush /xxoo;

分别登录容器:dbdata、bd1、db2:

runoob@runoob:~$ docker exec -it db1 /bin/bash;
runoob@runoob:~$ ls/dbdata;

如果删除了挂载的容器(包括dbdata、db1、db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载者它的容器时显式使用docker rm -v命令来指定同时删除关联的容器.

使用数据卷容器可以让用户在容器之间自有地升级和移动数据卷。具体的操作将在下面讲述;

利用数据卷容易迁移数据:

   备份:

    备份dbdata数据卷容器中的数据到主机的当前目录。

   docker run --volumes-from dbdata -v $(pwd):/backup --name worker centos tar zcf /backup/backup.tar.gz /dbdata

image.png

   首先利用centos镜像创建一个容器worker.使用–volumes-from dbdata参数让worker容器挂载dbdata容器的数据卷(/dbdata);使用-v $(pwd):/backup参数挂载本地的目录到worker容器的/backup目录;

worker 容器启动后,使用tar zcf /backup/backup.tar.gz /dbdata

命令将/dbdata下的内容备份为容器的/backup/backup.tar.gz,即宿主主机当前目录下的/backup.tar;

  恢复

   如果要恢复数据到一个容器,可以按下面的操作。首先创建一个带有数据卷的容器dbdata2:

[root@wls12c /]$ docker run -v  /dbdata --name dbdata2 centos /bin/bash

    然后创建另一个新的容器,挂载dbdata2的容器,并使用untar解压备份文件到所挂载的容器卷中即可:

[root@wls12c /]$ docker run --volumes-from dbdata2 -v $(pwd):/backup  centos tar xvf /backup/backup.tar.gz