朋友们,我们的容器技术文章又来了。今天的文章主要为大家讲解一下容器存储。通过这篇文章,我们可以了解容器镜像结构、未来宿主机数据挂载到容器的方式、容器数据卷和数据卷备份恢复技术,下面一起来学习吧!01Docker存储概述默认情况下,容器中所有创建的文件和数据都存储在如果默认操作容器的可写层,会存在以下问题:1)如果容器被删除了,如果另一个进程要调用容器中的数据会很困难;2)容器的可写层与运行中的容器主机紧耦合,数据不能轻易迁移到其他地方;3)容器数据写入容器可写层时,需要存储驱动(containerstoragedriver)管理文件系统进行写入,因为这一层的加入导致其他效率远低于直接将数据写入宿主机的文件系统.针对以上问题,Docker提供了四种不同的方式将数据从Docker宿主机直接挂载到容器中,分别是卷(volumes)、绑定挂载(bindmounts)、临时文件系统(tmpfs)和命名通道(namedpipe),这四种命名管道方式是windows系统特有的(因为实际工作中容器大多部署在linux系统,所以本文主要介绍前三种挂载方式)。卷(volumes)、绑定挂载(bindmounts)和临时文件系统(tmpfs)具有以下特点:1)卷存储在Docker管理的主机文件系统的一部分(/var/lib/docker/volumes/),完全由Docker管理,volumestorage是docker数据存储最推荐的方式;2)bindmounts绑定挂载,可以存放在宿主机系统的任何地方,甚至是重要的系统文件或目录,Docker宿主机或Docker容器上的非Docker进程都可以随时修改;3)tmpfs只保存在主机系统的内存中,不会写入主机的文件系统。下面就来看看这三种存储方式是如何创建的吧!02Volumes(卷)是三种存储方式中唯一使用Docker创建和管理的。volume的推荐使用场景如下:1)在多个运行的Container中进行数据共享;2)当你想将容器数据存储在远程主机或云端时;3)当你需要将数据从一台Docker主机备份、恢复或迁移到另一台时,卷是一个更好的解决方案;4)容器内的程序需要更好的IO性能。下面看看如何使用docker命令对卷进行操作(一)查看卷列表1.#查看卷列表2.#dockervolumeels(二)创建卷创建卷的具体命令如下:1.#创建一个volume2.#dockervolumecreate[VolumeName]我们现在创建一个volume2,查看创建volume的详细参数,操作如下1.#Createvolume2.#dockervolumecreatevolume23。#4。#查看volume2的详细信息5.#dockervolumeinspectvolume2(3)挂载volume挂载volume是创建容器时Bind,创建容器后添加参数dockercontainerrun挂载volume,有两种方式挂载,一种是通过-v和另一个是通过--mount,-v是用来单独挂载-mount的容器,一般用于docker服务(也就是dockerswarm)。下面是这两个参数的具体说明:1.-v:2.由三个字段组成,用冒号(:)隔开,[HOST-DIR:]CONTAINER-DIR[:OPTIONS]3.1)HOST-DIR表示主机上目录或数据卷的名称。当省略这部分时,会自动创建一个匿名卷。如果是指定主机上的目录,则需要使用绝对路径。4.2)CONTAINER-DIR表示容器中要挂载的目录或文件,即容器中的一个目录或文件5.3)OPTIONS表示配置,例如设置为只读权限(ro),这个卷只能被这个容器(Z)使用,或者可以被多个容器(z)使用。多个配置项以逗号分隔。6.7.--mount:8。由多个以逗号分隔的键值对组成。例如:type=volume,source=volume2,destination=/volume2,ro=true9。1)type,指定类型,可以指定为bind、volume、tmpfs。10.2)source,type为volume时,指定volume名称,匿名volumes省略该字段。类型为绑定时,指定路径。可以使用缩写src。11.3)destination,挂载到容器的路径。可以使用缩写dst或target。12.4)ro是一个配置项,多个配置项直接用逗号分隔,一般使用true或false。下面我们使用-v命令来挂载卷。具体操作如下:1.#创建容器test10,并通过-v挂载volume1,将volume1挂载到容器file1目录下2.dockercontainerrun-it--nametest10--hostnametest10\3.-vvolume1:/file1centos/bin/bash我们可以通过以下命令查看容器test10和volume的映射关系1.#查看容器的详细配置信息2.dockercontainerinspecttest10(4)删除volume下面我们来看删除volume的命令Format1.#Deletevolume2.dockervolumerm[volumename]我们删除刚刚创建的卷volume2。具体操作如下。03绑定挂载(bindmounts)从docker发布开始就支持绑定挂载。与数量相比相对有限。Bindmounts将宿主机上的一个目录绑定到容器上,这样容器就可以对宿主机上的目录进行操作和修改。绑定挂载性能非常好,但它们依赖于具有特定目录结构的主机文件系统。bind挂载的参数与volume相同,可以通过-v或--mount挂载,-v用于个别容器挂载,--mount一般用于docker服务。我们在本地主机上创建目录bind_mount_test,并在该目录下创建一个文件file1,然后将该目录绑定挂载到容器/home/bind_mount_test目录下。具体操作如下:1.#创建容器test1,绑定目录bind_mount_test进入容器的/home/bind_mount_test目录2.dockercontainerrun-it-v\3./root/bind_mount_test:/home/bind_mount_test--nametest1centos/bin/bash如果绑定挂载的宿主目录不存在,会自动创建目录,现在我们在宿主目录bind_mount_test中再新建一个文件file2.txt,输入内容“kandaoma”,看看是否在容器中可以看到,我们在容器test1的bind_mount_test目录下创建文件file3。txt看看能不能在主机上查看。具体操作如下。通过上面的操作我们可以发现,绑定挂载的容器目录其实完全由宿主机的文件系统管理,不像volume是docker自己管理的。所以,目录权限、SELINUX等问题需要我们自己管理。04临时文件系统(tmpfs)卷和绑定挂载主要用于宿主机和容器之间共享文件。数据可以在容器停止后保留。tmpfs挂载是临时的,数据保留在主机内存中。当容器停止后数据将被删除。这种挂载方式的数据不能在两个容器之间共享,并且这种挂载方式只支持Linux系统。tmpfs挂载也有两个命令参数,一个是-tmps,一个是-mount,类似volume和bind挂载,--tmpfs用于单容器挂载--mount用于docker服务挂载。接下来我们通过--tmpfs将容器app目录挂载到内存中,具体操作如下:1.#创建容器tmptest,同时通过tmpfs命令将app目录挂载到内存中2.dockercontainerrun-it--nametmptest--tmpfs/appcentos/bin/bash05在上面数据卷容器的章节中,我们学习了容器的几种存储方式。如果我们想在容器之间共享一些实时更新的数据,应该怎么操作呢?其实docker提供的解决方案就是用户数据卷容器。数据卷容器按卷挂载文件目录,其他容器通过挂载该容器实现数据共享。挂载数据卷的容器称为数据卷容器。数据卷容器是一个普通容器,提供数据卷供其他容器挂载使用。现在让我们看看如何通过数据卷容器共享数据。具体操作如下:1)创建数据卷test_volume,并创建数据卷容器(其实是普通容器),将创建的卷挂载到数据卷容器中。1)创建数据卷test_volume,并创建数据卷容器(其实是普通容器),将创建的卷挂载到数据卷容器中1.#创建卷test_volume2.dockervolumecreatetest_volume3.4.#创建数据卷容器data_container,同时将test_volume挂载到容器的share_dir目录下5.dockercontainerrun-it-vtest_volume:/share_dir\6.--namedata_container--hostnamedata_containercentos/bin/bash2)创建两个普通容器test100和test200同时继承数据卷容器挂载数据卷1.#Createcontainertest100,--volumes-from命令用于继承指定数据卷容器2.dockercontainerrun-it--volumes-fromdata_container\3.--nametest100--hostnametest100centos/bin/bash4.5.#Createcontainertest200,--volumes-from命令用于继承指定数据卷容器6.dockercontainerrun-it--volumes-fromdata_container\7.--nametest200--hostnametest200centos/bin/bash3)我们在容器test100和test200中分别对文件file1.txt进行操作,最后我们在数据卷容器中查看file1.txt文件是否正在实时更新。通过以上操作我们可以发现,不同容器之间的数据共享需求可以通过数据卷容器来实现。06容器数据备份与恢复(一)数据备份如果我们想备份刚才数据卷容器的数据卷中的数据,我们可以创建一个备份容器,它继承了数据卷的数据卷,这样实现数据备份。其实就是创建一个备份容器,通过挂载绑定将宿主机文件目录挂载到备份容器,然后将继承的数据卷目录备份到备份容器中绑定挂载映射的目录,从而实现数据备份.具体操作如下:1.#创建备份容器,然后容器不仅继承数据卷容器的数据卷,还通过挂载绑定的方式挂载宿主机系统备份目录2.#映射数据卷通过在容器中执行tar命令将目录share_dir备份到挂载binding映射的目录backup和backup类似,我们新建一个容器,通过mountbinding的方式将宿主系统上的备份目录挂载到新的容器中,然后执行容器中tar包的解压命令,恢复数据。具体操作如下:
