Docker数据管理、备份还原
1、数据管理
1.1、什么是数据管理
docker的镜像是只读的,虽然依据镜像创建的容器可以进行操作,但是我们不能将数据保存到容器中,因为容器会随时关闭和开启,那么如何将数据保存下来呢?
答案就是:数据卷和数据卷容器
1.2、容器、数据卷、数据卷容器关系图
1.2.1、什么是数据卷
就是将宿主机的某个目录,映射到容器中,作为数据存储的目录,我们就可以在宿主机对数据进行存储
缺点是:太单一了
1.2.2、什么是数据卷容器
将宿主机的某个目录,使用容器的方式来表示,然后其他的应用容器将数据保存在这个容器中,达到大批量应用数据同时存储的目的
2、数据管理命令
2.1、数据卷命令列表
]# docker run --help | grep volume -v, --volume list Bind mount a volume --volume-driver string Optional volume driver for the container --volumes-from list Mount volumes from the specified container(s)
2.2、数据卷操作
docker run -itd --name [容器名字] -v [宿主机文件]:[容器文件] [镜像名称]
注意: -v 宿主机文件:容器文件 可以存在多个,表示同时挂载多个 宿主机问文件尽量用绝对路径,容器文件即使不存在,Docker自动创建
2.3、数据卷容器操作
数据卷容器操作 1、创建数据卷容器 docker create -v [宿主机文件]:[容器数据卷目录] --name [容器名字] [镜像名称] [命令(可选)]
2、使用数据卷容器 docker run --volumes-from [数据卷容器名字] -d --name [容器名字] [镜像名称] [命令(可选)]
3、数据卷、数据卷容器实战
3.1、数据卷实战
3.1.1、挂载目录的测试
# 创建测试文件 echo "file1" >/tmp/test.txt # 启动nginx容器并且挂载硬盘 docker run -tid --name test1 -v /tmp:/test1 nginx # 进入容器查看文件是否存在 ]# docker ps -q 4895cdc85414 ]# docker exec -it 4895cdc85414 /bin/bash root@4895cdc85414:/# cat /test1/test.txt file1
3.1.2、挂载文件的测试
# 创建测试文件 echo "file" > /tmp/test.txt # 启动nginx容器并且挂载硬盘 docker run -itd --name test2 -v /tmp/test.txt:/test/file/test.sh nginx # 进入容器查看文件是否存在 ]# docker ps -q a4e39d748d54 ]# docker exec -it a4e39d748d54 /bin/bash root@a4e39d748d54:/# cat /test/file/test.sh file
3.2、数据卷容器实战
3.2.1、创建数据卷
# 创建宿主机的目录 mkdir /data # 创建vol-test容器 docker create -v /data:/data --name vol-test nginx
3.2.2、挂载数据卷
]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1b1988626027 nginx:latest "/docker-entrypoint.…" 16 seconds ago Created vol-test # 挂载数据卷 docker run --volumes-from vol-test -d --rm --name vc-test1 nginx docker run --volumes-from vol-test -d --rm --name vc-test2 nginx
3.2.3、确认效果
# 进入vc-test1,操作数据卷容器 ]# docker exec -it vc-test1 /bin/bash root@c4da80319e8c:/# echo "vc-test1">/data/vc-test1.txt root@c4da80319e8c:/# exit # 进入vc-test2,确认数据卷 ]# docker exec -it vc-test2 /bin/bash root@5c5204337447:/# cat /data/vc-test1.txt vc-test1 root@5c5204337447:/# echo "vc-test2" >/data/vc-test2.txt root@5c5204337447:/# exit #回到vc-test1进行验证 ]# docker exec -it vc-test1 cat /data/vc-test2.txt vc-test2 # 回到宿主机查看/data/目录 ]# ll /data/ -rw-r--r--. 1 root root 9 5月 17 23:40 vc-test1.txt -rw-r--r--. 1 root root 9 5月 17 23:41 vc-test2.txt
4、备份还原
4.1、基础知识
4.1.1、需求
基于数据卷和数据卷容器知识,实现容器应用内部的数据备份还原实践
4.1.2、思路图
4.1.3、数据备份方案
1、创建一个挂载数据卷容器的容器 2、挂载宿主机本地目录作为备份数据卷 3、将数据卷容器的内容备份到宿主机本地目录挂载的数据卷中 4、完成备份操作后销毁刚创建的容器以及关联的容器卷 命令格式: docker run --rm --volumes-from [数据卷容器id/name] -v [宿主机目录]:[容器目录] [镜像名称] [备份命令]
4.1.4、数据恢复方案
1、创建一个新的数据卷容器 2、创建一个新容器,挂载数据卷容器,同时挂载本地的备份目录作为数据卷 3、将要恢复的数据解压到容器中 4 完成还原操作后销毁刚创建的容器以及关联的容器卷 命令格式:docker run --rm -itd --volumes-from [数据要到恢复的容器] -v [宿主机备份目录]:[容器备份目录] [镜像名称] [解压命令]
4.2、备份实践
4.2.1、查看原来的数据卷容器
# 原来创建,参考小节创建:3.2.1、创建数据卷 ]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8c4b4deff2f4 nginx "/docker-entrypoint.…" 11 hours ago Created vol-test
4.2.2、备份操作
# 创建备份的目录 mkdir /backup # 创建备份的容器,并且挂载/backup,然后执行备份压缩至/data docker run --rm --volumes-from vol-test -v /backup:/backup nginx tar zcf /backup/data.tar.gz /data # 验证操作 ]# ll /backup/ -rw-r--r--. 1 root root 181 5月 18 11:11 data.tar.gz ]# tar tf /backup/data.tar.gz data/ data/vc-test1.txt data/vc-test2.txt 注意: 解压的时候,如果使用目录的话,一定要在解压的时候使用 -C 制定挂载的数据卷容器,不然的话容器数据是无法恢复的,因为容器中默认的backup目录不是数据卷,即使解压后,也看不到文件。
4.3、还原实践
4.3.1、删除vc-test1的数据
# 删除vc-test1的数据 docker exec -it vc-test1 /bin/bash root@bcd97d50b9f5:/# rm -fr /data/*
4.3.2、还原
# 恢复数据 docker run --rm --volumes-from vol-test -v /backup:/backup nginx tar xf /backup/data.tar.gz -C / # vc-test1容器查看 ]# docker exec vc-test1 ls -l /data total 8 -rw-r--r--. 1 root root 9 May 17 15:40 vc-test1.txt -rw-r--r--. 1 root root 9 May 17 15:41 vc-test2.txt