docker volume

吴书松
吴书松
发布于 2026-05-23 / 13 阅读
0

docker volume

Docker Volume(数据卷)是 Docker 中用于持久化存储数据的机制,解决容器重启或删除后数据丢失的问题。


为什么需要 Volume?

容器本身是无状态的,数据默认存储在容器内部的可写层:

  • 容器删除 → 数据丢失

  • 容器重建 → 数据清空

  • 多容器共享数据 → 无法实现

Volume 将数据存储到宿主机指定位置,独立于容器生命周期。


三种挂载方式对比

方式

语法

适用场景

特点

Volume

-v 卷名:/容器路径

数据库、缓存等持久化数据

Docker 管理,性能最好,可跨容器共享

Bind Mount

-v /宿主机路径:/容器路径

开发环境代码热更新

直接映射宿主机目录,灵活但依赖宿主机结构

tmpfs Mount

--tmpfs /容器路径

敏感数据、临时文件

存储在内存,容器停止数据消失


常用命令

管理 Volume

docker volume create my-data          # 创建命名卷
docker volume ls                      # 列出所有卷
docker volume inspect my-data         # 查看卷详情(挂载点、大小等)
docker volume rm my-data              # 删除卷
docker volume prune                   # 删除所有未使用的卷

使用 Volume 运行容器

# 方式1:匿名卷(自动创建)
docker run -d -v /data nginx

# 方式2:命名卷(推荐,可复用)
docker run -d -v redis-data:/data redis

# 方式3:Bind Mount(开发常用)
docker run -d -v /home/user/code:/app nginx

实际示例

1. Redis 数据持久化

docker run -d \
  --name redis \
  -v redis-data:/data \
  redis:7.2 redis-server --appendonly yes
  • redis-data 卷保存 AOF 持久化文件

  • 容器删除后,新容器挂载同一卷可恢复数据

2. MySQL 数据库

docker run -d \
  --name mysql \
  -v mysql-data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  mysql:8.0

Docker Compose 中的 Volume

命名卷(推荐生产环境)

version: '3.8'

services:
  redis:
    image: redis:7.2
    volumes:
      - redis-data:/data

volumes:
  redis-data:        # 声明命名卷,Docker 自动管理

Bind Mount(推荐开发环境)

version: '3.8'

services:
  web:
    image: nginx
    volumes:
      - ./html:/usr/share/nginx/html   # 宿主机当前目录的 html 映射到容器
      - /var/log/nginx:/var/log/nginx  # 日志映射到宿主机

Volume vs Bind Mount 选择

场景

推荐方式

数据库持久化

Volume

配置文件注入

Bind Mount

代码开发热更新

Bind Mount

跨容器共享数据

Volume

临时/敏感数据

tmpfs


查看 Volume 存储位置

docker volume inspect redis-data
# 输出中的 "Mountpoint" 就是宿主机实际路径
# 通常是 /var/lib/docker/volumes/redis-data/_data

核心要点总结

要点

说明

数据持久化

Volume 独立于容器生命周期

性能

Volume 比 Bind Mount 性能更好(Docker 原生管理)

备份迁移

可直接打包 /var/lib/docker/volumes/ 下的数据

共享

多个容器可挂载同一个 Volume