为什么需要持久化
容器的文件系统是分层叠加的。最上层是可写容器层。容器删除后,容器层一起被删除,数据全部丢失。 Docker 提供三种方式把数据放到容器层之外:volumes、bind mounts 和 tmpfs。三种挂载方式对比
volume 命令全表
-v 与 —mount 语法对照
两种语法效果相同。--mount 更直观,-v 更简短。
使用
-v 时,如果 source 是不存在的路径,Docker 会自动创建目录。--mount 则会直接报错。这个差异常引发困惑。bind mount 开发场景:代码热挂载
开发时把本地源码挂进容器。改代码立即生效,不用重新构建镜像。1
启动容器并挂载源码
执行上面的命令。容器里的
/app 就是本地项目目录。2
在本地编辑器修改代码
保存文件。容器内立即看到变化,因为两边是同一个目录。
3
重启进程生效
配合 nodemon 等热重载工具,保存即重启,无需碰镜像。
volume 备份与恢复
用临时容器把 volume 打包成 tar 文件。1
备份
2
恢复
3
验证
清理悬空 volume
容器删除后,它用过的 volume 不会被自动删除。这些无人使用的 volume 叫悬空 volume,会持续占用磁盘。延伸阅读
- Docker 容器:容器生命周期与数据的关系
- Docker 网络:多容器互联配合存储使用
- Docker Compose:用 YAML 声明 volume
- Kubernetes 配置与存储:PV 与 PVC 持久化方案