docker存储卷详解

一、docker存储卷的作用

  1. 解耦数据与容器生命周期:核心是让数据脱离容器的临时特性,命名卷 / 绑定挂载可持久化保存数据(容器删除 / 重建不丢失),tmpfs 则为临时数据提供内存级存储,容器停止后自动清空。
  2. 提升数据使用灵活性与效率:支持容器间、宿主机与容器间共享数据,命名卷绕过容器层 COW 机制提升读写性能,绑定挂载可直接在宿主机修改容器内文件,适配不同使用场景。
  3. 优化数据管理与安全边界:提供统一的卷管理命令简化数据操作,可通过权限控制(如只读挂载)隔离容器对数据的访问,既避免误操作丢失数据,也防止容器越权读写宿主机文件。

二、Volumes(卷)------ Docker 推荐的挂载方式

1. 概念

Volumes 是 Docker专门创建的用于存储数据的目录 ,存储在 Docker 的宿主机文件系统中(默认路径:/var/lib/docker/volumes/),由 Docker 统一管理,与宿主机的其他文件系统隔离。

2. 核心特点
  • Docker 原生管理:创建、删除、查看都通过 Docker 命令操作,不用关心宿主机的具体路径;
  • 数据安全:容器删除后,卷不会被自动删除,数据保留;
  • 跨容器共享:多个容器可以挂载同一个卷,实现数据共享;
  • 支持命名卷和匿名卷:命名卷有明确名称,匿名卷由 Docker 自动生成随机名称。
3. 用法示例(命令行 + Compose)
(1)命令行操作
复制代码
# 1. 创建命名卷(推荐)
docker volume create my_data_volume

# 2. 查看所有卷
docker volume ls

# 3. 启动容器并挂载卷(将卷挂载到容器内的/usr/share/nginx/html目录)
docker run -d --name nginx-volume -v my_data_volume:/usr/share/nginx/html -p 8080:80 nginx

# 4. 查看卷的详细信息(包括宿主机的实际路径)
docker volume inspect my_data_volume

# 5. 删除卷(容器停止后才能删除,若有容器使用则删除失败)
docker volume rm my_data_volume

# 6. 清理未使用的卷(匿名卷、无容器关联的命名卷)
docker volume prune
(2)Docker Compose 配置
复制代码
version: '3'
services:
  nginx:
    image: nginx
    ports:
      - "8080:80"
    volumes:
      - my_data_volume:/usr/share/nginx/html  # 挂载命名卷
volumes:
  my_data_volume:  # 声明命名卷(Docker会自动创建)
4. 适用场景
  • 大多数持久化场景:比如数据库(MySQL、Redis)的数据存储、Web 服务的静态资源存储;
  • 跨容器数据共享:比如多个微服务容器共享配置文件。

三、Bind Mounts(绑定挂载)------ 宿主机路径直接挂载

1. 概念

Bind Mounts 是将宿主机的任意目录或文件直接挂载到容器内的指定路径,宿主机和容器共享这个路径下的所有数据。

2. 核心特点
  • 直接关联宿主机路径 :你可以指定宿主机的任意路径(比如/home/user/html),灵活性高;
  • 数据双向同步:宿主机修改路径下的文件,容器内立即生效;容器内修改,宿主机也会同步;
  • 容器删除后数据保留:数据存在宿主机的指定路径,与容器生命周期无关;
  • 权限需要注意:如果宿主机路径的权限设置不当,容器内可能无法读写数据。
3. 用法示例(命令行 + Compose)
(1)命令行操作
复制代码
# 1. 宿主机创建目录(比如存放nginx的静态页面)
mkdir -p /home/user/nginx_html

# 2. 启动容器并绑定挂载(宿主机路径:/home/user/nginx_html → 容器路径:/usr/share/nginx/html)
# 注意:宿主机路径必须是绝对路径,不能用相对路径
docker run -d --name nginx-bind -v /home/user/nginx_html:/usr/share/nginx/html -p 8081:80 nginx

# 3. 宿主机创建文件,容器内会同步显示
echo "Hello Bind Mounts" > /home/user/nginx_html/index.html
(2)Docker Compose 配置
复制代码
version: '3'
services:
  nginx:
    image: nginx
    ports:
      - "8081:80"
    volumes:
      - /home/user/nginx_html:/usr/share/nginx/html  # 绑定挂载宿主机路径
4. 适用场景
  • 开发环境:比如将本地代码目录挂载到容器内,修改代码后容器立即生效(热更新);
  • 需要直接访问宿主机文件的场景:比如容器需要读取宿主机的配置文件、日志文件。

四、tmpfs Mounts(临时文件系统挂载)------ 内存中的临时存储

1. 概念

tmpfs Mounts 是将宿主机的内存(部分)挂载到容器内的指定路径,数据只存在于内存中,容器停止或删除后数据立即消失。

