|
|
 容器删除后数据就丢了?学会Docker卷,让你的数据永久保存!
━━━━━━━━━━━━━━━━━━━━
今天我们要解决一个重要问题:如何让Docker容器中的数据不随容器消失而丢失。
你将学会:
✅ 理解Docker数据持久化的必要性
✅ 掌握三种数据存储方式及使用场景
✅ 实战管理MySQL、Redis等有状态应用的数据
✅ 备份和迁移Docker卷数据
难度等级:⭐⭐⭐☆☆(进阶必备)
所需时间:约 30 分钟
前置要求:
已安装Docker(Day 2)
熟悉基本容器操作(Day 3-5)
了解容器的生命周期
准备好了吗?让我们开始探索Docker的数据持久化世界!
━━━━━━━━━━━━━━━━━━━━
🤔 为什么需要数据持久化?
问题场景
想象一下这个场景:
- # 运行一个MySQL容器
- docker run -d --name mydb -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
- # 创建数据库和表,插入重要数据
- docker exec -it mydb mysql -uroot -p123456 -e "CREATE DATABASE shop;"
- docker exec -it mydb mysql -uroot -p123456 -e "USE shop; CREATE TABLE users(id INT, name VARCHAR(50));"
- # 不小心删除了容器
- docker rm -f mydb
复制代码
❌ 结果:所有数据都丢失了!
Docker容器的特性
Docker容器是临时性的,具有以下特点:
| 特性 | 说明 | 影响 |
|------|------|------|
| 无状态 | 容器删除后内部数据消失 | 数据不持久 |
| 隔离性 | 容器间文件系统互不影响 | 数据无法共享 |
| 可替换 | 容器可随时创建和销毁 | 数据易丢失 |
这就是为什么我们需要数据持久化!
━━━━━━━━━━━━━━━━━━━━
🛠️ 环境准备
系统要求
| 项目 | 要求 | 检查方法 |
|------|------|----------|
| 操作系统 | macOS / Windows / Linux | - |
| Docker版本 | 20.10+ ||
| 磁盘空间 | 至少 5GB | - |
检查命令
- # 检查Docker版本
- docker --version
- # 检查Docker是否运行
- docker ps
- # 查看当前卷列表
- docker volume ls
复制代码
准备工作目录
- # 创建工作目录
- mkdir -p ~/docker-practice/day06
- cd ~/docker-practice/day06
复制代码
✅ 环境准备完成,开始正式学习!
━━━━━━━━━━━━━━━━━━━━
📖 Docker数据存储方式
Docker提供了三种主要的数据持久化方式:
1. Volume(卷)- 推荐方式 ⭐
特点:
Docker管理,存储在完全由Docker控制,安全可靠
支持备份、迁移、加密
最佳实践,强烈推荐
2. Bind Mount(绑定挂载)
特点:
直接映射主机目录
灵活但依赖主机路径
适合开发环境、配置文件
3. tmpfs(临时文件系统)
特点:
存储在内存中
容器停止数据消失
适合临时数据、敏感信息
对比图示
- ┌─────────────────────────────────────────────────────┐
- │ 主机系统 │
- │ │
- │ ┌─────────────┐ ┌──────────────┐ ┌───────────┐ │
- │ │ Volume │ │ Bind Mount │ │ tmpfs │ │
- │ │ (推荐) │ │ (灵活) │ │ (临时) │ │
- │ └──────┬──────┘ └──────┬───────┘ └─────┬─────┘ │
- │ │ │ │ │
- │ │ │ │ │
- │ ┌──────▼─────────────────▼─────────────────▼─────┐ │
- │ │ Docker 容器 │ │
- │ │ /var/lib/mysql /app/config /tmp/cache │ │
- │ └──────────────────────────────────────────────────┘ │
- └─────────────────────────────────────────────────────┘
复制代码
━━━━━━━━━━━━━━━━━━━━
📖 操作步骤
第一部分:Volume(卷)实战
步骤1:创建和查看Volume
目标:学会创建、查看和管理Docker卷
创建卷:- # 创建一个名为 mydata 的卷
- docker volume create mydata
- # 查看所有卷
- docker volume ls
复制代码
预期输出:- DRIVER VOLUME NAME
- local mydata
复制代码
查看卷详情:- docker volume inspect mydata
复制代码
输出示例:- [
- {
- "CreatedAt": "2024-01-15T10:30:00Z",
- "Driver": "local",
- "Labels": {},
- "Mountpoint": "/var/lib/docker/volumes/mydata/_data",
- "Name": "mydata",
- "Options": {},
- "Scope": "local"
- }
- ]
复制代码
关键字段说明:
:卷在主机上的实际存储位置
:存储驱动类型
:卷名称
✅ 检查点:执行能看到 mydata 卷
━━━━━━━━━━━━━━━━━━━━
步骤2:在容器中使用Volume
目标:将卷挂载到容器,实现数据持久化
运行容器并挂载卷:- # 运行nginx容器,挂载卷到 /usr/share/nginx/html
- docker run -d \
- --name web1 \
- -v mydata:/usr/share/nginx/html \
- -p 8080:80 \
- nginx:alpine
复制代码
命令解析:
- -v mydata:/usr/share/nginx/html
复制代码 :将mydata卷挂载到容器的 /usr/share/nginx/html 目录
格式:
向卷中写入数据:- # 在容器中创建文件
- docker exec web1 sh -c 'echo "<h1>Hello from Volume!</h1>" > /usr/share/nginx/html/index.html'
复制代码
验证数据:- # 浏览器访问 http://localhost:8080
- # 或使用curl
- curl http://localhost:8080
复制代码
预期输出:- <h1>Hello from Volume!</h1>
复制代码
✅ 检查点:能够访问到我们写入的内容
━━━━━━━━━━━━━━━━━━━━
步骤3:验证数据持久性
目标:证明卷数据不随容器消失
删除容器:
创建新容器,挂载同一个卷:- # 运行新容器,使用相同的卷
- docker run -d \
- --name web2 \
- -v mydata:/usr/share/nginx/html \
- -p 8080:80 \
- nginx:alpine
复制代码
验证数据依然存在:- curl http://localhost:8080
复制代码
输出:- <h1>Hello from Volume!</h1>
复制代码
🎉 数据依然存在! 这证明了卷的持久性。
✅ 检查点:删除容器后,新容器仍能访问到之前的数据
━━━━━━━━━━━━━━━━━━━━
步骤4:实战案例 - MySQL数据持久化
目标:实现MySQL数据库的持久化存储
创建MySQL专用卷:- # 创建卷
- docker volume create mysql-data
复制代码
运行MySQL容器:- docker run -d \
- --name mysql-db \
- -e MYSQL_ROOT_PASSWORD=mypassword \
- -e MYSQL_DATABASE=testdb \
- -v mysql-data:/var/lib/mysql \
- -p 3306:3306 \
- mysql:8.0
复制代码
等待MySQL启动:- # 查看日志,等待 "ready for connections"
- docker logs -f mysql-db
复制代码
创建测试数据:- # 连接MySQL并创建表
- docker exec -it mysql-db mysql -uroot -pmypassword -e "
- USE testdb;
- CREATE TABLE users (
- id INT AUTO_INCREMENT PRIMARY KEY,
- name VARCHAR(50),
- email VARCHAR(100)
- );
- INSERT INTO users (name, email) VALUES
- ('张三', 'zhangsan@example.com'),
- ('李四', 'lisi@example.com');
- "
复制代码
查询数据:- docker exec -it mysql-db mysql -uroot -pmypassword -e "
- USE testdb;
- SELECT * FROM users;
- "
复制代码
预期输出:- +----+--------+------------------------+
- | id | name | email |
- +----+--------+------------------------+
- | 1 | 张三 | zhangsan@example.com |
- | 2 | 李四 | lisi@example.com |
- +----+--------+------------------------+
复制代码
重启容器验证:- # 删除容器
- docker rm -f mysql-db
- # 重新创建容器(使用同一个卷)
- docker run -d \
- --name mysql-db \
- -e MYSQL_ROOT_PASSWORD=mypassword \
- -v mysql-data:/var/lib/mysql \
- -p 3306:3306 \
- mysql:8.0
- # 等待启动后查询数据
- sleep 20
- docker exec -it mysql-db mysql -uroot -pmypassword -e "
- USE testdb;
- SELECT * FROM users;
- "
复制代码
✅ 检查点:重启后数据依然存在,说明MySQL数据已持久化
━━━━━━━━━━━━━━━━━━━━
第二部分:Bind Mount(绑定挂载)实战
步骤5:使用Bind Mount
目标:映射主机目录到容器
创建主机目录和文件:- # 创建目录
- mkdir -p ~/docker-practice/day06/html
- # 创建HTML文件
- cat > ~/docker-practice/day06/html/index.html << 'EOF'
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>Docker Bind Mount Demo</title>
- <style>
- body {
- font-family: Arial, sans-serif;
- text-align: center;
- padding: 50px;
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
- color: white;
- }
- </style>
- </head>
- <body>
- <h1>🚀 这是通过Bind Mount挂载的页面</h1>
- <p>修改主机文件,容器内容会实时更新!</p>
- </body>
- </html>
- EOF
复制代码
使用Bind Mount运行容器:- # 运行nginx,绑定本地目录
- docker run -d \
- --name web-bind \
- -v ~/docker-practice/day06/html:/usr/share/nginx/html \
- -p 8081:80 \
- nginx:alpine
复制代码
命令解析:
- -v ~/docker-practice/day06/html:/usr/share/nginx/html
复制代码 格式:
访问测试:- curl http://localhost:8081
复制代码
实时修改测试:- # 修改主机文件
- echo "<h1>文件已更新 - $(date)</h1>" > ~/docker-practice/day06/html/index.html
- # 立即查看效果(无需重启容器)
- curl http://localhost:8081
复制代码
预期输出:- <h1>文件已更新 - Mon Jan 15 14:30:00 CST 2024</h1>
复制代码
✅ 检查点:修改主机文件后,容器内容实时更新
常见错误 ⚠️
❌ 错误1:权限被拒绝原因:容器内用户权限不足
解决:- # 方法1:修改主机目录权限
- chmod -R 755 ~/docker-practice/day06/html
- # 方法2:使用--user参数
- docker run -d --name web-bind --user $(id -u):$(id -g) -v ...
复制代码
━━━━━━━━━━━━━━━━━━━━
步骤6:实战案例 - 开发环境配置
目标:使用Bind Mount实现开发环境的实时同步
创建项目结构:- mkdir -p ~/docker-practice/day06/myapp
- cd ~/docker-practice/day06/myapp
- # 创建package.json
- cat > package.json << 'EOF'
- {
- "name": "docker-dev-demo",
- "version": "1.0.0",
- "scripts": {
- "start": "node server.js"
- }
- }
- EOF
- # 创建简单的Node.js服务器
- cat > server.js << 'EOF'
- const http = require('http');
- const fs = require('fs');
- const server = http.createServer((req, res) => {
- const html = fs.readFileSync('./index.html', 'utf8');
- res.writeHead(200, {'Content-Type': 'text/html'});
- res.end(html);
- });
- server.listen(3000, () => {
- console.log('Server running at http://localhost:3000/');
- });
- EOF
- # 创建HTML文件
- cat > index.html << 'EOF'
- <!DOCTYPE html>
- <html>
- <head><title>开发环境测试</title></head>
- <body>
- <h1>实时开发环境</h1>
- <p>当前时间: <span id="time"></span></p>
- <script>
- document.getElementById('time').textContent = new Date().toLocaleString();
- </script>
- </body>
- </html>
- EOF
复制代码
运行开发容器:- docker run -d \
- --name dev-container \
- -v ~/docker-practice/day06/myapp:/app \
- -w /app \
- -p 3000:3000 \
- node:18-alpine \
- sh -c "npm start"
复制代码
命令解析:
- -v ~/docker-practice/day06/myapp:/app
复制代码 :绑定项目目录
:设置工作目录
:启动应用
访问测试:- curl http://localhost:3000
复制代码
实时修改代码:- # 修改HTML文件
- sed -i '' 's/实时开发环境/实时开发环境 - 已更新/g' ~/docker-practice/day06/myapp/index.html
- # 刷新页面查看效果
- curl http://localhost:3000
复制代码
✅ 检查点:修改代码后,刷新页面即可看到更新
━━━━━━━━━━━━━━━━━━━━
第三部分:卷管理与高级操作
步骤7:批量管理卷
目标:学会批量创建、查看、删除卷
查看所有卷:
查看卷占用空间:
输出示例:- VOLUME NAME LINKS SIZE
- mydata 0 12.5MB
- mysql-data 1 180MB
复制代码
删除未使用的卷:- # 查看未使用的卷
- docker volume ls -f dangling=true
- # 删除所有未使用的卷(谨慎操作!)
- docker volume prune
- # 确认删除
- # WARNING! This will remove all local volumes not used by at least one container.
- # Are you sure you want to continue? [y/N] y
复制代码
⚠️ 警告:会删除所有未被容器使用的卷,数据无法恢复!
安全删除单个卷:- # 先停止使用该卷的容器
- docker stop web2
- docker rm web2
- # 删除卷
- docker volume rm mydata
复制代码
✅ 检查点:能够安全地管理和清理卷
━━━━━━━━━━━━━━━━━━━━
步骤8:备份和恢复卷数据
目标:学会备份和迁移Docker卷数据
备份卷数据:- # 创建备份目录
- mkdir -p ~/docker-practice/day06/backups
- # 运行临时容器进行备份
- docker run --rm \
- -v mysql-data:/source \
- -v ~/docker-practice/day06/backups:/backup \
- alpine \
- tar czf /backup/mysql-backup-$(date +%Y%m%d-%H%M%S).tar.gz -C /source .
复制代码
命令解析:
:容器退出后自动删除
:挂载要备份的卷
- -v ~/docker-practice/day06/backups:/backup
复制代码 :挂载备份目录
:打包压缩数据
验证备份文件:- ls -lh ~/docker-practice/day06/backups/
复制代码
恢复数据到新卷:- # 创建新卷
- docker volume create mysql-data-restored
- # 恢复数据
- docker run --rm \
- -v mysql-data-restored:/target \
- -v ~/docker-practice/day06/backups:/backup \
- alpine \
- sh -c "cd /target && tar xzf /backup/mysql-backup-*.tar.gz"
复制代码
验证恢复:- # 使用恢复的卷运行MySQL
- docker run -d \
- --name mysql-restored \
- -e MYSQL_ROOT_PASSWORD=mypassword \
- -v mysql-data-restored:/var/lib/mysql \
- -p 3307:3306 \
- mysql:8.0
- # 等待启动
- sleep 20
- # 查询数据
- docker exec mysql-restored mysql -uroot -pmypassword -e "
- USE testdb;
- SELECT * FROM users;
- "
复制代码
✅ 检查点:恢复的数据库包含原始数据
━━━━━━━━━━━━━━━━━━━━
步骤9:跨容器共享卷
目标:多个容器共享同一个卷
创建共享卷:- docker volume create shared-logs
复制代码
运行生产者容器:- # 容器1:写入日志
- docker run -d \
- --name producer \
- -v shared-logs:/logs \
- alpine \
- sh -c 'while true; do echo "Log: $(date)" >> /logs/app.log; sleep 2; done'
复制代码
运行消费者容器:- # 容器2:读取日志
- docker run -d \
- --name consumer \
- -v shared-logs:/logs \
- alpine \
- sh -c 'tail -f /logs/app.log'
复制代码
查看日志:- # 查看消费者容器输出
- docker logs -f consumer
复制代码
预期输出:- Log: Mon Jan 15 15:30:01 UTC 2024
- Log: Mon Jan 15 15:30:03 UTC 2024
- Log: Mon Jan 15 15:30:05 UTC 2024
- ...
复制代码
清理:- docker stop producer consumer
- docker rm producer consumer
复制代码
✅ 检查点:多个容器可以同时读写同一个卷
━━━━━━━━━━━━━━━━━━━━
💻 完整示例:WordPress + MySQL
目标:综合运用卷实现WordPress完整部署
项目结构
- wordpress-project/
- ├── docker-compose.yml
- └── README.md
复制代码
docker-compose.yml
- version: '3.8'
- services:
- # MySQL数据库
- db:
- image: mysql:8.0
- container_name: wordpress-db
- volumes:
- - db-data:/var/lib/mysql
- environment:
- MYSQL_ROOT_PASSWORD: rootpassword
- MYSQL_DATABASE: wordpress
- MYSQL_USER: wpuser
- MYSQL_PASSWORD: wppassword
- networks:
- - wordpress-net
- restart: unless-stopped
- # WordPress应用
- wordpress:
- image: wordpress:latest
- container_name: wordpress-app
- depends_on:
- - db
- ports:
- - "8888:80"
- volumes:
- - wp-content:/var/www/html/wp-content
- environment:
- WORDPRESS_DB_HOST: db:3306
- WORDPRESS_DB_USER: wpuser
- WORDPRESS_DB_PASSWORD: wppassword
- WORDPRESS_DB_NAME: wordpress
- networks:
- - wordpress-net
- restart: unless-stopped
- # 定义卷
- volumes:
- db-data:
- name: wordpress-db-data
- wp-content:
- name: wordpress-content
- # 定义网络
- networks:
- wordpress-net:
- name: wordpress-network
复制代码
一键运行脚本
- #!/bin/bash
- # run-wordpress.sh
- echo "🚀 启动WordPress项目..."
- # 创建项目目录
- mkdir -p wordpress-project
- cd wordpress-project
- # 创建docker-compose.yml
- cat > docker-compose.yml << 'COMPOSE'
- version: '3.8'
- services:
- db:
- image: mysql:8.0
- container_name: wordpress-db
- volumes:
- - db-data:/var/lib/mysql
- environment:
- MYSQL_ROOT_PASSWORD: rootpassword
- MYSQL_DATABASE: wordpress
- MYSQL_USER: wpuser
- MYSQL_PASSWORD: wppassword
- networks:
- - wordpress-net
- restart: unless-stopped
- wordpress:
- image: wordpress:latest
- container_name: wordpress-app
- depends_on:
- - db
- ports:
- - "8888:80"
- volumes:
- - wp-content:/var/www/html/wp-content
- environment:
- WORDPRESS_DB_HOST: db:3306
- WORDPRESS_DB_USER: wpuser
- WORDPRESS_DB_PASSWORD: wppassword
- WORDPRESS_DB_NAME: wordpress
- networks:
- - wordpress-net
- restart: unless-stopped
- volumes:
- db-data:
- name: wordpress-db-data
- wp-content:
- name: wordpress-content
- networks:
- wordpress-net:
- name: wordpress-network
- COMPOSE
- # 启动服务
- docker-compose up -d
- # 查看状态
- docker-compose ps
- echo ""
- echo "✅ WordPress 已启动!"
- echo "🌐 访问 http://localhost:8888 开始配置"
- echo ""
- echo "📊 查看日志: docker-compose logs -f"
- echo "⏹️ 停止服务: docker-compose down"
- echo "🗑️ 删除数据: docker-compose down -v"
复制代码
使用方法:- chmod +x run-wordpress.sh
- ./run-wordpress.sh
复制代码
验证部署:- # 查看容器状态
- docker-compose ps
- # 查看卷
- docker volume ls | grep wordpress
- # 访问WordPress
- open http://localhost:8888 # macOS
- # 或在浏览器打开 http://localhost:8888
复制代码
备份WordPress数据:- # 备份数据库
- docker exec wordpress-db mysqldump -uwpuser -pwppassword wordpress > wordpress-backup.sql
- # 备份文件
- docker run --rm \
- -v wordpress-content:/source \
- -v $(pwd):/backup \
- alpine \
- tar czf /backup/wp-content-backup.tar.gz -C /source .
复制代码
📦 完整代码仓库:https://github.com/yourusername/docker-30days/tree/main/day06
━━━━━━━━━━━━━━━━━━━━
🚀 进阶实践
实践1:实现自动化备份
目标:编写脚本实现每日自动备份Docker卷
提示:
使用cron定时任务
备份文件添加日期戳
保留最近7天的备份
可以考虑压缩和加密
参考思路:- #!/bin/bash
- # backup-volumes.sh
- BACKUP_DIR="/backups"
- RETENTION_DAYS=7
- # 备份函数
- backup_volume() {
- volume_name=$1
- timestamp=$(date +%Y%m%d-%H%M%S)
- # 你的备份逻辑...
- }
- # 清理旧备份
- cleanup_old_backups() {
- # 删除7天前的备份...
- }
复制代码
━━━━━━━━━━━━━━━━━━━━
实践2:卷性能优化
目标:对比不同卷驱动的性能差异
建议:
使用测试不同选项
使用或进行性能测试
记录读写速度对比
检查清单:
[ ] 测试Volume的读写性能
[ ] 测试Bind Mount的读写性能
[ ] 测试tmpfs的读写性能
[ ] 对比结果并分析
━━━━━━━━━━━━━━━━━━━━
实践3:跨主机卷迁移
目标:将Docker卷从一台主机迁移到另一台
挑战:
导出卷数据
传输到目标主机
在目标主机重建卷
验证数据完整性
资源:
Docker Volume Plugin文档
数据迁移最佳实践
💡 提示:完成这些实践后,在评论区分享你的备份脚本或性能测试结果!
━━━━━━━━━━━━━━━━━━━━
🐛 故障排查
问题1:卷挂载失败
症状:- Error response from daemon: invalid mount config for type "volume"
复制代码
原因:卷名称或路径格式错误
解决方案:
检查卷是否存在:- docker volume ls | grep 卷名
复制代码
正确的挂载格式:- # Volume方式
- -v 卷名:/容器路径
- # Bind Mount方式(必须是绝对路径)
- -v /主机绝对路径:/容器路径
- # 错误示例
- -v ./relative/path:/container/path # ❌ 相对路径不行
- -v ~/path:/container/path # ❌ 波浪号可能有问题
- # 正确示例
- -v $(pwd)/path:/container/path # ✅ 使用$(pwd)转换为绝对路径
- -v /Users/username/path:/container/path # ✅ 绝对路径
复制代码
━━━━━━━━━━━━━━━━━━━━
问题2:权限被拒绝
症状:
原因:容器内进程用户权限不足
解决方案:
方法1:调整主机目录权限- # 查看目录权限
- ls -la /path/to/directory
- # 修改权限
- chmod -R 755 /path/to/directory
- # 或
- chmod -R 777 /path/to/directory # 仅用于测试
复制代码
方法2:使用--user参数- docker run -d \
- --user $(id -u):$(id -g) \
- -v /path:/container/path \
- image:tag
复制代码
方法3:修改容器内文件所有权- docker exec container-name chown -R www-data:www-data /container/path
复制代码
━━━━━━━━━━━━━━━━━━━━
问题3:卷数据丢失
症状:重启容器后数据不见了
排查步骤:
1. 检查是否正确使用了卷:- # 查看容器挂载信息
- docker inspect container-name | grep -A 10 Mounts
复制代码
2. 确认卷类型:- "Mounts": [
- {
- "Type": "volume", // 应该是 "volume" 不是 "bind"
- "Name": "mydata",
- "Source": "/var/lib/docker/volumes/mydata/_data",
- "Destination": "/data",
- "Driver": "local",
- "RW": true
- }
- ]
复制代码
3. 检查卷是否被误删:
预防措施:
✅ 使用管理卷
✅ 定期备份重要数据
✅ 使用命名卷而非匿名卷
✅ 添加卷标签便于识别
━━━━━━━━━━━━━━━━━━━━
问题4:磁盘空间不足
症状:
排查:- # 查看Docker使用的磁盘空间
- docker system df
- # 详细信息
- docker system df -v
复制代码
清理方案:- # 清理未使用的卷
- docker volume prune
- # 清理所有未使用资源
- docker system prune -a --volumes
- # 删除特定卷
- docker volume rm volume-name
复制代码
⚠️ 警告:清理前务必确认数据已备份!
━━━━━━━━━━━━━━━━━━━━
更多问题?
如果遇到其他问题:
查看 Docker官方文档 - Volumes
搜索 Docker GitHub Issues
在评论区留言,我会及时回复
加入学习群讨论(文末二维码)
━━━━━━━━━━━━━━━━━━━━
📚 知识点回顾
今天我们深入学习了Docker数据持久化:
核心命令总结
| 命令 | 作用 | 示例 |
|------|------|------|
|| 创建卷 |- docker volume create mydata
复制代码 |
|| 列出所有卷 ||
|| 查看卷详情 |- docker volume inspect mydata
复制代码 |
|| 删除卷 ||
|| 清理未使用的卷 ||
|参数 | 挂载卷 ||
|参数 | 挂载(推荐) |- --mount source=mydata,target=/data
复制代码 |
三种存储方式对比
| 特性 | Volume | Bind Mount | tmpfs |
|------|--------|------------|-------|
| 管理方式 | Docker管理 | 用户管理 | 内存管理 |
| 存储位置 || 自定义路径 | 内存 |
| 持久性 | ✅ 持久 | ✅ 持久 | ❌ 临时 |
| 性能 | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 共享性 | ✅ 易共享 | ⚠️ 依赖路径 | ❌ 不可共享 |
| 备份 | ✅ 易备份 | ⚠️ 手动 | ❌ 不可备份 |
| 适用场景 | 生产环境 | 开发环境 | 临时数据 |
最佳实践清单
✅ 生产环境优先使用Volume:安全可靠,易于管理
✅ 使用命名卷:避免匿名卷难以管理
✅ 定期备份数据:使用自动化脚本
✅ 监控磁盘空间:避免空间不足
✅ 使用docker-compose:统一管理卷配置
✅ 设置卷标签:便于识别和管理
✅ 只读挂载:不需要写入时使用✅ 权限最小化:避免使用777权限
关键概念
数据持久化:容器删除后数据依然保留
卷驱动:local、nfs、云存储等不同存储后端
挂载点:容器内访问数据的路径
数据卷容器:专门用于共享数据的容器(已过时,推荐使用Volume)
下一步学习
完成今天的实践后,建议:
✅ 实践所有示例代码,理解卷的工作原理
✅ 完成至少一个进阶实践项目
✅ 为你的项目实现数据持久化
📖 学习下一篇:Day 7 - Docker网络详解
━━━━━━━━━━━━━━━━━━━━
💬 作业时间
今日挑战:
✅ 部署WordPress项目,并实现数据持久化
✅ 编写一个自动化备份脚本
✅ 尝试卷的跨容器共享
✅ 测试并对比Volume和Bind Mount的性能差异
讨论话题:
你在项目中如何管理Docker数据持久化?
遇到过哪些数据丢失的坑?如何避免?
对于大规模数据,你会选择什么存储方案?
在评论区分享你的:
📸 WordPress部署成功截图
💾 备份脚本代码
📊 性能测试结果
💡 实践心得和踩坑经验
互动奖励 🎁
精彩分享将获得:
🏆 专属学习徽章
📚 进阶学习资料
👥 学习群优先答疑
━━━━━━━━━━━━━━━━━━━━
📖 系列文章导航
Day 1:Docker简介与应用场景
Day 2:Docker安装与环境配置
Day 3:Docker容器基础操作
Day 4:Docker镜像管理
Day 5:Dockerfile实战
Day 6:数据持久化完全指南 ← 📍 当前
Day 7:Docker网络详解(明天发布)
Day 8:Docker Compose入门
📑 查看完整30天学习计划
━━━━━━━━━━━━━━━━━━━━
🎁 学习资源
本文代码仓库 📦- git clone https://github.com/yourusername/docker-30days.git
- cd docker-30days/day06
复制代码
配套视频教程 🎬
数据持久化原理讲解
WordPress实战演示
备份恢复完整流程
推荐阅读 📖
Docker官方文档 - Volumes
Docker官方文档 - Bind Mounts
Docker Storage最佳实践
━━━━━━━━━━━━━━━━━━━━
关注公众号 🔔
回复「Volume」获取:
✅ 完整示例代码
✅ 备份脚本模板
✅ 性能测试工具
✅ 常见问题FAQ
加入学习社群 👥
扫描下方二维码,加入「Docker 30天实战」学习群
💬 与500+学员交流
🎯 每日打卡挑战
🏆 优秀作业展示
📚 独家学习资料
━━━━━━━━━━━━━━━━━━━━
下期预告 📢
Day 7 - Docker网络详解:容器间通信完全指南
内容抢先看:
🌐 Docker网络模型
🔗 容器互联实战
🛡️ 网络隔离与安全
🚀 跨主机通信方案
明天见!🎉
━━━━━━━━━━━━━━━━━━━━

━━━━━━━━━━━━━━━━━━━━
如果这篇文章对你有帮助,请点个「在看」「转发」,让更多人学到实用的Docker技能! ❤️ |
|