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