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,如何使用数据卷容器,在多个容器之间共享数据,并永久保存这些数据 ?
- 创建数据卷容器
- 其他容器,挂载数据卷容器
# 创建数据卷容器 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


