官方文档:https://docs.docker.com/storage/
默认情况下,在容器内创建的所有文件都存储在可写容器层中。意味着:
1.当容器不存在时,数据不会持久存在,并且如果另一个进程需要,则可能很难从容器中获取数据
2.容器的可写层紧密耦合到运行容器的主机。无法将数据移动到其他位置
3.写入容器的可写层需要存储驱动程序来管理文件系统。存储驱动程序使用linux内核提供联合文件系统,会降低性能。
卷volume
是docker管理的主机文件系统的一部分。/var/lib/docker/volumes。是docker中保留数据的最佳方式。非docker进程不应该修改文件系统的这部分。
由docker创建和管理。
//显示创建卷
docker volume create
或者docker可以在容器或服务创建期间创建卷。
创建卷时,它存储在docker主机上的目录中,将卷装入容器时,此目录是装入容器的目录。
给定的体积可以同时安装到多个容器中,当没有正在运行的容器正在使用卷时,该卷仍gongdocker使用,并且不会自动删除,可以手动删除:
// 手动删除卷
docker volume prune
装入卷时,可能会命名或匿名,匿名卷在首次装入容器时未给出明确的名称,docker提供了一个随机名称,该名称在给定的docker主机中保证是唯一的。
卷还支持卷驱动程序,这些驱动程序允许将数据存储在远程主机或云提供的程序上。
适用场景
1.在运行多个容器之间共享数据。如果未显示创建,则会在第一次将其装入容器时创建卷。当该容器停止或移除时,该卷仍然存在,多个容器可以同时安装相同的卷,可以是读写也可以是只读。仅在明确删除卷的时候才会删除。
2.当docker主机不能保证就有给定的目录或文件时,卷可以将docker主机的配置与容器运行时分离
3.当想要把数据存储在远程主机或云上而不是本地存储的时候使用卷
4.当需要将数据从一个docker主机备份,还原或者迁移到另一个docker主机时。可以用卷停止容器,然后备份卷的目录。
优点
与绑定挂载相比,更易于备份或迁移。
可以使用docker cli或docker api管理
适用于Linux和windows
可以在多个容器之间共享卷
创建和管理
// 创建卷
docker volume create my-vol
// 卷清单
docker volume ls
// 检查卷
docker volume inspect my-vol
// 删除卷
docker volume rm my-vol
启动有卷的容器
如果启动具有尚不存在的卷的容器,docker会创建卷。
-mount方式启动卷
// 将卷my-vol装入/app/容器中
docker run -d --name devtest --mount source=my-vol,target=/app nginx:latest
-v方式启动
docker run -d --name devtest -v my-vol:/app nginx:latest
停止容器并删除卷
docker container stop devtest
docker container rm devtest
docker volume rm my-vol
使用卷启动服务
启动服务并定义卷时,每个服务容器都是以自己的本地卷。如果使用local卷驱动程序,则所有容器都不能共享此数据。但某些卷驱动程序支持共享存储。
// 启动nginx具有四个副本的服务,每个副本使用一个名为本地卷myvol.
docker servicecreate -d --replicas=4 --name devtest-service --mount source=myvol,target=/app nginx:latest
验证服务正在允许
docker service ps devtest-service
删除服务,并停止其所有任务(删除服务不会删除该服务创建的任何卷)
docker service rm devtest-service
创建卷服务
// 不支持-v或--volume标志。将卷安装到服务的容器中时,必须使用--mount标志
docker service create
使用容器填充卷
如果启动一个创建新卷的容器,并且容器在要挂载的目录中具有文件或目录(如/app/),则将目录的内容复制到卷中。然后容器安装并使用该卷, 而使用该卷的容器也可以访问预先填充的内容。
// 启动一个nginx容器,并nginx-vol使用容器/usr/share/nginx/html目录的内容填充新卷
// --mount模式
docker rn -d --name=nginxtest --mount source=nginx-vol,destination=/usr/share/nginx/html nginx:latest
// -v模式
docker run -d --name=nginxtest -v nginx-vol:/usr/share/nginx/html nginx:latest
使用只读卷
多个容器可以安装相同的卷,并且可以为其中一些容器以读写方式或者只读方式挂载。
--mount模式
docker rn -d --name=nginxtest --mount source=nginx-vol,destination=/usr/share/nginx/html,readonly nginx:latest
-v模式
docker rn -d --name=nginxtest -v nginx-vol"/usr/share/nginx/html:ro nginx:latest
在机器之间共享数据
在构建容错程序时,可能需要配置同一服务的多个副本才能访问相同的文件
https://docs.docker.com/storage/volumes/
备份、还原或迁移数据卷
备份容器
// 启动新容器,并从dbstore容器装入卷。将本地主机目录挂载为/backup,将dbdata卷内容的命令传递给目录中的backup.tar文件/backup
docker run --rm --volumes dbstore -v $(pwd):/backup ubuntu tar cvs /backup/backup.tar /dbdata
从备份还原容器
建立dbstore2的新容器
docker rn -v /dbdata --name dbstore2 ubuntu /bin/bash
解压缩新容器的数据卷中的备份文件
docker rn -rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"
删除所有卷
docker volume prune
绑定挂载
可以存储在主机系统的任何位置,甚至可以说重要的文件系统或目录。docker主机或docker容器上的非docker进程可以随时修改他们。
适用场景
1.将配置文件从主机共享到容器。是docker默认通过/etc/resolv.conf从主机安装到每个容器中来为容器提供dns解析的方式。
2.在docker主机时的开发环境金额容器之间共享源代码或构建工作。如,可以将maven target/目录挂载到容器中,每次在docker主机上构建maven项目时,容器都可以访问重建的工作。
3.当docker主机的文件或目录结构保证与容器所需的绑定安装一致时。
注意
如果将空卷装入容器中存在文件或目录的目录中,则会将这些文件或目录复制到卷中。如果启动容器并指定尚不存在的卷,则会创建一个空卷。(预先填充)
如果将绑定装载或非空卷装入已存在文件或目录的容器,这些文件或目录会被装载覆盖。这些文件或目录不会被移除或更改,但在装入绑定装入或卷时无法访问。
tmpfs挂载
仅存储在主机系统的内存中,永远不会写入主机系统的文件系统,不会保留在磁盘上。可以在容器的生命周期中由容器使用来存储非持久状态或敏感信息。