Docker容器技术与高可用实战
上QQ阅读APP看书,第一时间看更新

1.5 Docker的数据管理

在Docker中,为了方便地查看容器内产生的数据或者共享多个容器之间的数据,就用到容器的数据管理操作。

管理Docker容器中的数据主要有两种方式:数据卷(Data Volumes)和数据卷容器(Data Volumes Containers)。

1.数据卷

数据卷是一个供容器使用的特殊目录,位于容器中。可以将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据后不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于Linux下对目录进行的mount操作。

2.创建数据卷

在docker run命令中使用-v选项可以在容器内创建数据卷,多次使用-v选项可以创建多个数据卷。使用-name选项可以给容器创建一个友好的自定义名称。

例如,使用httpd:centos镜像创建一个名为web的容器,并且创建两个数据卷,分别挂载到/datal与/data2目录上:

[root@localhost ~]#docker run-d-v/datal-v/data2-name web httpd:centos

025df41fd123706edcfd1f31f4367c7890cb07e701040f0b886da2350695887d

进入容器中,可以看到两个数据卷已经创建成功,并分别挂载到/datal与/data2目录上:

[root@localhost ~]#docker exec-it web/bin/bash

[root@025df41fd123]#1s-1

total44

-rw-r--r--. 1rootroot18302May1712:11anaconda-post.log

lrwxrwxrwx.  1rootroot  7May 1712:03bin->usr/bin

drwxr-xr-x. 3rootroot  17Jun  303:10boot

drwxr-xr-x. 2rootroot  6Jun  313:47data1

drwxr-xr-x. 2rootroot  6Jun  313:47data2

drwxr-xr-x. 5rootroot 360Jun  313:47dev

drwxr-xr-x.  49rootroot 4096Jun  313:47etc

drwxr-xr-x. 2rootroot  6Aug 12 2015home

lrwxrwxrwx.  1rootroot  7May 1712:03lib->usr/lib

lrwxrwxrwx.  1rootroot  9May 1712:03lib64->usr/lib64

drwx------. 2rootroot  6May 1712:02lost+found

drwxr-xr-x. 2rootroot  6Aug 12 2015media

drwxr-xr-x. 2rootroot  6Aug 12 2015mnt

drwxr-xr-x. 2rootroot  6Aug 12 2015opt

dr-xr-xr-x.  453rootroot 0Jun  313:47proc

dr-xr-x---. 2rootroot 4096May 1712:11root

drwxr-xr-x. 4rootroot  32Jun  303:10run

-rwxrwxr-x.  1rootroot  71Jun  302:57run.sh

lrwxrwxrwx.  1rootroot  8May 1712:03sbin->usr/sbin

drwxr-xr-x. 2rootroot  6Aug 12 2015srv

dr-xr-xr-x. 13rootroot  0Jun  206:25sys

drwxrwxrwt.  7rootroot 4096Jun  313:47tmp

drwxr-xr-x.  13rootroot 4096May 1712:03usr

drwxr-xr-x.  19rootroot 4096Jun  303:10var

[root@025df41fd123 /]# exit

exit

[root@localhost ~]#

3.挂载主机目录作为数据卷

使用docker run命令的-v选项可以在创建数据卷的同时,将宿主机的目录挂载到数据卷上使用,以实现宿主机与容器之间的数据迁移。

注意

宿主机本地目录的路径必须是绝对路径。如果路径不存在,Docker会自动创建相应的路径。

例如,使用httpd:centos镜像创建一个名为web-1的容器,并且将宿主机的/var/www目录挂载到容器的/data1目录上:

[root@localhost ~]# docker run -d -v /var/www:/data1 --name web-1 httpd:centos

85298d93e25eb10c7937596868891440d10f83a36e23a61d2cead5c1349cb969

在宿主机本地/var/www目录中创建一个文件file,进入运行的容器中。在挂载目录下可以看到之前创建的文件file,成功实现从宿主机到容器的数据迁移。

[root@localhost ~]# cd /var/www/

[root@localhost www]# touch file

[root@localhost www]# ls

file

[root@localhost ~]#dockerexec-itweb-1/bin/bash

[root@85298d93e25e /]# ls

anaconda-post.log data1 home lost+found opt  run  srv  usr

bin  dev  lib  media proc  run.sh sys  var

boot etc  lib64 mnt   root sbin  tmp

[root@85298d93e25e /]# cd data1/

[root@85298d93e25e data1]# ls

file

同理,在宿主机相应的挂载目录中也可以访问在容器数据卷中创建的数据。

4.数据卷容器

如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器是一个普通的容器,专门提供数据卷给其他容器挂载。使用方法如下:首先,需创建一个容器作为数据卷容器,之后在其他容器创建时用--volumes-from挂载数据卷容器中的数据卷即可。

例如,使用前面预先创建好的数据卷容器web,其中创建的数据卷分别挂载到/data1与/data2目录上,使用--volumes-from来挂载web容器中的数据卷到新的容器,新的容器名为db1:

[root@localhost ~]#dockerrun-it--volumes-fromweb --namedb1httpd:centos/bin/bash

[root@58de329e2bdf /]# ls

anaconda-post.log boot  data2 etc  lib  lost+found mnt proc run

sbin sys usr bin  data1 dev  home lib64 media  opt root run.sh

srv  tmp var

在db1容器数据卷/data1目录中创建一个文件file。在web容器的/data1目录中,可以查看到它。

[root@58de329e2bdf /]# cd data1

[root@58de329e2bdf data1]# touch file

[root@58de329e2bdf data1]# ls

file

[root@58de329e2bdf data1]# exit

exit

[root@localhost ~]# docker exec -it web /bin/bash

[root@025df41fd123 /]# cd data1

[root@025df41fd123 data1]# ls

file