必须使用 Docker Volume 实现数据库持久化,因为容器可写层随容器销毁而清空,而 Volume 生命周期独立,数据存于 /var/lib/docker/volumes/ 下;推荐用具名卷(如 mysql-data),首次挂载会自动迁移初始化数据,支持跨容器复用、备份(tar 打包 _data)与恢复。

用 Docker Volume 挂载外部存储来实现数据库状态持久化,核心是把数据库的数据目录(比如 MySQL 的 /var/lib/mysql)映射到一个由 Docker 管理的、独立于容器生命周期的卷上。这样即使容器删了、重装了、重启了,数据依然完整保留在宿主机上。
为什么必须用 Volume 而不是直接存容器里
数据库写入的数据默认落在容器可写层,而这一层随容器销毁而清空。Volume 是 Docker 专门设计的持久化机制,它的生命周期与容器解耦——只要不手动 docker volume rm,数据就一直安全存在 /var/lib/docker/volumes/ 下。
创建并挂载命名 Volume 到数据库容器
推荐使用具名卷(named volume),便于识别、复用和管理:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 先创建卷:
docker volume create mysql-data - 启动 MySQL 容器并挂载:
docker run -d \--name mysql-prod \-e MYSQL_ROOT_PASSWORD=123456 \-v mysql-data:/var/lib/mysql \-p 3306:3306 \mysql:8.0 - 验证挂载是否生效:
docker inspect mysql-prod,查看Mounts字段中Type为volume、Source指向/var/lib/docker/volumes/mysql-data/_data
确保数据在容器初始化时正确迁移
首次挂载空 Volume 到已有数据的目录(如 MySQL 镜像自带的初始化文件),Docker 会自动将原目录内容复制进 Volume。这意味着:
- 第一次运行容器时,MySQL 初始化脚本仍会执行,生成 root 用户、系统库等
- 这些数据被复制进
mysql-data卷,后续所有挂载该卷的容器都直接读取这份持久数据 - 如果卷已非空,容器启动时不会覆盖或重置,直接复用现有数据库状态
跨容器复用与备份恢复
Volume 支持无缝切换容器实例,也方便做数据快照:
- 停旧容器:
docker stop mysql-prod && docker rm mysql-prod - 启新容器(完全相同挂载):
docker run -d --name mysql-new -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0 - 连接验证:
mysql -h 127.0.0.1 -P 3306 -u root -p -e "SHOW DATABASES;",确认原有库仍在 - 备份数据卷:
tar -czf mysql-data-backup.tar.gz -C /var/lib/docker/volumes/mysql-data/ _data - 恢复只需解压覆盖对应
_data目录,再启动容器即可

















