Docker数据管理


​ 生产环境中使用Docker的过程中,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及到容器的数据管理操作。

​ 容器中管理数据主要有两种方式:

  1. 数据卷:容器内数据直接映射到本地主机环境
  2. 数据卷容器:使用特定容器维护数据卷

数据卷

​ 数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount操作。

​ 数据卷特性:

  1. 数据卷可以在容器之间共享和重用,容器间传递数据将变的高效方便
  2. 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作
  3. 对数据卷的更新不会影响镜像,解耦了应用和数据
  4. 卷会一直存在,直到没有容器使用,可以安全的卸载它

在容器内创建一个数据卷

1
2
3
4
5
6
docker run -v /dir
-v:在容器内创建一个数据卷,多次使用-v可创建多个数据卷

docker run -d --name ub -v /aa ubuntu:latest /bin/bash
-d:在后台以守护态运行容器
--name:指定容器的别名

111.png

222.png

333.png

上图的目录即为挂载到容器的本地主机路径

挂载一个主机目录作为数据卷(推荐)

1
2
3
docker run -it -P --name bu -v /opt/a:/b:ro  ubuntu:latest /bin/bash

-P:端口映射,随机本地端口映射容器开放端口

将主机的/opt/a目录加载到容器的/b目录,权限为只读

2.png

3.png

4.png

本地路径需使用绝对路径,如果目录不存在,Docker会自动创建

Docker挂载的数据卷默认权限是读写(rw)

挂载一个本地主机文件作为数据卷(不推荐)

1
2
3
docker run --rm -it -v ~/1.txt:/2.txt  ubuntu /bin/bash

--rm=true|false:容器退出后是否自动删除,不可与-d同时使用

5.png

6.png


数据卷容器

​ 如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。

​ 数据卷容器也是一个容器,它的目的是专门用来提供数据卷供其他容器挂载

1.创建数据卷容器data,并在其中创建一个数据卷挂载到/dbdata

1
docker run -it -v /dbdata --name data ubuntu

7.png

2.在其他容器中,挂载data容器中的数据卷

1
docker run -it --volumes-from data --name db1 ubuntu

8.png

3.可以从其他已挂载了数据卷的容器来挂载数据卷

1
docker run -d --name db2 --volumes-from db1 ubuntu

9.png

4.多次使用--volumes-from参数可从多个容器挂载多个数据卷

10.png

11.png

12.png

5.删除数据卷

数据卷只有在下列情况下才能被删除:

1.docker rm -v删除容器时添加了-v选项

2.docker run --rm运行容器时添加了--rm选项

否则,会在/var/lib/docker/volumes目录中遗留很多不明目录。

13.png


利用数据卷容器来迁移数据

​ 可以利用数据卷容器对其中的数据卷进行备份,恢复,以实现数据的迁移。

备份

1
2
3
4
docker run --privileged --rm --volumes-from data -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata

--rm:在容器退出时就能够自动清理容器内部的文件系统,不可与-d同时使用
--privileged:使用该参数,容器内的root拥有真正的root权限。否则,容器内的root只是外部的一个普通用户权限。

首先,利用ubuntu镜像创建了一个容器worker;其次,使用--volumes-from参数让worker容器挂载data容器的dbdata数据卷;再次,使用-v参数来挂载本地当前目录到worker容器的/backup目录;

最后,容器启动后,使用tar cvf /backup/backup.tar /dbdata命令将/dbdata目录下内容备份为容器内的/backup/backup.tar,即本地主机当前目录下的backup.tar

14.png

16.png

15.png

恢复

1.首先创建一个带有数据卷的容器data2

1
docker run -it -v /dbdata2 --name data2 ubuntu /bin/bash

17.png

2.创建一个新的容器,挂载data2容器的数据卷,并使用tar命令解压备份文件到所挂载的数据卷中

1
docker run --privileged --volumes-from data2 -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar -C /dbdata2

18.png

19.png

---------------The End---------------
0%