第8章:Docker存储(Docker Storage)
一、导读
1.1 本章学习目标
容器的可写层是临时的。本章讲解三种数据持久化方案:Volume、Bind Mount、tmpfs。
本章的核心学习目标包括:
- 掌握三种存储方案:Volume、Bind Mount、tmpfs。
- 理解 Volume 的优势:跨平台、易管理、易备份。
- 学会备份和迁移 Volume。
- 在 Compose 中配置存储。
1.2 为什么本章如此重要
数据库、文件上传等场景需要持久化数据。理解 Docker 的存储方案,你才能正确配置数据持久化。
1.3 核心问题引导
Volume 和 Bind Mount 的区别是什么?
容器删除后 Volume 中的数据会丢失吗?
如何备份 Volume 中的数据?
tmpfs 适合什么场景?
二、核心概念详解
2.1 Volume
bash
# 创建 Volume
docker volume create mydata
# 查看 Volume
docker volume ls
docker volume inspect mydata
# 使用 Volume
docker run -d -v mydata:/var/lib/mysql --name db mysql:8.0
# 删除 Volume
docker volume rm mydataVolume 的特点:
- Docker 管理的存储
- 存储在
/var/lib/docker/volumes/ - 跨平台兼容
- 可以共享给多个容器
- 支持 Volume 驱动(local、nfs、cloud)
2.2 Bind Mount
bash
# 映射宿主机目录
docker run -d -v /home/user/data:/app/data --name app myapp
# 绝对路径
docker run -d -v $(pwd)/config:/etc/config myappBind Mount 的特点:
- 直接映射宿主机路径
- 性能最好
- 依赖宿主机路径
- 不适合跨平台
2.3 tmpfs
bash
# 内存存储
docker run -d --tmpfs /tmp:rw,size=100m myapptmpfs 的特点:
- 存储在内存中
- 不写入磁盘
- 容器停止后数据丢失
- 适合临时文件、敏感数据
2.4 对比
| 特性 | Volume | Bind Mount | tmpfs |
|---|---|---|---|
| 管理方 | Docker | 宿主机 | Docker |
| 位置 | Docker 管理 | 宿主机路径 | 内存 |
| 跨平台 | 是 | 否 | 是 |
| 性能 | 好 | 最好 | 最好 |
| 持久化 | 是 | 是 | 否 |
2.5 备份 Volume
bash
# 备份
docker run --rm \
-v mydata:/data \
-v $(pwd):/backup \
alpine tar czf /backup/mydata-backup.tar.gz -C /data .
# 恢复
docker run --rm \
-v mydata:/data \
-v $(pwd):/backup \
alpine tar xzf /backup/mydata-backup.tar.gz -C /data2.6 Compose 中的存储
yaml
version: '3.8'
services:
db:
image: postgres:15
volumes:
- pgdata:/var/lib/postgresql/data # Named Volume
- ./init.sql:/docker-entrypoint-initdb.d/init.sql # Bind Mount
app:
image: myapp
volumes:
- type: tmpfs
target: /tmp
tmpfs:
size: 100000000
volumes:
pgdata:
driver: local三、实战案例
3.1 数据库持久化
bash
# 创建 Volume
docker volume create pgdata
# 运行数据库
docker run -d \
-v pgdata:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
--name db postgres:15
# 写入数据
docker exec -it db psql -U postgres -c "CREATE TABLE test (id int);"
# 删除容器
docker rm -f db
# 重新创建,数据保留
docker run -d \
-v pgdata:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=secret \
--name db postgres:15
# 验证数据
docker exec -it db psql -U postgres -c "\dt"四、本章小结
Volume:Docker 管理,推荐方案。
Bind Mount:宿主机路径,性能最好。
tmpfs:内存存储,临时数据。
Volume 可以备份和迁移。
Compose 中使用命名卷和绑定挂载。
五、思考与练习
思考题
为什么推荐 Volume 而不是 Bind Mount?
多个容器可以同时挂载同一个 Volume 吗?
如何在不启动容器的情况下备份 Volume?
练习题
创建数据库容器挂载 Volume,验证数据持久化。
练习 Volume 的备份和恢复。
对比 Volume 和 Bind Mount 的性能。