zoukankan      html  css  js  c++  java
  • Docker入门与应用系列(四)数据卷管理

    一、介绍

      Docker镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker会加载只读镜像层并在其上(译者注:镜像栈顶部)添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)。

      为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念。简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。

      数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

    • 数据卷可以在容器之间共享和重用
    • 对数据卷的修改会立马生效
    • 对数据卷的更新,不会影响镜像
    • 数据卷默认会一直存在,即使容器被删除

      *注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。

    二、创建数据卷

      我们可以通过两种方式来初始化Volume,这两种方式有些细小而又重要的差别。

      2.1 使用-v 声明volume  

    docker run -it --name vtest -v /data centos /bin/bash
    [root@73413fd53edb /]# ls data/
    [root@73413fd53edb /]#
    

      上面的命令会将/data挂载到容器中,并绕过联合文件系统,我们可以在主机上直接操作该目录。任何在该镜像/data路径的文件将会被复制到Volume。我们可以使用docker inspect命令找到Volume在主机上的存储位置:

    docker inspect -f {{.Mounts}} vtest
    [{volume dccde6b373f1c0f4da5b70c8dcc35bf4ecad0c499e1cfd80c258821206ee7948 /var/lib/docker/volumes/dccde6b373f1c0f4da5b70c8dcc35bf4ecad0c499e1cfd80c258821206ee7948/_data /data local  true }]
    

      这说明Docker把在/var/lib/docker/volumes下的某个目录挂载到了容器内的/data目录下。让我们从主机上添加文件到此文件夹下: 

    sudo touch /var/lib/docker/volumes/dccde6b373f1c0f4da5b70c8dcc35bf4ecad0c499e1cfd80c258821206ee7948/_data/test-file
    
    # 查看/data目录
    [root@73413fd53edb /]# ls /data
    test-file
    

      2.2 使用Dockerfile 声明volume  

    FROM centos
    VOLUME /data
    

      2.3 挂载指定的主机目录

      但还有另一件只有-v参数能够做到而Dockerfile是做不到的事情就是在容器上挂载指定的主机目录。  

    [bigberg@localhost volumes]$ docker run -itd --name vtest2 -v /data/docker/volumes/volume-test:/data centos /bin/bash
    16b1aafbc219884b32bfb0c227e1250558bca550ab7bce31b0739f63620fd688
    
    [bigberg@localhost volumes]$ sudo touch /data/docker/volumes/volume-test/test2-file 
    [bigberg@localhost volumes]$ docker-enter vtest2
    [root@16b1aafbc219 ~]# cd /data/
    [root@16b1aafbc219 data]# ls
    test2-file

    三、数据共享

      如果要授权一个容器访问另一个容器的Volume,我们可以使用-volumes-from参数来执行docker run。 

    docker run -it --name vtest3 --volumes-from vtest2 centos /bin/bash
    [root@e6ed980c8dba /]# ls /data/
    test2-file
    

      值得注意的是不管container-test是否运行,它都会起作用。只要有容器连接Volume,它就不会被删除。

    四、数据容器 

      如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。

      首先,创建一个名为 dbdata 的数据卷容器: 

    docker run -v /dbdata --name dbdata postgres echo "Data-only container for postgres"
    Data-only container for postgres
    

      然后,在其他容器中使用 --volumes-from 来挂载 dbdata 容器中的数据卷。

    docker run -d --volumes-from dbdata --name db1 postgres
    
    docker run -d --volumes-from dbdata --name db2 postgres
    

      可以使用超过一个的 --volumes-from 参数来指定从多个容器挂载不同的数据卷。 也可以从其他已经挂载了数据卷的容器来级联挂载数据卷。 

    docker run -d --name db3 --volumes-from db1 postgres
    

      *注意:使用 --volumes-from 参数所挂载数据卷的容器自己并不需要保持在运行状态。

      如果删除了挂载的容器(包括 dbdata、db1 和 db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用 docker rm -v 命令来指定同时删除关联的容器。 这可以让用户在容器之间升级和移动数据卷。

      

    五、备份

      首先使用 --volumes-from 标记来创建一个加载 dbdata 容器卷的容器,并从主机挂载当前目录到容器的 /backup 目录。命令如下:

    docker run --rm --volumes-from dbdata -v $(pwd):/backup centos tar cvf /backup/backup.tar /dbdata
    tar: Removing leading `/' from member names
    /dbdata/
    /dbdata/test-file
    [bigberg@localhost ~]$ ll
    total 606496
    -rw-r--r-- 1 root    root        10240 Feb 28 17:32 backup.tar
    

      容器启动后,使用了 tar 命令来将 dbdata 卷备份为容器中 /backup/backup.tar 文件,也就是主机当前目录下的名为 backup.tar 的文件。

    六、恢复

      如果要恢复数据到一个容器,首先创建一个带有空数据卷的容器 dbdata2。

    docker run -v /dbdata --name dbdata2 centos /bin/bash
    

      然后创建另一个容器,挂载 dbdata2 容器卷中的数据卷,并使用 untar 解压备份文件到挂载的容器卷中。

    docker run --rm --volumes-from dbdata2 -v $(pwd):/backup centos tar xvf /backup/backup.tar
    

      为了查看/验证恢复的数据,可以再启动一个容器挂载同样的容器卷来查看

    docker run --volumes-from dbdata2 centos /bin/ls /dbdata
    test-file
    

        

  • 相关阅读:
    Linux下安装Mysql
    mssql 查询效率
    查看apache是否安装及版本
    centos(linux)切换用户
    mysql操作命令(linux)
    远程连接MySql连不上1130
    JAVA环境配置
    SQLSERVER2012数据库还原
    ASP连接ACCESS数据库
    ODOO 常用widget
  • 原文地址:https://www.cnblogs.com/bigberg/p/8484966.html
Copyright © 2011-2022 走看看