【AI 总结】Persisting Container Data
Persisting container data | AI 总结
容器数据持久化的必要性与解决方案
容器数据的 “临时性” 问题
- 容器启动时基于镜像的文件和配置运行,可独立创建、修改、删除文件,且操作不影响其他容器。
- 当容器被删除时,其内部的文件变更也会随之消失,无法满足数据库等场景下 “重启后保留数据” 的需求。
解决方案:容器卷(Volumes)
- 定义:一种独立于单个容器生命周期的存储机制,类似 “从容器内部指向外部的快捷方式 / 符号链接”,可持久化存储数据。
- 自动创建特性:若指定的卷不存在(如
log-data),执行挂载命令时 Docker 会自动创建该卷。 - 数据共享能力:同一卷可挂载到多个容器,支持日志聚合、数据管道、事件驱动应用等场景的文件共享。
卷的基础管理命令
| 命令 | 功能描述 | 注意事项 |
|---|---|---|
docker volume create <volume-name> |
创建指定名称的卷 | 示例:docker volume create log-data |
docker volume ls |
列出所有已创建的卷 | - |
docker volume rm <volume-name-or-id> |
删除指定卷 | 仅当卷未挂载到任何容器时生效 |
docker volume prune |
删除所有未使用(未挂载)的卷 | 批量清理,避免占用多余存储空间 |
实践操作:用卷持久化 Postgres 容器数据
核心步骤(含命令)
前提:下载并安装 Docker Desktop。
启动带卷的 Postgres 容器:
1
docker run --name=db -e POSTGRES_PASSWORD=secret -d -v postgres_data:/var/lib/postgresql postgres:18postgres_data为卷名,/var/lib/postgresql是 Postgres 存储数据的容器内路径)连接数据库并操作数据:
- 进入容器命令行:
docker exec -ti db psql -U postgres - 创建表并插入数据:
1
2CREATE TABLE tasks (id SERIAL PRIMARY KEY, description VARCHAR(100));
INSERT INTO tasks (description) VALUES ('Finish work'), ('Have fun'); - 验证数据:
SELECT * FROM tasks;(应显示 2 条插入记录)
- 进入容器命令行:
删除旧容器并验证数据持久化:
- 停止并删除容器:
docker stop db+docker rm db - 启动新容器挂载同一卷:
docker run --name=new-db -d -v postgres_data:/var/lib/postgresql postgres:18(无需重复设置POSTGRES_PASSWORD,仅初始化新数据库时需该变量) - 再次验证数据:
docker exec -ti new-db psql -U postgres -c "SELECT * FROM tasks"
- 停止并删除容器:
2. 查看卷内容(通过 Docker Desktop)
- 打开 Docker Desktop 仪表盘,进入 “Volumes” 视图,找到
postgres_data卷。 - 选中卷名,在 “Data” 标签页可浏览文件结构,双击文件可查看 / 修改内容,右键可保存 / 删除文件。
3. 删除卷(需确保卷未挂载)
- 前置操作:若新容器未删除,先执行
docker rm -f new-db(-f强制停止并删除容器)。 - 三种删除方式:
- 仪表盘操作:在 “Volumes” 视图选中卷,点击 “Delete Volume”。
- 命令行删除指定卷:
docker volume rm postgres_data。 - 批量删除未使用卷:
docker volume prune。
【AI 总结】Persisting Container Data
https://blog.lllllan.cn/docker/storage/persisting-container-data/