Docker 容器中的数据管理:数据卷( 挂载 )& 数据卷容器

生产环境,在使用 Docker 的过程中,往往需要对数据进行持久化保存,或者多个容器直接进行数据共享,

So,需要怎么做呢 ?

Docker 容器中的数据管理,主要有两种方式:数据卷( 挂载 )和数据卷容器


数据卷( 挂载 )

数据卷( 挂载 ),简单来说就是:将宿主机上的指定目录,挂载到容器内的数据卷( 容器内的一个指定目录 )

所以,可以这样理解:所谓数据卷( 挂载 ),就是将宿主机上的指定目录和容器内的指定目录相互映射,

这样就可以:在宿主机中对数据进行管理

其特点是:

  • 数据卷可以在容器之间共享和重用,宿主机和容器间传递数据更高效
  • 对数据卷的修改,立刻可见,宿主机目录或容器内均可
  • 对数据卷的更新,不会影响镜像,实现了数据和应用之间的解耦操作
  • 数据卷,会默认一直存在,即使容器被删除,直到没有容器使用

So,为什么推荐数据卷( 挂载 )?

  • 使用数据卷的方式,把宿主机上的指定目录与容器内部目录进行挂载,当容器内的文件需要频繁修改的时候,不需要进入容器,直接在宿主机指定目录下操作即可,非常方便
  • 同时,如果服务很重要的话,把重要数据挂载出来,持久化到硬盘,在必要的时候可以使用 rsync 同步到服务器
# 基本语法:docker run
     -v, --volumen list  Bind mount a volume (default []) 挂载一个数据卷,默认为空
// -v 参数的作用是:将宿主机的一个目录作为容器的数据卷,挂载到 docker 容器中,使宿主机和容器之间可以共享一个目录
// 如果本地路径不存在,Docker 也会自动创建

// 查看镜像
[root@centos7 docker]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
centos       latest    e6a0117ec169   12 months ago   272MB
[root@centos7 docker]# cd ~

// (1)指定挂载点:创建两个容器 c1、c2,并指定宿主机和容器的挂载点 -v 宿主机目录:容器目录
// 命令格式:docker run -itd --name [容器名字] -v [宿主机目录]:[容器目录][镜像名称] [命令(可选)]
// 需注意的是,宿主机目录需要绝对路径
[root@centos7 ~]# docker run -itd -v /var/www:/data1 --name c1 centos bash
[root@centos7 ~]# docker run -itd -v /var/www:/data2 --name c2 centos bash

//(2)其特点为 — 对数据卷的修改,立即可见

// 进入宿主机目录,修改内容
[root@centos7 ~]# cd /var/www
[root@centos7 www]# echo "hello" > test.txt
[root@centos7 www]# cat test.txt
hello

// 进入容器目录,查看
[root@centos7 www]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS                                   NAMES
732f18eb0b48   centos    "bash"                   About a minute ago   Up About a minute                                           c2
d22c01bb2c37   centos    "bash"                   2 minutes ago        Up 2 minutes                                                c1

[root@centos7 www]# docker attach c1
[root@d22c01bb2c37 /]# cd /data1
[root@d22c01bb2c37 data1]# cat test.txt
hello

// 在 c1 中修改
[root@d22c01bb2c37 data1]# echo "这里是c1" > test.txt
[root@d22c01bb2c37 data1]# cat test.txt
这里是c1

// 宿主机目录中的内容,会立即修改可见
[root@centos7 www]# cat test.txt
这里是c1
// c2 容器中,也同样修改可见
[root@centos7 www]# docker attach c2
[root@732f18eb0b48 /]# cd /data2
[root@732f18eb0b48 data2]# cat test.txt
这里是c1

数据卷容器

需要在多个容器之间共享一些程序更新的数据,最简单的方式是使用数据卷容器

数据卷容器,就是一个普通的容器,只不过它的作用是:专门提供数据卷,给其他容器挂载

简单来说就是,数据卷容器,就是为其他容器提供数据交互存储的容器

「 数据卷容器的操作流程 」So,如何使用数据卷容器,在多个容器之间共享数据,并永久保存这些数据 ?

  1. 创建数据卷容器
  2. 其他容器,挂载数据卷容器
