Skip to main content

为什么需要持久化

容器的文件系统是分层叠加的。最上层是可写容器层。容器删除后,容器层一起被删除,数据全部丢失。
任何写进容器内的数据都不可依赖。数据库、上传文件、日志都必须放进挂载的存储里。
Docker 提供三种方式把数据放到容器层之外:volumes、bind mounts 和 tmpfs。

三种挂载方式对比

不确定选哪种时选 Volume。它由 Docker 统一管理,支持备份、驱动扩展,也不依赖宿主机目录结构。

volume 命令全表

-v 与 —mount 语法对照

两种语法效果相同。--mount 更直观,-v 更简短。
bind mount 的两种写法:
使用 -v 时,如果 source 是不存在的路径,Docker 会自动创建目录。--mount 则会直接报错。这个差异常引发困惑。

bind mount 开发场景:代码热挂载

开发时把本地源码挂进容器。改代码立即生效,不用重新构建镜像。
1

启动容器并挂载源码

执行上面的命令。容器里的 /app 就是本地项目目录。
2

在本地编辑器修改代码

保存文件。容器内立即看到变化,因为两边是同一个目录。
3

重启进程生效

配合 nodemon 等热重载工具,保存即重启,无需碰镜像。

volume 备份与恢复

用临时容器把 volume 打包成 tar 文件。
1

备份

2

恢复

3

验证

清理悬空 volume

容器删除后,它用过的 volume 不会被自动删除。这些无人使用的 volume 叫悬空 volume,会持续占用磁盘。
docker volume prune 会删除所有当前没有容器引用的 volume,数据不可恢复。执行前先用 docker volume ls 逐个确认。删除的 volume 无法用任何方式找回。

延伸阅读