2. 核心特点
  • 数据在内存中:读写速度极快,但占用内存资源;
  • 数据非持久化:容器停止、重启或删除,数据全部丢失;
  • 与宿主机内存隔离:每个容器的 tmpfs 是独立的。
3. 用法示例(命令行 + Compose)
(1)命令行操作
复制代码
# 启动容器并挂载tmpfs到容器的/tmp目录(限制大小为100M)
docker run -d --name nginx-tmpfs --tmpfs /tmp:size=100m -p 8082:80 nginx

# 进入容器,在/tmp目录创建文件
docker exec -it nginx-tmpfs bash
echo "Hello tmpfs" > /tmp/test.txt
ls /tmp  # 能看到test.txt

# 停止并删除容器后,/tmp的文件消失
docker stop nginx-tmpfs
docker rm nginx-tmpfs
(2)Docker Compose 配置
复制代码
version: '3'
services:
  nginx:
    image: nginx
    ports:
      - "8082:80"
    tmpfs:
      - /tmp:size=100m  # 挂载tmpfs并限制大小
4. 适用场景
  • 临时数据存储:比如容器运行时的临时缓存、会话数据;
  • 敏感数据存储:比如密码、令牌等,不想写入磁盘,避免数据泄露。

五、三种挂载方式的对比表

特性 Volumes(卷) Bind Mounts(绑定挂载) tmpfs Mounts(临时挂载)
存储位置 Docker 管理的宿主机路径 宿主机任意指定路径 宿主机内存
数据持久化 是(容器删除后数据保留) 是(容器删除后数据保留) 否(容器停止后数据丢失)
管理方式 Docker 命令统一管理 手动管理宿主机路径 Docker 命令临时配置
跨平台兼容性 好(Windows/Linux 一致) 差(路径格式不同)
性能 优秀 优秀(与宿主机磁盘相关) 极快(内存读写)
适用场景 生产环境持久化、跨容器共享 开发环境热更新、宿主机文件访问 临时数据、敏感数据存储

最常用的三种卷:

  1. Bind Mount(绑定挂载,使用最多):

    在绑定挂载的情况下,宿主机的目录会覆盖容器中的指定目录。这就造成了一个"隐藏"的效果:容器内已有的文件会变得不可见,但并不意味着这些文件被删除。

  2. Volume 存储卷:

    使用 Docker 定义的卷(如使用 VOLUME <mountpoint>)不会导致容器中该目录下的文件被 "隐藏"。这些文件仍然可以在容器中访问,只是在启动容器并挂载卷后,这些文件将和卷中的内容共存。只有更新文件会被同步到宿主机存储目录中;

  3. Dockerfile 创建的匿名卷:

    当在 Dockerfile 中创建匿名卷时(如使用 VOLUME 指令),如果容器指定目录下有文件,Docker 会将这些文件复制到新创建的匿名卷中。这是为了使卷里面拥有原本挂载点的所有内容,以防原有数据的丢失。

六、检查匿名卷是否被使用

bash 复制代码
#让所有容器查找这个volume名称(--filter==-f)

docker ps --filter "volume=逻辑卷名称"


#查看网络有没有被使用
docker ps --filter "network=网络名称"

Docker 的三种数据挂载方式分别是:Volumes(卷)Bind Mounts(绑定挂载)tmpfs Mounts(临时文件系统挂载) ,核心目的都是让容器的数据能够持久化 (容器删除后数据不丢失)或共享(多个容器共用数据)。

相关推荐
幺零九零零2 小时前
Docker底层-Cgroup
运维·docker·容器
卜锦元2 小时前
Golang后端性能优化手册(第四章:异步处理与消息队列)
开发语言·后端·docker·容器·性能优化·golang·团队开发
汪碧康2 小时前
【k8s-1.34.2安装部署】二.kubernets软件、证书、配置、脚本等文件准备
云原生·容器·kubernetes·xkube·k8s管理平台·k8s安装部署·k8s dashboard
赋创小助手2 小时前
超微SYS-821GE-TNHR深度测评:8卡 NVIDIA H200 风冷 AI 服务器
运维·服务器·人工智能·深度学习·计算机视觉·语言模型·自然语言处理
ldj20202 小时前
docker-compose对比k8s
云原生·容器·kubernetes
被生活耽误的旅行者2 小时前
由于没有远程桌面授权服务器可以提供许可证,远程会话连接已断开
运维·服务器
一介书生 `2 小时前
轻量级服务器监 Beszel
运维·服务器
随祥2 小时前
windows下搭建MQTT测试环境(服务器/客户端)
运维·服务器
北龙云海2 小时前
全栈护航科研信息化:北龙云海驻场运维服务——为前沿探索提供稳定、安全的数字基座
运维·安全·运维服务·驻场运维