| 类型 | 说明 | 存储位置 | 生命周期 | 使用场景 |
|---|---|---|---|---|
| 1. 命名卷 | Docker 推荐的最佳实践。由 Docker 完全管理,卷有唯一的名称。 | Docker 管理的区域(通常是 /var/lib/docker/volumes/) | 独立于容器,需手动删除 (docker volume rm) | 持久化应用数据(如数据库文件)、容器间共享数据 |
| 2. 绑定挂载 | 将宿主机上的任意文件或目录挂载到容器。 | 宿主机上的任意指定路径 | 依赖宿主机上的文件路径 | 开发环境(挂载源代码)、**挂载宿主机特定配置文件(如 /etc/localtime) |
| 3. 匿名卷 | 类似命名卷,但创建时不被命名,只能由 Docker 自动生成 ID。 | Docker 管理的区域 | 随容器删除而失效(除非使用 --rm时用 -v保留) | 通常由 Dockerfile 中的 VOLUME指令创建,用于保护重要目录(如容器的 /var/lib/mysql)不被覆盖 |
# 1. 创建一个命名卷
docker volume create my-app-data
# 2. 查看所有卷
docker volume ls
# 3. 查看卷的详细信息(包括其在宿主机上的具体路径)
docker volume inspect my-app-data
# 4. 启动容器并挂载卷
# -v 或 --mount 标志都可以,推荐使用更明确的 --mount
docker run -d --name mysql-db \
--mount source=my-app-data,target=/var/lib/mysql \
mysql:latest
# 使用 -v 的等效写法(旧式,但更简洁)
# docker run -d --name mysql-db -v my-app-data:/var/lib/mysql mysql:latest
# 5. 删除一个未使用的卷
docker volume rm my-app-data
# 6. 删除所有未使用的卷(清理空间)
docker volume prune# 将宿主机的当前目录挂载到容器的 /app 目录
# 非常适合开发环境,代码修改在宿主机进行,容器内立即生效
docker run -d --name my-dev-app \
--mount type=bind,source="$(pwd)",target=/app \
my-app-image:latest
# 使用 -v 的等效写法
# docker run -d --name my-dev-app -v $(pwd):/app my-app-image:latest
# 挂载单个配置文件(如时区文件)
docker run -d --name some-container \
-v /etc/localtime:/etc/localtime:ro \ # :ro 表示只读挂载,防止容器修改宿主机文件
my-app-image:latestVOLUME指令,可以声明容器运行时应该被挂载的路径。这通常是为了保护数据,即使运行时不显式挂载卷,Docker也会为其创建一个匿名卷。FROM mysql:latest
...
# 声明一个挂载点,保护数据库数据
VOLUME /var/lib/mysql
...-v与 --mount标志的区别
| 特性 | -v/ --volume | --mount(推荐用于新项目) |
|---|---|---|
| 语法 | 简练,用冒号分隔:<source>:<target>:<options> | 冗长,键值对:key=value,key=value |
| 可读性 | 较差,选项挤在一起 | 更好,结构清晰 |
| 功能 | 早期功能,覆盖大部分场景 | 功能更全面,支持更高级的选项(如挂载集群存储卷 type=volume,volume-driver=...) |
| 示例 | -v myvol:/app:ro | --mount type=volume,source=myvol,target=/app,readonly |
-v很便捷。但对于生产环境或复杂配置,建议使用更明确、功能更强的 --mount。docker cp或专门备份工具)。
ro(readonly) 选项以增强安全性。
暂无评论
亲~登录后才可以操作哦!
确定你的邮箱还未认证,请认证邮箱或绑定手机后进行当前操作
举报
×
侵犯我的权益
×
侵犯了我企业的权益
×
抄袭了我的内容
×
原文链接或出处
诽谤我
×
对根叔社区有害的内容
×
不规范转载
×
举报说明
暂无评论