# 创建数据卷容器 c3 —  一个指定了数据卷的容器
// 命令格式:docker create -v [容器数据卷目录] --name [容器名字][镜像名称] [命令(可选)]
[root@centos7 ~]# docker run -it --name c3 -v /data3 centos bash
// 对 c3 数据卷中的内容,进行修改
[root@fbd370203002 /]# cd /data3
[root@fbd370203002 data3]# echo "这里是c3" > test.txt
[root@fbd370203002 data3]# ls
test.txt
[root@fbd370203002 data3]# cat test.txt
这里是c3

// 创建另一个容器 c4,并挂载到数据卷容器 c3   --valumes-from c3
// 命令格式:docker run --volumes-from [数据卷容器id/name] -tid --name [容器名字][镜像名称] [命令(可 选)]
[root@centos7 ~]# docker run -it --name c4 --volumes-from c3 centos bash
// 在 c4 中,查看、确认数据卷
[root@f42d058b4a2f /]# cd /data3
[root@f42d058b4a2f data3]# ls
test.txt
[root@f42d058b4a2f data3]# cat test.txt
这里是c3

应用:Docker 数据备份和数据还原

为什么需要数据的备份和恢复 ?

在实际工作中,很多容器的数据需要查看,通过备份,可以很轻松的将数据拿到宿主机目录中


「 数据备份 」

其操作流程为:        // 简单来说就是,创建一个临时容器充当媒介,将数据卷容器中的数据备份到宿主机

  • 创建一个临时容器,挂载到数据卷容器( 这样,临时容器也就拥有数据了 /data )
  • 然后,将宿主机中的特定目录,映射到临时容器,成为备份数据卷( 这样宿主机和临时容器就互通了 /backup )
  • Then,临时容器中,将 /data 中的数据,压缩到 /backup 中( 这样,数据卷容器中的数据就持久化到本地了 )
  • 最后,备份操作完成后,临时容器就可以销毁掉了


# 首先,创建一个数据卷容器 centos1,容器数据卷目录为 /data
[root@centos7]# docker run -v /data --name centos1 -it centos
// 在 /data 目录中,创建文件 test.txt,并写入数据
[root@768eb640404d /]# echo "helloworld" > /data/test.txt
[root@768eb640404d /]# cat /data/test.txt
helloworld

# 然后,把 /data 中的数据备份到宿主机目录 /backup 中

// 宿主机上,创建 /backup 目录
[root@centos7 /]# mkdir backup
// 创建一个临时容器,充当媒介,进行数据备份( 备份完成后,会删除临时容器 )
// 命令格式:docker run --rm --volumes-from [数据卷容器id/name] -v [宿主机目录]:[容器目录][镜像名称] [备份命令]
[root@centos7 /]# docker run --rm --volumes-from centos1 -v /backup:/backup centos tar zcPf /backup/test.tar.gz /data

// 验证
[root@centos7 /]# cd /backup
[root@centos7 backup]# ls
test.tar.gz
[root@centos7 backup]# zcat test.tar.gz

「 数据还原 」

数据还原( 恢复 ),操作流程:

  • 删除原数据卷容器的内容( 或,创建一个新的数据卷容器 )
  • 创建一个临时容器,挂载数据卷容器,同时,挂载本地的备份目录,作为数据卷
  • 将要恢复的数据解压到临时容器中
  • 完成还原操作后,销毁刚创建的临时容器


// 删除原数据卷容器 centos1 中的内容
[root@centos7 ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                        PORTS     NAMES
768eb640404d   centos    "/bin/bash"              20 minutes ago   Exited (130) 16 minutes ago             centos1
[root@centos7 ~]# docker start 768eb640404d
[root@centos7 ~]# docker attach 768eb640404d
[root@768eb640404d /]# rm -rf /data/*          // data中的内容已经被删除了

// 数据恢复
[root@centos7 ~]# docker run --rm --volumes-from centos1 -v /backup:/backup centos tar xPf /backup/test.tar.gz -C /data

// 验证:数据已经恢复了
[root@centos7 ~]# docker attach 768e
[root@768eb640404d /]# cd /data
[root@768eb640404d data]# ls
test.txt
[root@768eb640404d data]# cat test.txt
helloworld