容器中的数据存储到容器层。但是在容器层存储数据存在以下问题:数据不持久化。这意味着如果删除容器,数据将消失。主机上的其他进程访问数据不方便。这些数据的I/O将通过存储驱动程序,然后到达主机。引入了一个间接层,所以性能会有所降低。以下Docker提供了3种持久化数据的方式:卷:存储在主机文件系统的某个区域,由Docker管理(/var/lib/docker/volumes/onlinux)。非Docker进程不应修改此数据。卷是在Docker绑定挂载中持久保存数据的最佳方式:存储在主机文件系统中的任何位置。非Docker进程可以修改这些数据tmpfs挂载(在Linux中):存储在内存中(注意它不会持久化到磁盘)。容器可以使用它在容器的生命周期内存储非持久状态或敏感信息。卷如果未明确创建,则在最初安装时创建卷。当容器停止时,卷仍然存在。多个容器可以通过读写或只读方式使用同一个卷。只有在明确删除时才会删除卷。如果一个空卷挂载到容器中包含文件或目录的目录,这些文件或目录将被复制到空卷;如果非空卷挂载到容器目录中包含文件或目录的目录,这些文件或目录将被隐藏。使用创建:dockervolumecreate删除卷:dockervolumermvolumename删除所有未使用的卷:dockervolumeprune列出所有卷:dockervolumels查看卷信息:dockervolumeinspectvolumename挂载到容器:-v或-体积。如果是Docker17.06或更高版本:推荐--mount。(同bindmount)挂载类型:key为type,value为bind,volume或tmpfs挂载源:key为source或src,对于namedvolume,value为volumename,对于anonymousvolume,忽略容器中的挂载point:key为destination,dst或target,value为容器读写中的路径type:value为readonly,key没有volume-opt选项,可以多次出现。例如,volume-driver=local,volume-opt=type=nfs,...第一个域:对于命名卷,是卷名;对于匿名卷,忽略它,此时会创建一个匿名卷。第二个域:挂在容器中第三个域加载点:可选参数,以','分隔,如ro-v或--volume:由3个域组成,以':'分隔--mount:keyvaluesseparatedbymultiple','pair=composition:使用dockerservicecreate启动Docker服务时,只支持--mount,不支持-v和--volume。并且每个服务容器都使用自己的本地卷,所以如果使用本地(本地)卷驱动,容器无法通过卷共享数据,但有些卷驱动支持共享存储。适用于AWS的Docker和适用于Azure的Docker使用Cloundstor插件来支持持久存储方案,在这种方案中,当无法保证Docker主机具有给定的目录或文件时,数据在多个运行的容器之间共享。卷可以将容器运行时与Docker主机的配置分离。将数据从一台Docker主机备份、恢复或迁移到另一台时,绑定挂载主机中由其完整路径引用的文件或目录。这些目录或文件不必已经存在即可使用绑定安装。如果使用此方法将目录挂载到容器中有文件或目录的目录,这些文件或目录将被隐藏;如果宿主机中的文件或目录不存在,使用--mount挂载时,Docker会报错。使用-v或--volume时,将在主机上创建一个目录并用于挂载到容器:-v或--volume。如果是Docker17.06以上:推荐使用--mount。(与卷相同)-v或--volume:由3个字段组成,':'分隔第一个字段:对于命名卷,它是卷名称;对于匿名卷,忽略,此时会创建匿名卷的第二个字段:容器中的挂载点第三个字段:可选参数,以','分隔,如ro--mount:由','分隔的多个键值对组成=:挂载类型:key为type,value为bind、volume或tmpfs挂载源:key为source或src,value为文件路径或宿主机中的目录容器中的挂载点:key为destination、dst或target,value容器中路径的读写类型:value为readonly,无keybind-propagationoption:key为bind-propagation,value为rprivate、private、rshared、shared、rslave或slave一致性选项:值是一致的、委托的、缓存的。该选项只适用于DockerforMac--mount不支持z和Z(这一点不同于-v和--volume)的场景一般情况下,只要有可能,最好使用volumes主机和容器共享配置文件(Docker默认通过这种方式为容器提供DNS解析,通过挂载/etc/resolv.conf到容器中)共享源码或者构建工件(比如将Maven的target/目录挂载到容器中,每次在Docker主机中构建时Maven项目,容器可以访问那些重建的工件)当docker主机中的文件或目录结构与容器所需的一致时,绑定传播默认为绑定挂载和卷的rprivate。只能在使用bindmount时配置,而且必须在linux下。绑定传播是一个高级话题,对于大多数用户来说,不需要配置挂载点/mnt,假设它也挂载到/tmp。绑定传播控制/tmp/a上的挂载是否也可用于/mnt/a在设置绑定传播之前,主机文件系统需要支持绑定传播以下示例将主机中的目标/挂载到容器两次:dockerrun-d-it--namedevtest--mounttype=bind,source="$(pwd)"/target,target=/app--mounttype=bind,source="$(pwd)"/target,target=/app2,只读,bind-propagation=rslavenginx:latest如果此时创建/app/foo/,/app2/foo也会有selinux标签。可以添加z或Z选项来修改容器标签挂载的宿主文件或目录的selinux:z选项表示绑定挂载的内容在多个容器之间共享。Z选项表示绑定挂载的内容是私有的,不共享的。请特别小心地使用这两个选项。“使用Zoption绑定挂载系统目录,例如/homeor/usr会使您的主机无法操作,您可能需要手动重新标记主机文件”tmpfs挂载仅在linux中受支持与卷和绑定挂载相比,tmpfs挂载是临时的,只持久存在于主机内存中。当容器停止时,tmpfs挂载将被删除。对敏感文件的临时存储很有用与卷和绑定挂载不同,多个容器不能共享tmpfsmount挂载到容器使用:--tmpfs。如果是Docker17.06以上:建议使用--mount挂载类型:key为type,value为bind,volume或tmpfs容器中的挂载点:key为destination,dst或target,value为tmpfs的路径容器中的-size和tmpfs-mode选项--tmpfs:直接指定容器中的挂载点。不允许指定任何配置选项--mount:consistsofmultiple','separatedkey-valuepairs=:Scenario最好的使用场景是当你不想将数据存储在主机上或容器中时。这可能是出于安全原因,或者是为了在应用程序需要写入大量非持久状态数据时保护容器性能。卷驱动程序在机器之间共享数据。在构建容错应用程序时,可能需要为同一服务配置多个副本。最初访问同一个文件:有多种方法可以实现:向应用程序添加逻辑以将文件存储在云对象存储系统(如AmazonS3)中使用支持将文件写入外部存储系统(如NFS或AmazonS3)驱动程序来创建卷卷驱动程序可以从应用程序逻辑中抽象出底层存储系统。例如,如果您的服务使用带有NFS驱动程序的卷,您可以更新您的服务以使用不同的驱动程序,作为在云中存储数据的示例,而无需更改使用dockervolumecreate或驱动程序容器创建时使用的应用程序逻辑对于匿名卷,您可以指定卷驱动程序。下面的例子使用vieux/sshfs作为卷驱动,假设有2个节点,第一个节点是Docker主机,可以SSH到第二个节点1.在Docker主机中,安装vieux/sshfs插件dockerplugininstall--grant-all-permissionsvieux/sshfs2,使用卷驱动创建卷1)创建命名卷dockervolumecreate--drivervieux/sshfs-osshcmd=test@node2:/home/test-opassword=testpasswordsshvolume2)使用卷驱动来启动容器时创建匿名卷-opt=password=testpasswordnginx:latest3,backup,restore,Migratedatavolumes1)备份一个容器dockerrun--rm--volumes-fromdbstore-v$(pwd):/backupubuntutarcvf/backup/backup.tar/dbdata启动一个新建容器,在dbstore容器中挂载一个volume挂载一个本地主机目录到container/backup使用tar打包dbd中的数据atavolumeintobackup.tar2)使用备份恢复容器使用刚刚创建的备份恢复容器:dockerrun-v/dbdata--namedbstore2ubuntu/bin/bash然后,在新的Usetartounpackthebackupdatain创建容器的卷:dockerrun--rm--volumes-fromdbstore2-v$(pwd):/backupubuntubash-c"cd/dbdata&&tarxvf/backup/backup.tar--strip1"