docker容器数据持久化——volume 详解
阅读本文前,希望你已经对docker容器数据持久化相关问题及解决方案,有初步的了解,具体可以参考以下文章:
了解其他几种容器数据存储方案具体可以参考以下文章:
默认容器的数据的读写发生在容器的存储层,当容器被删除时其上的数据将会丢失。所以我们应该尽量保证容器存储层不发生写操作,为了实现数据的持久化存储我们需要选择一种方案来保存数据,当前有以下几种方式:
- Volumes
- Bind mounts
- tmpfs mounts
无论你选择哪种mount类型,从container内部看没有区别,它们都是目录或者文件。数据都是寄存在宿主机上,只不过具体位置有所区别,如下图:

volume:volume由docker管理,比如创建、删除什么的。默认情况下,volume的存储空间来自于宿主机文件系统中的某个目录,如/var/lib/docker/volumes/,docker系统这外的程序不应该修改其中的数据。volume是官方推荐的持久化方案。
命令解析 -v(--volume)
使用数据卷的步骤一般分为两步:
- 创建一个数据卷
- 使用
-v或--mount参数将数据卷挂载容器指定目录中,这样所有该容器针对该指定目录的写操作都会保存在宿主机上的Volume中。
1、镜像run的使用 加上参数配置
2、 commit提交副本镜像,重新启动新镜像加上参数配置(针对容器已经有数据的情况下)
创建和管理卷
与绑定安装不同,您可以在任何容器范围之外创建和管理卷。
docker volume create my-vol #创建数据卷
docker volume ls #查看有哪些卷
docker volume inspect my-vol #查看卷详情
docker rm -f web #强制删除运行中的容器
docker volume rm my-vol #删除卷
docker volume prune #清理无用的卷
docker ps -s #可以查看容器的大小是没有增加的创建一个卷(Volume):
$ docker volume create my-vol
查看Volumes:
$ docker volume ls
local my-vol
$ docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
我们可以看到创建的Volume my-vol保存在目录 /var/lib/docker/volumes/ 下,以后所有针对该Volume的写数据都会保存中目录/var/lib/docker/volumes/my-vol/_data下。
删除一个Volume:
$ docker volume rm my-vol
或者删除所有未使用的Volumes:
docker volume prune
挂载数据卷(volume)到容器目录
如果您使用尚不存在的卷启动容器,则Docker将为您创建该卷。
-v或--volume
由三个字段组成,以冒号(:)分隔。这些字段必须以正确的顺序排列,并且每个字段的含义不是立即显而易见的。
$ docker run -d -v nginx-vol:/usr/share/nginx/html,readonly nginx:latest- 第一个字段是卷的名称,在给定的主机上是唯一的。对于匿名卷,将省略第一个字段。
- 第二个字段是文件或目录在容器中的安装路径。
- 第三个字段是可选的,如:只读数据卷,readonly 。具体参考官方文档。
查看容器是否挂载存储呢?
docker inspect eb5e31fef691使用docker inspect 容器id 验证创建卷并安装正确。查找 Mounts 部分
"Mounts": [
{
"Type": "volume",
"Name": "nginx-vol",
"Source": "/var/lib/docker/volumes/nginx-vol/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],Volume使用场景
请参考这篇文章:Docker容器数据持久化问题及解决方案
如果有兴趣了解更多详细资料,具体请查看官方文档:https://docs.docker.com/storage/volumes/