为了能够保存(持久化)数据以及共享容器间的数据,Docker
提出了Volume
的概念。简单来说,Volume
就是目录或者文件,它可以绕过
默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。
1.Docker管理数据的方式有两种:
数据卷方式:
数据卷是一个特殊的文件或者目录,它将宿主机文件或者目录直接映射进容器中,可供一个或多个容器使用。容器数据卷设计的目的就是为了 数据的持久化,它完全独立与容器的生命周期。因此,容器删除时,不会删除其挂载的数据卷,也不会存在类似的垃圾机制对容器存在的数据卷进行处理。通过docker run -v
命令可以将数据卷挂载到对应的容器目录空间,进行文件读取,容器卷特性如下:
数据卷容器方式:
命名的容器已挂载数据卷
,其他的容器通过挂载这个容器(父容器)实现数据共享,挂载数据卷的容器,称为数据卷容器
。通过数据卷容器可以实现容器间的数据共享。
例如:已经存在一个挂载了数据卷的容器,如果存在其他容器通过docker run --volumes-from [容器别名]
命令挂载到该容器上,则该容器可以被称之为数据卷容器,其主要功能是提供数据卷供其他容器挂载。
当数据卷容器宕机后,并不会造成数据卷的回收卸载,数据卷会继续挂载在其他容器中。当全部挂载该数据卷的容器全部宕机后,该数据卷才会卸载。
2.数据卷方式
数据卷方式,又分为volumes,bind mounts,tmpfs三种方式
2.1 volumes方式(最常用的)
Vlumes:Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;(最常用的方式).a和b方式vloume卷后不能跟目录只能是卷名
a. 匿名目录挂载
匿名目录挂载就是隐式创建 Docker vloume卷(自动生成的很长串的vloume名), 匿名目录挂载只需要写容器内目录或者文件即可,而宿主机对应的目录会自动在/var/lib/docker/volumes
路径下生成。
//以后台方式运行容器,并使用-v 匿名挂载容器数据卷 (推荐)
docker run -d -v 容器内目录[:rw/ro] -p 主机端口:容器端口 --name=容器名称 镜像ID/镜像名称[:版本号]
//注意:如果出现Docker挂载宿主机目录显示cannot open directory .:Permission denied
解决办法:在挂载目录后面 多加一个--privileged=true参数即可
docker run --name=docker_postgres -p 15432:5432 -v /var/lib/postgresql/data -e POSTGRES_PASSWORD=root -d docker_postgres
由于没有在创建时指定卷,所以Docker帮我们默认创建匿名卷。使用docker volume ls和 docker inspect docker_postgres 分别查看卷信息和容器信息。 这种方式删除容器会把默认卷也删除了,所以并不能持久化。
b.具名目录挂载(推荐使用)
具名目录挂载就是显式创建 Docker 卷,具名目录挂载相对于匿名目录挂载,就是在宿主机生成对应的目录时可以指定该目录的名称(需要先创建自定义卷),同样目录也会在/var/lib/docker/volumes
路径下生成。
# docker volume create pgdata // 创建一个自定义容器卷
# docker volume ls // 查看所有容器卷
# docker volume inspect pgdata // 查看指定容器卷详情信息
//以后台方式运行容器,并使用-v 具名挂载容器数据卷 (推荐)
docker run -d -v 目录名称:容器内目录[:rw/ro] -p 主机端口:容器端口 --name=容器名称 镜像ID/镜像名称[:版本号]
//注意:如果出现Docker挂载宿主机目录显示cannot open directory .:Permission denied
解决办法:在挂载目录后面 多加一个--privileged=true参数即可
docker run --name=docker_postgres -p 15432:5432 -v pgdata:/var/lib/postgresql/data -e POSTGRES_PASSWORD=root -d docker_postgres
这种方式删除容器也不会删除卷。
c.dockerFile方式
#基于centos镜像进行构建
FROM centos
#数据卷只能指定容器数据卷,不能指定宿主机数据卷,英文并不能够保证在所有的宿主机上都存在这样的特定目录。
VOLUME ["pgdata/data","/var/lib/postgresql/data"]
#以 /bin/bash方式启动
CMD /bin/bash
2.2 bind mount(挂载宿主机常用)
bind mounts:意为着可以存储在宿主机系统的任意位置;bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。这也是为什么bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。
//以后台方式运行容器,并使用-v 挂载容器数据卷 (推荐)
docker run -d -v 宿主机目录:容器内目录[:rw/ro] -p 主机端口:容器端口 --name=容器名称 镜像ID/镜像名称[:版本号]
//注意:如果出现Docker挂载宿主机目录显示cannot open directory .:Permission denied
解决办法:在挂载目录后面 多加一个--privileged=true参数即可
docker run --name=docker_postgres -p 5432:5432 -v C:/MyTemp/mydocker/postgres/data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=root -d docker_postgres
2.3 tmpfs(一般都不会用)
tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;(一般都不会用的方式)
3. 数据卷容器方式
添加数据卷容器
docker run -it/-d -p 主机端口:容器端口 --name=容器名称 ----volumes-from 数据卷容器ID/数据卷容器名称 生成数据卷容器的镜像ID/镜像名称[:版本号]
参考:
Docker Volume 看这一篇就够了_ghostwritten的博客-CSDN博客_docker volume
你必须知道的Docker数据卷(Volume) - EdisonZhou - 博客园文章来源:https://www.toymoban.com/news/detail-437830.html
Docker Volume原理及使用_自知自省的博客-CSDN博客_docker volume文章来源地址https://www.toymoban.com/news/detail-437830.html
到了这里,关于Docker 持久化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!