docker 系列14 数据管理 上(待整理)
一.介绍
在生产环境中使用docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及到容器的数据管理操作。容器中的管理数据主要有两种方式:1.数据卷(data volumes) 容器内数据直接映射到本地主机环境。2.数据卷容器(data volume Containers) 使用特定容器维护数据卷。
本章将首先介绍如何在容器内创建数据卷,并且把本地的目录或文件挂载到容器内的数据卷中。接下来介绍如何使用数据卷容器在容器和主机、容器与容器之间共享数据,并实现数据的备份和恢复。
二.数据卷
数据卷(data volumes)是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于linux中的mount行为。
数据卷可以提供很多有用的特性:
数据卷可以在容器之间共享和重用,容器间传递数据将变得高效与方便。
对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作。
对数据卷的更新不会影响镜像,解耦开应用和数据。
卷会一直存在,直到没有容器使用,可以安全地卸载它。
1.创建数据卷
docker提供了volume子命令来管理数据卷,如下命令可以快速在本地创建一个数据卷:
[root@k8s-host ~]# docker volume create -d local test test [root@k8s-host ~]# cd /var/lib/docker/volumes [root@k8s-host volumes]# ls metadata.db test [root@k8s-host volumes]#
除了create子命令外,还支持docker volume的 inspect(查看详细信息)、 ls (列出已有数据卷)、prune(清理无用数据卷)、rm(删除数据卷)等
文档:https://docs.docker.com/engine/reference/commandline/volume_create/
[root@k8s-host volumes]# docker volume inspect test [ { "CreatedAt": "2020-05-09T18:07:25+08:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/test/_data", "Name": "test", "Options": {}, "Scope": "local" } ] [root@k8s-host volumes]# docker volume ls DRIVER VOLUME NAME local test
2.绑定数据卷
除了使用volume子命令来管理数据卷外,还可以在创建容器时将主机本地的任意路径挂载到容器内作为数据卷,这种形式创建的数据卷称为绑定数据卷。在用docker [container] run命令的时候,可以使用-mount选项来使用数据卷。 -mount 选项支持三种类型的数据卷,包括:
(1)volume:普通数据卷,映射到主机/var/lib/docker/volumes路径下;
(2)bind:绑定数据卷,映射到主机指定路径下;
(3)tmpfs:临时数据卷,只存于内存中。
下面使用k8swebapi镜像来创建一个k8swebapi容器,并创建一个数据卷挂载到容器的/opt/data目录
[root@k8s-host opt]# docker run -d --rm -P --name k8swebapi --mount 'type=bind,source=/data,target=/opt/data' k8swebapi 09a1cbabf87bbd9772574e2314db9c0d14daf0d547db7befe9c279e96c995ef5
创建后,查看该容器的详细信息,验证创建卷,如下所示:表明安装是一个卷,它显示了正确的源和目标,并且该安装是可读写的
[root@k8s-host opt]# docker inspect k8swebapi ... "Mounts": [ { "Type": "bind", "Source": "/data", "Destination": "/opt/data", "Mode": "", "RW": true, "Propagation": "rprivate" } ], ...
这个功能在进行应用测试的时候十分方便,比如开发人员放一个文件到本地目录/opt/data下 ,那么k8swebapi容器内 /data目录可以查看和操作。
注意:在创建卷的时候本地目录的路径必须是绝对路径,容器内路径可以为相对路径。如果目录不存在,docker会自动创建。
docker挂载数据卷的默认权限是读写(rw),用户也可以通过ro指定为只读。如果是只读,那么容器内对数据卷内的数据就无法修改了。