Docker的数据管理

栏目: 编程工具 · 发布时间: 6年前

内容简介:Docker镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker会加载只读镜像层并在其上(即镜像栈顶部)添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)。为了能够保存(持久化)数据以及共享

Docker镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker会加载只读镜像层并在其上(即镜像栈顶部)添加一个读写层。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除 Docker 容器,并通过该镜像重新启动时,之前的更改将会丢失。

在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)。

为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念。

简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。

> 总结:Volume可以将容器以及容器产生的数据分离开来,当你使用docker rm

my_container删除容器时,不会影响相关的数据。

我们可以通过两种方式来初始化Volume,这两种方式有些细小而又重要的差别。我们

可以在运行时使用-v来声明Volume:

docker管理数据的方式有两种:

∙ 数据卷(Data Volumes)

∙ 数据卷容器(Data Volumes Containers)

数据卷:

数据卷是为一个或多个容器专门指定绕过Union File System的目录,位于容器中,可将

宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜

像,从而实现数据在宿主机与容器之间的迁移,为持续性或共享数据提供一些有用的功能,

数据卷的使用,类似于 Linux 下对目录进行的mount操作

∙ 数据卷可以在容器间共享和重用

∙ 数据卷数据改变是直接修改的

∙ 数据卷数据改变不会被包括在容器中

∙ 数据卷是持续性的,直到没有容器使用它

1、创建数据卷

在docker run 命令中使用-v选项可以在容器中创建数据卷。多次使用-v选项可以创建多个

数据卷。例如:

[root@docker01 ~]# docker run -itd -v /data1 -v /date2 --name web003 centos:httpv1

90030942574d6b47b6be2922a86b38f7483956f6231ab5e30fccc9d4431f61ec

进入容器web003,可以看到两个数据卷已经创建成功并分别挂载到/data1与/date2上

Docker的数据管理

可以使用docker inspect web003查看到挂载的数据卷

[root@docker01 ~]# docker inspect web003

Docker的数据管理

用户也可以在Dockerfile中指定数据卷:

例如:

FROM debian:wheezy

VOLUME /data

注1:Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro 指定为只读。

例如:

Docker的数据管理

2、挂载主机目录作为数据卷

如果想在容器中使用主机上的某个目录,你可以通过-v参数来指定(注:注意冒号前面的

和后面的内容):

docker run -v /host/path:/some/path ...

这明确地告诉Docker使用指定的主机路径来代替Docker自己创建的根路径并挂载到容器内

指定的路径(以上例子为/some/path)。需要注意的是,宿主机本地目录上的路径必须使

用绝对路径,如果主机上的路径不存在,目录将自动在给定的路径中创建。

在用 docker run 命令的时候,可以指定挂载一个本地主机的目录到容器中去,可以使用多

次-v选项为一个 docker 容器运行挂载多个本地主机目录。

实例:1、在宿主机上创建/web/webapp1目录,并创建一个index.html文件,内容如下:

[root@docker01 ~]# mkdir /web/webapp1 -p

[root@docker01 ~]# cd /web/webapp1/

[root@docker01 webapp1]# echo "<h1> hello world</h1>" >> index.html

[root@docker01 webapp1]# cat index.html

<h1> hello world</h1>

[root@docker01 webapp1]#

2、使用带有apache服务的一个镜像,生成容器

[root@docker01 ~]# docker run -itd -v /web/webapp1/:/var/www/html/ -p 8000:80 --name web005

Docker的数据管理

3、访问容器的网站服务:

Docker的数据管理

上面的命令加载主机的 /web/webapp1 目录到容器的 /var/www/html 目录。这个功

能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否

正常工作。本地目录的路径必须是绝对路径,如果目录不存在 Docker 会自动为你创建

它。/web/webapp1目录的文件都将会出现在容器内。这对于在主机和容器之间共享文件

是非常有帮助的,例如挂载需要编译的源代码。为了保证可移植性(并不是所有的系统的主

机目录都是可以用的),挂载主机目录不需要从Dockerfile指定。

数据卷容器:

如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器

就是一个普通的容器,专门提供数据卷给其它容器挂载使用。

使用方法如下:首先,需要创建一个容器作为数据卷容器,之后在其它容器创建时用-

-volumes-from挂载数据卷容器中的数据卷使用。

