05 数据管理

[TOC]

00X01 管理数据方式

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

  • 数据卷: 容器内数据直接映射到宿主机
  • 数据卷容器: 使用特定容器维护数据卷

00X012 数据卷

数据卷是一个可供容器使用的特殊目录,它将宿主机系统目录直接映射到容器内部,类似Linux的mount

数据卷可提供的特性:

  • 在容器之间共享和重用,数据传递高效方便
  • 实时生效,无论容器内还是宿主机
  • 更新数据卷不影响镜像,解耦应用和数据
  • 当容器停止或被移除时,该卷依然存在
  • 当明确删除卷时,卷才会被删除
  • 将容器的数据存储在远程主机或其他存储上
  • 将数据从一台Docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)

应用场景:

  • 在多个容器之间共享数据,多个容器可以同时以只读或者读写的方式挂载统一个数据卷,从而共享数据卷中的数据
  • 当宿主机不能保证一定存在某一个目录或一些固定的文件路径时,使用数据卷可以规避这种限制带来的问题
  • 当想把容器中的数据存储在宿主机之外的地方时,比如远程主机上和云存储上
  • 当你需要把容器数据在不同宿主机之间备份、恢复或迁移时,数据卷是很好的选择

00X013 数据卷容器

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

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

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

00X02 将数据从宿主机挂载到容器

Docker提供三种方式将数据从宿主机挂载到容器中:

TypeDescription
volumesDocker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。
bind mounts将宿主机上的任意位置的文件或者目录挂载到容器中。
tmpfs挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用tmpfs,同时避免写入容器可写层提高性能。

00X021 创建数据卷

Volume

[[email protected] ~]$ docker volume create www-data
www-data
[[email protected] ~]$ docker volume ls
DRIVER              VOLUME NAME
local               www-data
[[email protected] ~]$ docker volume inspect www-data
[
    {
        "CreatedAt": "2020-05-29T19:37:32+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/www-data/_data",
        "Name": "www-data",
        "Options": {},
        "Scope": "local"
    }
]

再使用-v 或者 --mount 挂载

[[email protected] ~]$ docker run -d --name=nginx-test --mount src=www-data,dst=/usr/share/nginx/html nginx
[[email protected] ~]$ docker run -d --name=nginx-test -v www-data:/usr/share/nginx/html nginx

如果没有指定数据卷,则自动创建

Bind Mounts

Bind Mounts特点:

  • 从主机共享配置文件到容器。默认情况下,挂载主机/etc/resolv.conf到每个容器,提供DNS解析。
  • 在Docker主机上的开发环境和容器之间共享源代码。例如,可以将Maven target目录挂载到容器中,每次在Docker主机上构建Maven项目时,容器都可以访问构建的项目包。
  • 当Docker主机的文件或目录结构保证与容器所需的绑定挂载一致时
#用卷创建一个容器:
[[email protected] ~]$ docker run -d -it --name=nginx-test --mount type=bind,src=/app,dst=/usr/share/nginx/html nginx

[[email protected] ~]$ docker run -d -it --name=nginx-test -v /app:/usr/share/nginx/html nginx

#验证绑定:
[[email protected] ~]$ docker inspect nginx-test

#清理:
[[email protected] ~]$ docker stop nginx-test
[[email protected]-node1 ~]$ docker rm nginx-test

1.如果源文件/目录没有存在,不会自动创建,会抛出一个错误。
2.如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏。

00X022 创建数据卷容器

创建一个命名的数据卷容器 dbdata:

[[email protected] ~]$ sudo docker run -d -v /dbdata --name dbdata busybox

在其他容器中使用 --volumes-from 来挂载 dbdata 容器中的数据卷。

[[email protected] ~]$ sudo docker run -d --volumes-from dbdata --name db1 busybox
[[email protected] ~]$ sudo docker run -d --volumes-from dbdata --name db2 busybox

还可以使用多个 --volumes-from 参数来从多个容器挂载多个数据卷。 也可以从其他已经挂载了数据卷的容器来挂载数据卷。

[[email protected] ~]$ sudo docker run -d --name db3 --volumes-from db1 busybox

注意:使用 --volumes-from 参数所挂载数据卷的容器自己并不需要保持在运行状态。

如果删除了挂载的容器(包括 dbdata、db1 和 db2),数据卷并不会被自动删除。

如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用 docker rm -v 命令来指定同时删除关联的容器。

这可以让用户在容器之间升级和移动数据卷。

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

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

创建一个数据卷容器dbdata

[[email protected] ~]$ docker run -it -v /dbdata --name dbdata ubuntu

在其他容器中使用--volumes-from来挂载dbdata容器中的数据卷.

例如创建db1和db2两个容器,并从dbdata容器挂载数据卷:

[[email protected] ~]$ docker run -it --volumes-from dbdata --name db1 ubuntu 

[[email protected] ~]$ docker run -it --volumes-from dbdata --name db2 ubuntu 

容器db1和db2都挂载同一个数据卷到相同的/dbdata目录。

三个容器任何一方在该目录下的写入,其他容器都可以看到。

可以多次使用--volumes-from参数来从多个容器挂载多个数据卷。

还可以从其他已经挂载了容器卷的容器来挂载数据卷。

使用--volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态。

如果删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会被自动删除。

如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用docker rm -v命令来指定同时删除关联的容器。

00X0231 备份

首先利用ubuntu镜像创建了一个容器worker。

使用--volumes-from dbdata参数来让worker容器挂载dbdata容器的数据卷(即dbdata数据卷),

使用-v $(pwd):/backup参数来挂载本地的当前目录到worker容器的/backup目录。

worker容器启动后,使用了

tar cvf /backup/dbdata.tar /dbdata

命令来将/dbdata下内容备份到容器内的/backup/下

即宿主主机当前目录下的dbdata.tar

[[email protected] ~]$ docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/dbdata.tar /dbdata
[[email protected] ~]$ls
dbdata.tar

00X0232 恢复

如果要将数据恢复到一个容器

首先创建一个带有数据卷的容器dbdata2:

$ docker run -v /dbdata --name dbdata2 ubuntu /bin/bash

然后创建另一个新的容器,挂载dbdata2的容器,并使用untar解压备份文件到所挂载的容器卷中:

$ docker run --volumes-from dbdata2 -v $(pwd):/backup --name worker ubuntu bash

cd /dbdata

tar xvf /backup/dbdata.tar

在docker持续化挂载同时,推荐定期将宿主机的数据进行备份,或者使用RAID,Ceph,HDFS

Last modification:May 29th, 2020 at 10:00 pm
如果觉得我的文章对你有用,请随意赞赏