Hello Docker(七)——Docker数据持久化

一、Docker数据持久化简介

默认情况下,Docker容器内部新建立文件或者修改文件,效果会保存在容器的可读写层中,因此:
(1)当container消逝时,与container一体的可读写层也一并消逝,数据并未持久化。当一个container需要其它container中可读写层的数据时,读取操作异常难题。
(2)container可读写层与宿主机的文件系统慎密结合,很难举行迁徙。
(3)写入数据到container可读写层需要storage driver,与直接在宿主机文件系统中读写数据相比效率要低。
Docker支持的数据持久化方案如下:
(1)volume。
(2)bind mount。
(3)tmpfs mount,仅限Linux操作系统中。

Docker建立容器时通过参数选项指定数据持久化路径,bind mount与volume使用-v或者--volume选项,tmpfs通过--tmpfs选项。从docker17.0.6最先,推荐使用新选项--mount。
--mount参数选项如下:
type:可以是bind、volume或者tmpfs,默认是volume
source:宿主机上目录路径,可以用缩写src
destination:目的路径,容器上挂载的路径,可以用dst或者 target
readonly :可选项,容器挂载的路径会被设置为只读
volume-opt:可选项,当volume驱动接受同时多个参数作为选项时,可以以多个键值对的方式传入。
若是主机中的文件或目录不存在,当使用--mount挂载时,Docker会报错,当使用-v或--volume时,会在主机上建立目录。

二、volume持久化方案

1、volume简介

volume是Docker官方推荐的持久化方案,默认情况下,volume的存储空间来自于宿主机文件系统中的某个目录,如/var/lib/docker/volumes/,docker系统外的程序无权限修改其中的数据。
volume由Docker卖力建立、治理。用户可以显式的挪用下令docker volume create建立volume,也可以通过container、service的启动隐式建立。
一个volume可以同时供多个container使用,若是没有container使用volume,其不会自动删除,用户需运行docker volume prune明确删除。
若是用户显式建立volume,则需要给其指定一个名称;若是是隐式建立volume,Docker会自动为其分配一个在宿主机范围内唯一的名字。
Docker引入Volume缘故原由如下:
(1)删除容器时,volume不会被删除。
(2)在差别容器间共享volume(存储 / 数据)。
(3)容器与存储星散。
(4)将volume存储在远程主机或云上。

2、volume特点

docker volume create -v 建立volume时,宿主机目录路径必须以/或~/开头,否则Docker会将其当成volume 而不是bind mount。
若是宿主机上的目录不存在,docker 会自动建立目录;若是容器中的目录不存在,docker会自动建立目录;若是容器中的目录已有内容,docker会使用宿主机上目录的内容笼罩容器目录的内容。

3、挂载指定volume

docker run -it -v my-volume:/data --name container1 busybox
启动容器 container1 时,挂载名为my-volume的volume到容器的 /data目录。若是 my-volume不存在,docker会自动建立my-volume,并挂载到 /data 目录。
my-volume在宿主机目录为 /var/lib/docker/volumes/my-volume/_data
docker run -v 下令中,若是没有指定volume名称,docker会默认建立一个匿名的volume。
docker run -it -v /data --name container1 busybox
建立匿名volume位于/var/lib/docker/volumes/xxxxx/_data
可以使用docker inspect container1查看容器的volume的详细信息。
docker run -it -v test:/test --name test busybox
建立的volume位于/var/lib/docker/volumes/test/_data

4、volume使用场景

通过使用第三方提供的volume driver,用户可以将数据持久到远程主机或者云存储中。
(1)多个容器间共享数据。
(2)宿主机不保证存在牢固目录结构。
(3)持久化数据到远程主机或者云存储而非内陆。
(4)需要备份、迁徙、合并数据时。住手container,将volume整体复制,用于备份、迁徙、合并等。

三、bind mount持久化方案

1、bind mount

bind mount持久化方式将宿主机中的文件、目录挂载到容器上,响应文件、目录可以被宿主机读写,也可以被容器读写。
bind mount持久化方式可以将数据存储在宿主机械任何地方,但会依赖宿主机的目录结构,因此不能通过docker CLI直接治理,而且非Docker历程和Docker历程都可以修改。
docker run -it -v host-dava:container-data alpine sh
将host主机host-data目录mount到container中的container-data目录
bind mount注意事项:
(1)-v 宿主机目录路径必须以/或~/开头,否则docker会将其当成是volume 而不是bind mount。
(2)若是宿主机上的目录不存在,docker会自动建立目录。
(3)若是容器中的目录不存在,docker会自动建立目录。
(4)若是容器中目录已有内容,那么docker会使用宿主机上目录的内容笼罩容器目录的内容。
docker volume create vm_test
建立volume
docker run -it --mount source=vm_test,target=/test test /bin/bash
启动容器,挂载vm_test到容器/test目录

2、bind mount特点

(1)性能最好
(2)Docker容器与宿主机耦合过于慎密,移植性较差。

3、bind mount使用场景

(1)container共享宿主机配置文件,如docker将宿主机文件/etc/resov.conf文件bind mount到容器上,两者会使用相同的DNS服务器。
(2)开发环境中build容器化。开发历程中将build历程container化,将宿主机上源代码目录bind mount到build container中。修改代码后,运行build container的build下令,build container则将build效果写入另一个bind mount的目录中。
(3)监控服务container化。读取宿主机牢固文件中的数据实现监控。

,

联博统计

www.yahongf.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。

,

四、tmpfs mount持久化方案

1、tmpfs mount

tmpfs mount只在Linux主机内存中持久化,是暂且性的。当容器住手,tmpfs mount会被移除,通常用于暂且存放敏感文件。
在docker内部,swarm服务使用tmpfs方式来将secrets挂载到服务的容器中。
docker run -d -it --name tmptest --tmpfs /test busybox

2、tmpfs mount特点

(1)只能在Linux主机内存中,不会持久化到磁盘。
(2)不支持多容器间共享。

3、tmpfs mount使用场景

Docker可将用户名与密码等敏感数据保存在某个数据库中,当启动需要接见这些敏感数据的container或者service时,docker会在宿主机上建立一个tmpfs,然后将敏感数据从数据库读出写到tmpfs中,再将tmpfs mount到container中,安样能保证数据平安。当容器住手运行时,则响应的tmpfs也从系统中删除。