常见的使用场景是使用纯数据卷容器来持久化数据库、配置文件或者数据文件等。

例如:docker run --name dbdata postgres echo "Data-only container for postgres"

该命令将会使用一个已经包含在Dockerfile里定义过Volume的postgres镜像来生成一个容

器dbdata(如:VOLUME /var/lib/postgresql/data),运行echo命令然后退出。当我

们运行docker ps命令时,echo可以帮助我们识别某镜像的用途。我们可以用--volumesfrom命令来识别其它容器的Volume:

docker run -d --volumes-from dbdata --name db1 postgres

实例:

现在就来创建一个命名的数据卷容器:

#docker run -dit -v /test --name data 镜像

Docker的数据管理

使用--volumes-from选项在另一个容器中挂载/test卷。不管data容器是否运行,其它容器

都可以挂载该容器数据卷,当然如果只是单独的数据卷是没必要运行容器的。

然后,你可以在其他容器中使用 --volumes-from 来挂载/test卷

#docker run -dit --volumes-from data --name test1 镜像

Docker的数据管理

再添加一个容器:

Docker的数据管理

注:还可以使用多个 --volumes-from 参数来从多个容器挂载多个数据卷

执行docker ps查看

Docker的数据管理

进入test1、test2容器,执行df查看

Docker的数据管理

也可以继承其它挂载有 /test 卷的容器

#docker run -dit --volumes-from test1 --name test3 镜像

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

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

同时删除关联的容器。利用 Data Volume Container来备份、恢复、移动数据

备份

数据卷另外一个功能是使用他们来备份、恢复、移动数据,如果你在用数据容器,那做备

份是相当容易的。使用 --volume 标记来创建一个加载了卷的新的容器,命令如下:

该示例应该会将Volume里所有的东西压缩为一个tar包

[root@docker01 ~]# docker run --rm --volumes-from data -v $(pwd):/backup centos:httpv1 tar cvf /backup/backup.tar /test

Docker的数据管理

这里我们创建了一个容器,先从data容器来挂载数据卷。然后从本地主机挂载当前目录到

容器的 /backup 目录。最后,使用tar命令来将data 卷备份为backup.tar 。当命令执行

完、容器停止之后,我们就备份了 data 数据卷

执行完成之后删除容器 --rm,此时备份就在当前的目录下,名为backup.tar

宿主机当前目录下产生了test卷的备份文件test.tar

Docker的数据管理
Docker的数据管理

恢复

docker run --volumes-from data -v /root/:/backup centos:httpv1 tar zxf /backup/backup.tar -C /test/

Docker的数据管理

附:

权限与许可

通常你需要设置Volume的权限或者为Volume初始化一些默认数据或者配置文件。要注意

的关键点是,在Dockerfile的VOLUME指令后的任何指令都不能改变该Volume,比如:

FROM debian:wheezy

RUN useradd foo

VOLUME /data

RUN touch /data/x

RUN chown -R foo:foo /data

该Docker file不能按预期那样运行,我们本来希望touch命令在镜像的文件系统上运行,但

是实际上它是在一个临时容器的Volume上运行。如下所示:

FROM debian:wheezy

RUN useradd foo

RUN mkdir /data && touch /data/x

RUN chown -R foo:foo /data

VOLUME /data

所以,牢记Dockerfile中VOLUME指令的位置(VOLUME是设置指令)

如果你没有通过RUN指令设置权限,那么你就需要在容器启动时使用CMD或ENTRYPOINT

指令来执行

删除 Volumes

Volume 只有在下列情况下才能被删除:

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

例如:你可以告诉Docker同时删除容器和其Volume:

docker rm -v my_container

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

即使用以上两种命令,也只能删除没有容器连接的Volume。连接到用户指定主机目录

的Volume永远不会被docker删除。否则,会在/var/lib/docker/volumes目录下得到一些

僵尸文件和目录,并且还不容易说出它们到底代表什么。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Getting Real

Getting Real

Jason Fried、Heinemeier David Hansson、Matthew Linderman / 37signals / 2009-11-18 / USD 24.99

Getting Real details the business, design, programming, and marketing principles of 37signals. The book is packed with keep-it-simple insights, contrarian points of view, and unconventional approaches......一起来看看 《Getting Real》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具