通过本课件,你将掌握:
Docker 默认存储机制的局限性;
两种核心持久化方案:Volumes 与 Bind Mounts 的原理与区别;
tmpfs 与命名管道(Named Pipes)的适用场景;
如何根据实际需求选择正确的存储方式;
常用命令与最佳实践。
容器默认存储的问题
Docker 容器的所有写入操作都发生在 可写层(writable layer);
该层随容器生命周期存在:容器删除 → 数据永久丢失;
无法被其他容器或主机进程直接访问;
不适合存储数据库、日志、用户上传文件等需要持久化的数据。
关键结论:“容器是无状态的,数据必须外置。”
由 Docker 管理:存储在 /var/lib/docker/volumes/(Linux)或 WSL2 路径(Docker Desktop);
与主机文件系统解耦:不依赖特定目录结构;
支持多容器共享;
可通过 CLI/API 管理(创建、列出、删除);
支持 Volume Drivers:可对接云存储(如 AWS EBS、Azure Disk);
性能优异:尤其在 Docker Desktop 上针对写密集型应用优化。
# 创建命名卷
docker volume create my_volume
# 查看所有卷
docker volume ls
# 查看卷详情(含挂载路径)
docker volume inspect my_volume
# 删除未使用的卷(谨慎!)
docker volume prune
# 启动容器时挂载卷
docker run -d \
--name my_app \
-v my_volume:/app/data \
nginx在
docker-compose.yml中使用:
services:
db:
image: postgres
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data: # 声明命名卷Linux:
/var/lib/docker/volumes/<volume_name>/_data
Docker Desktop (Windows/Mac):在文件资源管理器中输入:
\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes
不要手动修改卷内容!应通过容器或 Docker API 操作。
直接映射主机任意目录或文件(需绝对路径);
主机与容器双向同步:容器内修改 = 主机文件修改;
非 Docker 进程也可访问;
无法通过 docker volume 命令管理;
存在安全风险:容器可意外修改 / 删除主机关键文件。
# 挂载主机目录到容器
docker run -d \
--name web_server \
-v /home/user/app:/usr/share/nginx/html \
nginx
# 挂载单个文件(如配置文件)
docker run -v /etc/localtime:/etc/localtime:ro alpine date在
docker-compose.yml中:
services:
app:
image: my-app
volumes:
- ./config.yaml:/app/config.yaml:ro # 只读挂载容器内进程拥有对挂载路径的完全读写权限;
若挂载 / 或 /etc 等系统目录,可能导致主机系统崩溃;
不推荐用于生产环境的数据持久化,除非明确控制访问范围。
数据存储在主机内存中;
容器停止 → 数据自动清除;
用途:临时缓存、敏感信息(如会话密钥);
不支持跨容器共享。
docker run -d \
--tmpfs /tmp \
alpine用于容器与 Windows 主机间的进程间通信(IPC);
常见于 .NET 应用与 Windows 服务交互;
语法:-v \\.\pipe\<pipe_name>:\\.\pipe\<pipe_name>
避免使用 Bind Mounts 的情况:
生产环境存储关键业务数据;
主机目录权限复杂或路径不固定;
安全合规要求高(如金融、医疗行业)。
默认选择 Volumes:除非有明确理由使用 Bind Mounts;
命名卷优于匿名卷:便于管理和追踪;
敏感数据勿存卷中:应使用 Docker Secrets(Swarm 模式)或外部密钥管理;
定期清理未使用卷:docker volume prune(注意:会删除所有未挂载卷!);
开发 vs 生产分离:
开发:可使用 Bind Mounts 实现代码热更新;
生产:使用预构建镜像 + Volumes 存储数据。
记住:“用 Volumes 存数据,用 Bind Mounts 挂配置。”
为什么在 Docker Desktop(Windows/Mac)上 Volumes 的性能优于 Bind Mounts?
如果一个容器同时挂载了 Volume 和 Bind Mount 到同一路径,会发生什么?
如何将一个 Volume 中的数据迁移到另一台 Docker 主机?
📘 延伸阅读: