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