概述

你有没有遇到过这种情况:

  • 启动一个 MySQL 容器,存了数据
  • 停止并删除容器
  • 重新启动一个新容器,发现所有数据都没了

这不是 Bug,而是 Docker 的默认行为:
容器是“临时”的,里面的文件系统会随着容器的删除而消失

那怎么才能让数据“留下来”?
答案就是:Docker 数据持久化

为什么容器数据会丢失

Docker 容器使用的是联合文件系统(UnionFS),它的文件系统是“分层”的:

  • 每次对容器的修改,都写在最上层的“可写层”
  • 当容器被删除时,这一层也会被清除

所以:容器 ≠ 数据存储,它更像是一个“运行环境”。

Docker 数据持久化的三种方式

方式 适用场景 是否推荐
1. 数据卷(Volumes) 数据库、配置文件 ✅ 推荐
2. 绑定挂载(Bind Mounts) 开发环境、共享本地文件
3. 临时文件系统(tmpfs) 敏感数据、内存存储 ⚠️ 特定场景

我们重点介绍前两种

方式一、数据卷(Volumes)——推荐方式

数据卷是 Docker 管理的、专门用于持久化数据的机制,完全独立于容器生命周期

1. 创建数据卷

docker volume create mysql-data

2. 启动容器并挂载数据卷

docker run -d \
  --name mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v mysql-data:/var/lib/mysql \
  mysql:8.0

关键参数:-v mysql-data:/var/lib/mysql
表示:把名为 mysql-data 的数据卷,挂载到容器内的 /var/lib/mysql 目录

3. 验证数据持久化

# 删除容器
docker rm -f mysql

# 重新启动一个新容器,使用同一个数据卷
docker run -d \
  --name mysql-new \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v mysql-data:/var/lib/mysql \
  mysql:8.0

你会发现,之前的数据依然存在

4. 管理数据卷

命令 说明
docker volume ls 查看所有数据卷
docker volume inspect mysql-data 查看数据卷详情
docker volume rm mysql-data 删除数据卷(慎用!)
docker volume prune 清理未使用的数据卷

方式二、绑定挂载(Bind Mounts)——开发利器

绑定挂载是将宿主机的目录或文件直接挂载到容器中

场景:开发 Node.js 应用

你想在本地修改代码,容器内自动生效。

docker run -d \
  --name myapp \
  -p 3000:3000 \
  -v /path/to/your/app:/app \
  -v /app/node_modules \
  my-node-app:1.0
  • /path/to/your/app:/app:本地代码同步到容器
  • /app/node_modules:声明一个匿名卷,避免覆盖容器内的 node_modules

优点:

  • 实时同步代码,无需重建镜像
  • 适合本地开发

缺点:

  • 依赖宿主机路径,可移植性差
  • 权限问题可能较复杂

Docker Compose 中的数据持久化

docker-compose.yml 中配置更简单:

version: '3.8'

services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - mysql-data:/var/lib/mysql  # 使用命名卷

  app:
    build: .
    ports:
      - "3000:3000"
    volumes:
      - ./src:/app/src             # 绑定挂载,用于开发
      - node_modules:/app/node_modules  # 避免覆盖依赖

volumes:
  mysql-data:
  node_modules:

运行:

docker compose up

所有数据卷自动创建和管理!

最佳实践

实践 说明
生产环境用数据卷 安全、可移植、易于备份
开发环境用绑定挂载 实时同步代码
不要在容器内存储重要数据 除非挂载了持久化存储
定期备份数据卷 使用 docker run --rm -v mysql-data:/data busybox tar c /data
避免使用相对路径挂载 使用绝对路径或命名卷

常见问题

  1. 数据卷存储在宿主机哪里?
  • Linux:/var/lib/docker/volumes/
  • Docker Desktop(Mac/Windows):在虚拟机内部,不直接暴露

👉 不要手动修改!使用 docker volume 命令管理。

  1. 如何迁移数据卷?
    (1) 将数据卷内容打包:
    docker run --rm -v mysql-data:/data -v $(pwd):/backup busybox tar c /data > backup.tar
    
    (2) 在新机器上解包并恢复

总结

方式 是否持久 是否推荐 适用场景
容器内部存储 临时数据
数据卷(Volumes) ✅✅✅ 生产环境、数据库
绑定挂载(Bind Mounts) 开发环境、配置共享

数据持久化不是可选项,而是使用 Docker 的基本功
只有掌握了它,你才能真正安全地运行数据库、文件服务等有状态应用

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