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(临时文件系统挂载) ,核心目的都是让容器的数据能够持久化 (容器删除后数据不丢失)或共享(多个容器共用数据)。

相关推荐
大树884 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质5 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工6 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn866 小时前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智6 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_6 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉7 小时前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦8 小时前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
2601_961875248 小时前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant