8Docker 深度探索

Docker 存储

数据持久化

VolumeBind Mount

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第8章:Docker存储(Docker Storage)

一、导读

1.1 本章学习目标

容器的可写层是临时的。本章讲解三种数据持久化方案:Volume、Bind Mount、tmpfs。

本章的核心学习目标包括:

  • 掌握三种存储方案:Volume、Bind Mount、tmpfs。
  • 理解 Volume 的优势:跨平台、易管理、易备份。
  • 学会备份和迁移 Volume。
  • 在 Compose 中配置存储。

1.2 为什么本章如此重要

数据库、文件上传等场景需要持久化数据。理解 Docker 的存储方案,你才能正确配置数据持久化。

1.3 核心问题引导

Volume 和 Bind Mount 的区别是什么?

容器删除后 Volume 中的数据会丢失吗?

如何备份 Volume 中的数据?

tmpfs 适合什么场景?


二、核心概念详解

2.1 Volume

bash
# 创建 Volume
docker volume create mydata

# 查看 Volume
docker volume ls
docker volume inspect mydata

# 使用 Volume
docker run -d -v mydata:/var/lib/mysql --name db mysql:8.0

# 删除 Volume
docker volume rm mydata

Volume 的特点:

  • Docker 管理的存储
  • 存储在 /var/lib/docker/volumes/
  • 跨平台兼容
  • 可以共享给多个容器
  • 支持 Volume 驱动(local、nfs、cloud)

2.2 Bind Mount

bash
# 映射宿主机目录
docker run -d -v /home/user/data:/app/data --name app myapp

# 绝对路径
docker run -d -v $(pwd)/config:/etc/config myapp

Bind Mount 的特点:

  • 直接映射宿主机路径
  • 性能最好
  • 依赖宿主机路径
  • 不适合跨平台

2.3 tmpfs

bash
# 内存存储
docker run -d --tmpfs /tmp:rw,size=100m myapp

tmpfs 的特点:

  • 存储在内存中
  • 不写入磁盘
  • 容器停止后数据丢失
  • 适合临时文件、敏感数据

2.4 对比

特性VolumeBind Mounttmpfs
管理方Docker宿主机Docker
位置Docker 管理宿主机路径内存
跨平台是否是
性能好最好最好
持久化是是否

2.5 备份 Volume

bash
# 备份
docker run --rm \
  -v mydata:/data \
  -v $(pwd):/backup \
  alpine tar czf /backup/mydata-backup.tar.gz -C /data .

# 恢复
docker run --rm \
  -v mydata:/data \
  -v $(pwd):/backup \
  alpine tar xzf /backup/mydata-backup.tar.gz -C /data

2.6 Compose 中的存储

yaml
version: '3.8'

services:
  db:
    image: postgres:15
    volumes:
      - pgdata:/var/lib/postgresql/data     # Named Volume
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql  # Bind Mount

  app:
    image: myapp
    volumes:
      - type: tmpfs
        target: /tmp
        tmpfs:
          size: 100000000

volumes:
  pgdata:
    driver: local

三、实战案例

3.1 数据库持久化

bash
# 创建 Volume
docker volume create pgdata

# 运行数据库
docker run -d \
  -v pgdata:/var/lib/postgresql/data \
  -e POSTGRES_PASSWORD=secret \
  --name db postgres:15

# 写入数据
docker exec -it db psql -U postgres -c "CREATE TABLE test (id int);"

# 删除容器
docker rm -f db

# 重新创建,数据保留
docker run -d \
  -v pgdata:/var/lib/postgresql/data \
  -e POSTGRES_PASSWORD=secret \
  --name db postgres:15

# 验证数据
docker exec -it db psql -U postgres -c "\dt"

四、本章小结

Volume:Docker 管理,推荐方案。

Bind Mount:宿主机路径,性能最好。

tmpfs:内存存储,临时数据。

Volume 可以备份和迁移。

Compose 中使用命名卷和绑定挂载。


五、思考与练习

思考题

为什么推荐 Volume 而不是 Bind Mount?

多个容器可以同时挂载同一个 Volume 吗?

如何在不启动容器的情况下备份 Volume?

练习题

创建数据库容器挂载 Volume,验证数据持久化。

练习 Volume 的备份和恢复。

对比 Volume 和 Bind Mount 的性能。

8/8Dock
0%