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

 

posted @ 2023-05-18 12:53  小粉优化大师  阅读(1398)  评论(0编辑  收藏  举报