一、docker存储卷的作用
- 解耦数据与容器生命周期:核心是让数据脱离容器的临时特性,命名卷 / 绑定挂载可持久化保存数据(容器删除 / 重建不丢失),tmpfs 则为临时数据提供内存级存储,容器停止后自动清空。
- 提升数据使用灵活性与效率:支持容器间、宿主机与容器间共享数据,命名卷绕过容器层 COW 机制提升读写性能,绑定挂载可直接在宿主机修改容器内文件,适配不同使用场景。
- 优化数据管理与安全边界:提供统一的卷管理命令简化数据操作,可通过权限控制(如只读挂载)隔离容器对数据的访问,既避免误操作丢失数据,也防止容器越权读写宿主机文件。
二、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 一致) | 差(路径格式不同) | 好 |
| 性能 | 优秀 | 优秀(与宿主机磁盘相关) | 极快(内存读写) |
| 适用场景 | 生产环境持久化、跨容器共享 | 开发环境热更新、宿主机文件访问 | 临时数据、敏感数据存储 |
最常用的三种卷:
-
Bind Mount(绑定挂载,使用最多):
在绑定挂载的情况下,宿主机的目录会覆盖容器中的指定目录。这就造成了一个"隐藏"的效果:容器内已有的文件会变得不可见,但并不意味着这些文件被删除。
-
Volume 存储卷:
使用 Docker 定义的卷(如使用
VOLUME <mountpoint>)不会导致容器中该目录下的文件被 "隐藏"。这些文件仍然可以在容器中访问,只是在启动容器并挂载卷后,这些文件将和卷中的内容共存。只有更新文件会被同步到宿主机存储目录中; -
Dockerfile 创建的匿名卷:
当在 Dockerfile 中创建匿名卷时(如使用
VOLUME指令),如果容器指定目录下有文件,Docker 会将这些文件复制到新创建的匿名卷中。这是为了使卷里面拥有原本挂载点的所有内容,以防原有数据的丢失。
六、检查匿名卷是否被使用
bash
#让所有容器查找这个volume名称(--filter==-f)
docker ps --filter "volume=逻辑卷名称"
#查看网络有没有被使用
docker ps --filter "network=网络名称"
Docker 的三种数据挂载方式分别是:Volumes(卷) 、Bind Mounts(绑定挂载) 、tmpfs Mounts(临时文件系统挂载) ,核心目的都是让容器的数据能够持久化 (容器删除后数据不丢失)或共享(多个容器共用数据)。