共计 8216 个字符,预计需要花费 21 分钟才能阅读完成。
文章目录[显示]

容器删除后数据就丢了?学会 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+ | docker --version |
| 磁盘空间 | 至少 5GB | – |
检查命令
# 检查 Docker 版本
docker --version
# 检查 Docker 是否运行
docker ps
# 查看当前卷列表
docker volume ls
准备工作目录
# 创建工作目录
mkdir -p ~/docker-practice/day06
cd ~/docker-practice/day06
✅ 环境准备完成,开始正式学习!
📖 Docker 数据存储方式
Docker 提供了三种主要的数据持久化方式:
1. Volume(卷)- 推荐方式 ⭐
特点:
- Docker 管理,存储在
/var/lib/docker/volumes/ - 完全由 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"
}
]
关键字段说明:
Mountpoint:卷在主机上的实际存储位置Driver:存储驱动类型Name:卷名称
✅ 检查点:执行 docker volume ls 能看到 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"Hello from Volume!
"> /usr/share/nginx/html/index.html'
验证数据:
# 浏览器访问 http://localhost:8080
# 或使用 curl
curl http://localhost:8080
预期输出:
Hello from Volume!
✅ 检查点:能够访问到我们写入的内容
步骤 3:验证数据持久性
目标:证明卷数据不随容器消失
删除容器:
# 删除容器
docker rm -f web1
创建新容器,挂载同一个卷:
# 运行新容器,使用相同的卷
docker run -d \
--name web2 \
-v mydata:/usr/share/nginx/html \
-p 8080:80 \
nginx:alpine
验证数据依然存在:
curl http://localhost:8080
输出:
Hello from Volume!
🎉 数据依然存在! 这证明了卷的持久性。
✅ 检查点:删除容器后,新容器仍能访问到之前的数据
步骤 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'
Docker Bind Mount Demo
🚀 这是通过 Bind Mount 挂载的页面
修改主机文件,容器内容会实时更新!
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 "文件已更新 - $(date)
" > ~/docker-practice/day06/html/index.html
# 立即查看效果(无需重启容器)curl http://localhost:8081
预期输出:
文件已更新 - Mon Jan 15 14:30:00 CST 2024
✅ 检查点:修改主机文件后,容器内容实时更新
常见错误 ⚠️
❌ 错误 1 :权限被拒绝
Error: Permission denied
原因:容器内用户权限不足
解决:
# 方法 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'
开发环境测试
实时开发环境
当前时间:
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:绑定项目目录-w /app:设置工作目录sh -c "npm start":启动应用
访问测试:
curl http://localhost:3000
实时修改代码:
# 修改 HTML 文件
sed -i '''s/ 实时开发环境 / 实时开发环境 - 已更新 /g' ~/docker-practice/day06/myapp/index.html
# 刷新页面查看效果
curl http://localhost:3000
✅ 检查点:修改代码后,刷新页面即可看到更新
第三部分:卷管理与高级操作
步骤 7:批量管理卷
目标:学会批量创建、查看、删除卷
查看所有卷:
docker volume ls
查看卷占用空间:
docker system df -v
输出示例:
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 volume prune 会删除所有未被容器使用的卷,数据无法恢复!
安全删除单个卷:
# 先停止使用该卷的容器
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 .
命令解析:
--rm:容器退出后自动删除-v mysql-data:/source:挂载要备份的卷-v ~/docker-practice/day06/backups:/backup:挂载备份目录tar czf ...:打包压缩数据
验证备份文件:
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:卷性能优化
目标:对比不同卷驱动的性能差异
建议:
- 使用
docker run --mount测试不同选项 - 使用
dd或fio进行性能测试 - 记录读写速度对比
检查清单:
- [] 测试 Volume 的读写性能
- [] 测试 Bind Mount 的读写性能
- [] 测试 tmpfs 的读写性能
- [] 对比结果并分析
实践 3:跨主机卷迁移
目标:将 Docker 卷从一台主机迁移到另一台
挑战:
- 导出卷数据
- 传输到目标主机
- 在目标主机重建卷
- 验证数据完整性
资源:
💡 提示:完成这些实践后,在评论区分享你的备份脚本或性能测试结果!
🐛 故障排查
问题 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:权限被拒绝
症状:
Permission denied
原因:容器内进程用户权限不足
解决方案:
方法 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. 检查卷是否被误删:
docker volume ls
预防措施:
- ✅ 使用
docker-compose.yml管理卷 - ✅ 定期备份重要数据
- ✅ 使用命名卷而非匿名卷
- ✅ 添加卷标签便于识别
问题 4:磁盘空间不足
症状:
no space left on device
排查:
# 查看 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 |
创建卷 | docker volume create mydata |
docker volume ls |
列出所有卷 | docker volume ls |
docker volume inspect |
查看卷详情 | docker volume inspect mydata |
docker volume rm |
删除卷 | docker volume rm mydata |
docker volume prune |
清理未使用的卷 | docker volume prune |
-v 参数 |
挂载卷 | -v mydata:/data |
--mount 参数 |
挂载(推荐) | --mount source=mydata,target=/data |
三种存储方式对比
| 特性 | Volume | Bind Mount | tmpfs |
|---|---|---|---|
| 管理方式 | Docker 管理 | 用户管理 | 内存管理 |
| 存储位置 | /var/lib/docker/volumes/ |
自定义路径 | 内存 |
| 持久性 | ✅ 持久 | ✅ 持久 | ❌ 临时 |
| 性能 | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 共享性 | ✅ 易共享 | ⚠️ 依赖路径 | ❌ 不可共享 |
| 备份 | ✅ 易备份 | ⚠️ 手动 | ❌ 不可备份 |
| 适用场景 | 生产环境 | 开发环境 | 临时数据 |
最佳实践清单
- ✅ 生产环境优先使用 Volume:安全可靠,易于管理
- ✅ 使用命名卷:避免匿名卷难以管理
- ✅ 定期备份数据:使用自动化脚本
- ✅ 监控磁盘空间:避免空间不足
- ✅ 使用 docker-compose:统一管理卷配置
- ✅ 设置卷标签:便于识别和管理
- ✅ 只读挂载:不需要写入时使用
:ro - ✅ 权限最小化:避免使用 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 入门
🎁 学习资源
本文代码仓库 📦
git clone https://github.com/yourusername/docker-30days.git
cd docker-30days/day06
配套视频教程 🎬
- 数据持久化原理讲解
- WordPress 实战演示
- 备份恢复完整流程
推荐阅读 📖
关注公众号 🔔
回复「Volume」获取:
- ✅ 完整示例代码
- ✅ 备份脚本模板
- ✅ 性能测试工具
- ✅ 常见问题 FAQ
加入学习社群 👥
扫描下方二维码,加入「Docker 30 天实战」学习群
- 💬 与 500+ 学员交流
- 🎯 每日打卡挑战
- 🏆 优秀作业展示
- 📚 独家学习资料
下期预告 📢
Day 7 - Docker 网络详解:容器间通信完全指南
内容抢先看:
- 🌐 Docker 网络模型
- 🔗 容器互联实战
- 🛡️ 网络隔离与安全
- 🚀 跨主机通信方案
明天见!🎉

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