Docker持久化存储配置:容器数据不丢失的完整操作指南

Docker 容器本身是无状态的:容器被删除,里面写入的数据也会一起消失。
要让数据库文件、上传目录、配置文件在容器重建后仍然保留,就必须做 Docker 持久化存储配置。
最常见的两种方式是 数据卷(volume) 和 绑定挂载(bind mount),前者由 Docker 管理,适合数据库和需要备份的数据;
后者直接映射宿主机目录,适合改配置文件、放网站源码。

先判断该用哪种挂载方式

动手前先想清楚数据放在哪里,选错方式后面迁移会很麻烦。

  • 数据卷(volume):由 Docker 在 /var/lib/docker/volumes/ 下统一管理,路径可读性差但可移植性好,推荐给 MySQL、Redis、PostgreSQL 这类数据库。
  • 绑定挂载(bind mount):把宿主机任意目录挂进容器,比如 /www/wwwroot/site:/usr/share/nginx/html,改文件立刻生效,适合 Nginx 静态站点、应用配置文件。
  • 临时目录(tmpfs):只存在内存中,容器停止即消失,这里不做持久化讨论。

直接写容器内路径而不做挂载,是最常见的错误——数据仍留在容器可写层,docker rm 之后就找不回来了。

数据卷方式的配置步骤

以 MySQL 为例,先在宿主机创建卷,再让容器使用它。

docker volume create mysql_data

启动容器并把卷挂到数据目录:

docker run -d \
  --name mysql8 \
  -e MYSQL_ROOT_PASSWORD=your_password \
  -v mysql_data:/var/lib/mysql \
  mysql:8

-v mysql_data:/var/lib/mysql 表示把名为 mysql_data 的卷挂载到容器内 /var/lib/mysql。
冒号左边是卷名,右边是容器路径,方向不要写反。

查看卷实际位置和挂载情况:

docker volume inspect mysql_data
docker inspect mysql8 | grep -A 5 Mounts

docker volume inspect 返回的 Mountpoint 就是数据在宿主机上的真实目录。

绑定挂载方式的配置步骤

适合需要频繁改文件、或者要把数据放到指定磁盘的场景。
先建目录:

mkdir -p /www/wwwroot/site

再挂载启动 Nginx:

docker run -d \
  --name nginx_site \
  -p 80:80 \
  -v /www/wwwroot/site:/usr/share/nginx/html \
  nginx:latest

在宿主机 /www/wwwroot/site 下放一个 index.html,刷新浏览器就能看到内容,说明挂载生效。
绑定挂载依赖宿主机目录权限,容器内进程的用户 UID 必须能读写该目录,否则会报 Permission denied。

常见报错与避坑要点

  • docker: Error response from daemon: ... permission denied:宿主机目录权限不足,检查 ls -ld 的属主,必要时调整目录权限或用 --user 指定运行用户。
  • 数据卷删不掉:卷被容器占用时 docker volume rm 会失败,先 docker rm -f 容器再删卷。
  • 误删数据卷:docker volume prune 会清理所有未使用卷,执行前确认没有需要保留的数据,重要数据建议先备份 Mountpoint 目录。
  • 路径写错:容器内目标路径必须是绝对路径,-v ./data:/var/lib/mysql 这种相对路径容易被解析成卷名而不是目录,建议统一写绝对路径。
  • 权限与备份:涉及删除、改权限、重启容器前,先确认数据已备份;生产环境建议定期把卷目录或绑定目录同步到其他磁盘。

验证持久化是否真的生效

配置完成后不要只看容器是否启动,要实际验证数据能留下:

  1. 在容器内创建一份测试数据,例如 docker exec -it mysql8 mysql -uroot -p -e "CREATE DATABASE testdb;"。
  2. 删除并重建容器:docker rm -f mysql8,再用同样的 -v 参数启动。
  3. 再次进入容器查询 SHOW DATABASES;,如果 testdb 还在,说明持久化配置成功。
  4. 用 docker volume ls 或 ls /www/wwwroot/site 确认数据和挂载目录都存在。

如果第 3 步数据丢失,优先检查启动命令里是否漏了 -v,以及卷名或宿主机路径是否和之前一致。

几个容易卡住的疑问

数据卷和绑定挂载能不能同时用? 可以。
一个容器可以挂多个 -v,比如数据库用卷、配置文件用绑定挂载,按数据性质分别选择即可。

容器删了,卷会跟着删吗? 不会。
卷独立于容器生命周期,只有显式执行 docker volume rm 或 docker volume prune 才会删除。

迁移到另一台服务器怎么带走数据? 用 docker run --rm -v mysql_data:
/data -v $(pwd):
/backup alpine tar czf /backup/mysql_data.tar.gz -C /data .
打包,
再在新机器上还原到同名卷。

Docker 持久化存储配置的核心就一句:凡是需要保留的数据,都要通过 -v 显式挂载到卷或宿主机目录。
先选对挂载方式,再按上面的命令配置,最后用删除重建的方式验证一次,基本就能避开数据丢失的坑。

分享到:
上一篇
批量服务器免密登录配置:从生成密钥到批量分发实操
下一篇
Docker镜像仓库Harbor搭建:从零部署到HTTPS访问的完整步骤
1
系统公告

泽御云中秋国庆双节活动上线:新购8折,拼团3.99元起

尊敬的用户:
泽御云“月满中秋·礼贺国庆”双节活动现已开启,活动时间为2026年9月23日至10月10日。 活动期间可享以下福利:
1. 常规云服务器新购使用优惠码“泽御中秋国庆同乐”,符合条件的订单享8折优惠。
2. 香港精品云服务器5人拼团低至3.99元,部分4核4G套餐3人拼团年付388元,续费同价。
3. 新用户购买年付云服务器,符合活动规则可赠送2个月使用时长。
4. 老用户续费季度赠15天,续费年度赠2个月;活动期间升级配置免收配置迁移手续费。
5. 推荐好友成功下单,符合条件的推荐人可获赠7天服务器使用时长。
6. 活动期间享宕机补偿标准翻倍、简单网站迁移协助及技术工单优先处理权益。
温馨提示:优惠码不适用于拼团套餐、活动轻量产品、年付订单及续费订单;拼团套餐为独立特价活动,不与赠时类福利叠加。赠送时长不可折现、退款或跨账户转移,具体规则以活动页面说明为准。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意