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

  1. 数据卷(Data Volumes) 容器内数据直接映射到本地宿主机。
  2. 数据卷容器(Data Volume Containers)使用特定容器维护数据卷。

数据卷

数据卷(Data Volume)是一个经过特殊设计的目录,它将主机目录直接映射进容器。可以绕过联合文件系统(UFS),为一个或多个容器提供访问。

数据卷设计的目的,在于数据的永久化,它完全独立于容器的生存周期,因此,Docker 不会再容器删除时删除其挂载的数据卷,也不会存在类似的垃圾回收机制对容器应用的数据卷进行删除处理。
📃 Docker数据管理 - 图1

数据卷的特点:

  • 数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中
  • 数据卷存在于宿主机中,可宿主机与容器进行共享
  • 数据卷可以在容器间共享和重用
  • 可以对数据卷里的内容直接进行修改,修改回马上生效,无论是容器内操作还是本地操作
  • 数据卷的变化不会影响镜像的更新
  • 卷会一直存在,即使挂载数据卷的容器已经被删除

添加数据卷

使用 -v(—volume) 选项为容器添加数据卷,格式如下:

  1. docker run -it -v hostDirectory:containerDirectory imageName /bin/bash

举个例子:

  1. docker run --name server -v ~/data_volume:/data -it ubuntu /bin/bash

其中 ~/data_volume 为宿主机上的目录,/data 为容器中要映射的目录。

指定访问权限

  1. $ docker run --name server -v ~/data_volume:/data:ro -it ubuntu /bin/bash

在创建容器的时候,可以在数据卷映射参数后面加上访问权限,比如上面的 ro,是只读权限。

  • ro read only
  • rw read write

删除数据卷

默认情况下,删除挂载了数据卷的容器并不会删除数据卷,但可以使用以下命令来达到删除容器的同时并删除数据卷的目的:

  1. docker rm -v [container name]

Dockerfile 配置数据卷

在使用 Dockerfile 构建包含数据卷的镜像:

  1. VOLUME["volumePath1"]

:::info 使用 VOLUME 指令需要提供一个数组,指定的都是容器中的路径,在容器启动时不需要添加 -v 指令,系统会自动分配一个宿主机的目录映射到指定的数据卷目录。 :::

数据卷容器

命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器就叫做数据卷容器。
📃 Docker数据管理 - 图2

挂载数据卷容器的方法:

$ docker run --volumes-from [CONTAINER NAME]

通过数据卷容器,可以在不暴露宿主机映射目录的情况下,使用已知容器创建的数据卷。

数据卷的生命周期一直持续到没有容器使用它为止。

数据卷备份还原

通过以下命令进行数据卷备份:

docker run \
  --volumes-from [CONTAINER NAME] \
  -v $(pwd):/backup \
  ubuntu \
  tar cvf /backup/backup.tar [CONTAINER DATA VOLUME]

📃 Docker数据管理 - 图3

示例:

$ docker run \
    --name ubuntu_backup
  --volumes-from container_from \
  -v ~/backup:/backup \
  ubuntu \
  tar cvf /backup/backup.tar /data_volume

对以上命令的解释:

  1. 使用ubuntu镜像创建一个容器,取名为ubuntu_backup
  2. 从container_from容器中所有的数据卷挂载到ubuntu_backup容器中(假设数据卷为/data_volume)
  3. 将ubuntu_backup容器中的/backup目录挂载到宿主机中的~/backup目录
  4. 使用ubuntu_backup容器中的 tar cvf 命令将数据卷目录 /data_volume 打包到 /backup/backup.tar,达到备份的目的
  5. 在宿主机中的~/backup下即可看到此tar文件

同样地,使用 tar xvf 命令以相同的格式还原一个数据卷:

$ docker run \
  --volumes-from [CONTAINER NAME] \
  -v $(pwd):/backup \
  ubuntu \
  tar xvf /backup/backup.tar [CONTAINER DATA VOLUME]

参考:Backup, restore, or migrate data volumes

数据卷容器实例1

  1. 拉一个centos的容器镜像

    docker pull centos
    
  2. 然后运行这个镜像并创建一个数据卷挂载到/mydata

    docker run -it -v /data:/mydata --name mycentos centos
    
  3. 再运行一个容器,在这两个容器中使用—volumes-from来挂载mycentos容器中的数据卷

    docker run -it --volumes-from mycentos --name soncentos1 centos
    docker run -it --volumes-from mycentos --name soncentos2 centos
    

    此时,容器soncentos1和soncentos2都挂载同一个数据卷到相同的/mydata 目录。三个容器任何一方在该目录下的写入数据,其他容器都可以看到。

数据卷容器实例2

下面以jenkins为例,示例数据卷容器的创建。

  1. 创建一个jenkins容器

    docker run --name jenkins -p 50000:50000 -p 8080:8080 -v /datas/jenkins_home:/var/jenkins_home jenkinsci/blueocean
    
  2. 创建数据卷容器

    docker run -it --name jenkins-data --volumes-from jenkins centos
    [root@97e52c9ad535 /]# cd /var
    [root@97e52c9ad535 var]# ls
    adm    crash  empty  games   jenkins_home  lib    lock  mail  opt       run    tmp
    cache  db     ftp    gopher  kerberos      local  log   nis   preserve  spool  yp   
    [root@97e52c9ad535 var]# exit
    
  3. 数据备份

    docker run --volumes-from jenkins-data -v /buckup:/home centos tar cvf /home/jenkins.tar /var/jenkins_home