docker卷映射和目录挂载
本文介绍了卷的本质(一个宿主机上的目录),并介绍了实现数据持久化的两种方式(卷映射和目录挂载)的定义,语法,以及他们的区别;以及使用的总结,并举了一些例子来体验他们的好处。
引言:
在Docker中,如果数据不挂载就得到容器内去修改操作数据,是比较麻烦的,而且数据会随着容器的删除而丢失。而挂载(卷映射和目标挂载)便可实现 在宿主机上直接修改 数据,且实现数据的持久化.但它们的实现机制、使用场景和特性有明显区别。
下面的文章我会带你们介绍它们。
2、Nginx 容器中有两个典型挂载点:
-
/usr/share/nginx/html—— 网页根目录 -
/etc/nginx—— 配置文件目录
卷
Docker 容器的文件系统是临时的、隔离的,容器停止 / 删除后,内部的所有数据都会丢失 这就是容器的数据易失性问题。 而Docker 卷(Volume) 是 Docker 引擎专门创建和管理的宿主机目录。
卷的创建:
-v 卷名:容器内路径
自定义名称(如 mq-plugins)
docker run -d -v nginx-log:/var/log/nginx --name nginx-vol nginx
nginx-log是卷名;不指定doker会自动创建,代表宿主机的一个目录
/var/log/nginx代表容器内的目录;
接下来再看卷相关的几个命令:
1、查看所有卷(确认卷是否存在)
docker volume ls
2、 查看卷的详细信息(查实际存储路径、驱动等)
# 格式:docker volume inspect 卷名
docker volume inspect mq-plugins
3、删除指定卷
# 格式:docker volume rm 卷名
docker volume rm mq-plugins
请看这里的卷的详细信息:
inspect mq-plugins
[
{
"CreatedAt": "2026-02-06T11:25:26+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/mq-plugins/_data",
"Name": "mq-plugins",
"Options": null,
"Scope": "local"
}
]
卷就代表了这里的/var/lib/docker/volumes/mq-plugins/_data宿主机目录 。
卷映射和目录挂载
下面我来介绍卷映射和目录挂载。
1、这两种方式是Docker 实现容器数据持久化的核心方式。
目的是将「主机的文件 / 目录」和「容器内的文件 / 目录」做关联,容器对挂载目录的读写,会直接同步到主机,从而实现数据持久化(容器删除后,数据还在主机上)和主机 - 容器数据互通。
2、核心差异在于数据存储的管理主体、适用场景不同 : 1)Volume 是 Docker官方推荐的方式,由 Docker 统一管理 2)Bind Mount 是用户手动指定主机目录,由用户自己管理。
卷映射
卷是由 Docker 管理的独立存储单元,不依赖宿主机的具体路径,更便于迁移与备份。
1)管理主体:由Docker 引擎统一创建和管理,数据存储在 Docker 的专属数据目录中(默认路径:/var/lib/docker/volumes/,无需用户手动创建目录)。 2)核心特点:Docker 会自动维护卷的生命周期
语法
docker run -d -p <主机端口>:<容器端口> \
--name <容器名> \
-v <卷名>:<容器路径> \
<镜像名>
举例:
docker run -d -p 8080:80 \
--name my-nginx \
-v webdata:/usr/share/nginx/html \
nginx
目录挂载
管理主体:由用户手动指定主机上的任意绝对路径目录 / 文件,Docker 不参与目录的管理(需用户自己创建、维护主机目录)。 核心特点:灵活性极高(可挂载主机任意位置),但隔离性差(主机目录可能被其他程序修改),Docker 不会自动维护该目录,适合开发调试场景。
语法:
docker run -d -p 8080:80 --name my-nginx -v ~/nginx-web:/usr/share/nginx/html nginx
-v <宿主机路径>:<容器路径> ~/nginx-web → 宿主机上的目录 /usr/share/nginx/html → 容器内 Nginx 的网页根目录
这表示把你电脑上的 ~/nginx-web 目录映射(mount)到容器的 /usr/share/nginx/html 目录中。
讨论
1、如果数据不挂载就得到容器内去修改操作数据,是比较麻烦的,而且数据会随着容器的删除而丢失。而挂载(卷映射和目标挂载)便可实现 在宿主机上直接修改 数据,且实现数据的持久化。
2、卷映射和目标挂载都是为了关联宿主机目录和容器内目录;
卷映射的语法是:-v <卷名>:<容器路径>
目录挂载的语法是:-v <宿主机路径>:<容器路径>
实际上是非常相似的;区别只是:目标挂载的宿主机位置是显式表示出来的。而卷映射
一个用卷名来代替;其具体在宿主机的位置规则为:
Docker 本地卷的默认根目录是: /var/lib/docker/volumes/ 卷实际路径 = 默认根目录 + 卷名 + /_data
3、使用总结
-
开发调试时,用目录挂载更方便(实时同步代码)。
-
生产环境或需要持久化、跨容器共享数据时,优先用卷映射(更安全、可移植)。两者的核心目标都是实现数据持久化,但卷映射是 Docker 推荐的更规范的方式。
例子
持久化保存内容
创建一个容器web1,进行卷映射, 卷保存了web·的一些内容,
删除容器docker rm -f web01
再创建一个新容器web02并使用同一个卷
内容依然存在!这说明网页数据被卷 webdata 持久化保存了。
2、多个容器共享同一个卷
docker run -d --name web01 -v shared:/usr/share/nginx/html nginx
docker run -d --name web02 -v shared:/usr/share/nginx/html nginx
两个容器 web01 和 web02 共享同一块卷 shared,
当一个容器修改网页内容,另一个容器立刻能看到。
这在微服务架构中非常常见,比如多个应用容器共享日志卷、数据库卷等。
总结:本文介绍了卷的本质(一个宿主机上的目录),并介绍了实现数据持久化的两种方式(卷映射和目录挂载)的定义,语法,以及他们的区别;以及使用的总结,并举了一些例子来体验他们的好处。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)