一、容器数据持久化
- 必要性:容器删除后数据会丢失,需要将关键数据持久化到宿主机
- 两种主要方式:
- volumes:Docker管理的宿主机文件系统部分(
/var/lib/docker/volumes/var/lib/docker/volumes/var/lib/docker/volumes
) - bind mounts:挂载宿主机任意位置到容器
- volumes:Docker管理的宿主机文件系统部分(
1. volumes
- 管理方式:由Docker自动管理,存储在固定目录
/var/lib/docker/volumes/var/lib/docker/volumes/var/lib/docker/volumes
- 特点:
- 是Docker官方推荐的数据持久化方式
- 目录位置固定不可更改
- 适合需要Docker管理数据卷的场景
1)volumes示例
- 创建数据卷:
- 使用数据卷:
2. bind mounts
- 特点:
- 可挂载宿主机任意目录到容器
- 会覆盖容器目标目录原有内容
- 更灵活,是目前更常用的方式
- 工作原理:宿主机目录内容会"覆盖"容器目标目录
1)bind mounts示例
3. 应用案例
1)例题:容器数据持久化命令示例
- 案例演示:
- 创建宿主机目录:
- 启动容器并挂载:
- 验证数据持久化:
- 在容器中修改文件会反映到宿主机
- 删除容器后重新创建,数据仍然存在
4. 制作镜像
- 重要原则:
- 将应用程序产生的数据集中放在一个目录(如/data)
- 不要将已生成的应用数据打包进镜像
- 只持久化容器启动后产生的数据
- 最佳实践:
- 服务如nginx、gitlab等都采用-v挂载数据目录
- 便于容器重建和数据迁移
二、知识小结
知识点 |
核心内容 |
易混淆点/注意事项 |
应用场景 |
容器数据持久化原理 |
容器重启不会丢失数据,但删除容器会导致数据丢失;持久化需将数据存储到宿主机 |
容器删除与重启对数据的影响差异 |
需要保留关键数据的容器化服务(如数据库、日志服务) |
Volume 数据卷 |
Docker 管理的宿主机文件系统部分,存储在固定目录(/var/lib/docker/volumes) |
Volume 目录不可自定义,仅限 Docker 管理 |
Docker 默认推荐的持久化方式 |
Bind Mount 挂载 |
允许将宿主机任意目录挂载到容器中,直接覆盖容器目标目录 |
宿主机空目录会覆盖容器目录内容,需预先准备数据 |
灵活指定宿主机目录(如 Nginx 网站根目录) |
持久化实践步骤 |
1. 创建宿主机目录 2. 启动容器时通过 -v 挂载目录 3. 容器数据实时同步到宿主机 |
容器内持久化目录需与应用数据目录一致 |
服务迁移、数据备份、多容器共享数据 |
镜像构建原则 |
1. 应用程序运行时数据集中存放 2. 禁止将已生成数据打包进镜像 |
镜像模板数据 vs 运行时持久化数据 |
标准化镜像开发流程 |
Nginx 持久化案例 |
挂载宿主机目录到 /usr/share/nginx/html,修改内容后删除容器仍保留数据 |
403 错误可能因宿主机目录权限导致 |
Web 服务静态资源管理 |
数据卷 vs Bind Mount |
- Volume:Docker 托管,固定路径 - Bind Mount:自定义路径,更高灵活性 |
两者均实现持久化,但管理方式不同 |
根据需求选择托管或自主管理 |