冷蟊初退 孤灯野澜 志起鸡鸣 墓不悲秋 技术交流 软件开发 商业合作 加Q:411239339

Day 06 数据持久化:Docker卷(Volume)完全指南

浏览:10次阅读
没有评论

共计 8216 个字符,预计需要花费 21 分钟才能阅读完成。

Day 06 数据持久化:Docker 卷(Volume)完全指南

容器删除后数据就丢了?学会 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 测试不同选项
  • 使用 ddfio 进行性能测试
  • 记录读写速度对比

检查清单

  • [] 测试 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

⚠️ 警告:清理前务必确认数据已备份!


更多问题?

如果遇到其他问题:

  1. 查看 Docker 官方文档 - Volumes
  2. 搜索 Docker GitHub Issues
  3. 在评论区留言,我会及时回复
  4. 加入学习群讨论(文末二维码)

📚 知识点回顾

今天我们深入学习了 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 权限

关键概念

  1. 数据持久化:容器删除后数据依然保留
  2. 卷驱动:local、nfs、云存储等不同存储后端
  3. 挂载点:容器内访问数据的路径
  4. 数据卷容器:专门用于共享数据的容器(已过时,推荐使用 Volume)

下一步学习

完成今天的实践后,建议:

  1. ✅ 实践所有示例代码,理解卷的工作原理
  2. ✅ 完成至少一个进阶实践项目
  3. ✅ 为你的项目实现数据持久化
  4. 📖 学习下一篇:Day 7 - Docker 网络详解

💬 作业时间

今日挑战

  1. ✅ 部署 WordPress 项目,并实现数据持久化
  2. ✅ 编写一个自动化备份脚本
  3. ✅ 尝试卷的跨容器共享
  4. ✅ 测试并对比 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 实战演示
  • 备份恢复完整流程

推荐阅读 📖


关注公众号 🔔
回复「Volume」获取:

  • ✅ 完整示例代码
  • ✅ 备份脚本模板
  • ✅ 性能测试工具
  • ✅ 常见问题 FAQ

加入学习社群 👥
扫描下方二维码,加入「Docker 30 天实战」学习群

  • 💬 与 500+ 学员交流
  • 🎯 每日打卡挑战
  • 🏆 优秀作业展示
  • 📚 独家学习资料

下期预告 📢

Day 7 - Docker 网络详解:容器间通信完全指南

内容抢先看:

  • 🌐 Docker 网络模型
  • 🔗 容器互联实战
  • 🛡️ 网络隔离与安全
  • 🚀 跨主机通信方案

明天见!🎉


Day 06 数据持久化:Docker 卷(Volume)完全指南


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

正文完
创作不易,扫码加点动力
post-qrcode
 0
果较瘦
版权声明:本站原创文章,由 果较瘦 于2026-03-29发表,共计8216字。
转载说明:除特殊说明外本站文章皆由果较瘦原创发布,转载请注明出处。