Docker Desktop怎么让容器重建后保留数据_Docker Desktop持久化存储配置教程

小伟同学_8162

小伟同学_8162

2026-11-07

763人浏览

原创

Docker Volume是唯一能可靠实现容器重建后数据不丢的机制;它由Docker全权管理、路径独立、权限自动适配、支持多容器共享且跨平台可移植,而Bind Mount路径依赖强、tmpfs内存易失。

docker desktop怎么让容器重建后保留数据_docker desktop持久化存储配置教程

docker volume 是唯一能可靠实现容器重建后数据不丢的机制。绑定挂载(bind mount)虽然也能保留数据,但路径依赖强、权限易出错、跨平台迁移困难;tmpfs 完全在内存里,一停就清空。别信“删容器前先 docker commit”这种伪持久化——它只保存文件系统快照,不包含运行时状态,且无法还原数据库一致性。

为什么 docker volume 是默认首选

命名卷由 Docker 全权管理,路径藏在 /var/lib/docker/volumes/ 下(WSL2 内部或 HyperKit VM 中),与宿主机用户目录解耦。这意味着:

  • 你不用操心路径是否存在、权限是否够(Docker 自动 chown 到容器用户 UID)
  • 卷生命周期独立于容器:删容器不删卷,docker volume prune 才会清理未被引用的卷
  • 多个服务(如 MySQL + PHP-FPM)可同时挂载同一卷,共享配置或缓存目录
  • docker compose up -d 重建时,只要 volumes: 块里定义了同名卷,Docker 就复用已有卷,不会新建

docker-compose.yml 里怎么写才真正生效

常见错误是只取消注释 volumes 行,却漏掉顶层 volumes: 块定义。这两部分必须同时存在,否则 Compose 会创建匿名卷(删容器即丢)。

正确写法(以 Redis 为例):

services:
  redis:
    image: redis:7-alpine
    volumes:
      - redis-data:/data
    # 其他配置...
<p>volumes:
redis-data:  # ← 这行不能少!没有它,redis-data 就是匿名卷
</p>

关键点:

  • 服务内 volumes: 的 redis-data:/data 是“挂载声明”
  • 顶层 volumes: 下的 redis-data: 是“卷资源定义”,Docker 由此知道该创建/复用命名卷
  • 如果想指定卷驱动(比如存到 NFS),可写成 redis-data: { driver: local, driver_opts: { o: bind, type: none, device: /mnt/nfs/redis } },但开发环境极少需要

重建容器时数据还在,但应用报错连不上?检查三件事

数据卷没丢 ≠ 应用能正常读写。以下问题高频出现:

  • Permission denied:Alpine 镜像默认以 redis 用户(UID 999)运行,但 WSL2 中卷目录可能属 root。解决方案:启动容器时加 --user 999:999 或改镜像 USER 指令
  • Redis 启动失败并提示 Can't open the log file: Permission denied:因为 /data 下已有日志文件,但属主不是当前运行用户。临时解法:docker run --rm -v redis-data:/data alpine chown -R 999:999 /data
  • MySQL 报 Table 'mysql.plugin' doesn't exist:说明卷里混了旧版本数据(如从 MySQL 5.7 卷直接挂给 8.0 容器)。必须清空卷或手动升级 schema,不能硬扛

别把 bind mount 当 volume 用

有人图省事写 - ./db:/var/lib/mysql,以为这样更“直观”。实际埋雷:

  • 第一次运行时,./db 是空目录,MySQL 初始化失败(因非空目录不初始化)
  • Windows/macOS 上,./db 路径在 WSL2 或 HyperKit 外,I/O 性能差,尤其 SQLite 或小文件多的场景
  • Git 误提交 ./db 目录,团队成员拉代码后直接覆盖本地数据
  • Compose 重命名服务名(如 mysql → db),绑定路径不变,但语义已混乱

真要调试配置文件,用 bind mount 挂单个 redis.conf 即可;数据目录一律交给 volume。

卷本身不解决数据一致性,它只是把“删容器不丢数据”这件事做到底。应用层是否能安全重启、是否支持热加载、是否要求文件锁 —— 这些得看具体服务的设计。别指望一个 docker volume create 命令能绕过 MySQL 的 mysqldump 或 Redis 的 SAVE 逻辑。

相关专题

更多
k8s和docker区别
k8s和docker区别

k8s和docker区别有抽象层次不同、管理范围不同、功能不同、应用程序生命周期管理不同、缩放能力不同、高可用性等等区别。本专题为大家提供k8s和docker区别相关的各种文章、以及下载和课程。

2023.07.24

805

4

docker进入容器的方法有哪些
docker进入容器的方法有哪些

docker进入容器的方法:1. Docker exec;2. Docker attach;3. Docker run --interactive --tty;4. Docker ps -a;5. 使用 Docker Compose。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

6499

6

docker容器无法访问外部网络怎么办
docker容器无法访问外部网络怎么办

docker 容器无法访问外部网络的原因和解决方法:配置 nat 端口映射以将容器端口映射到主机端口。根据主机兼容性选择正确的网络驱动(如 host 或 overlay)。允许容器端口通过主机的防火墙。配置容器的正确 dns 服务器。选择正确的容器网络模式。排除主机网络问题,如防火墙或连接问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

7617

6

docker镜像有什么用
docker镜像有什么用

docker 镜像是预构建的软件组件,用途广泛,包括:应用程序部署:简化部署,提高移植性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.08

3033

7

Docker容器化部署与DevOps实践
Docker容器化部署与DevOps实践

本专题面向后端与运维开发者,系统讲解 Docker 容器化技术在实际项目中的应用。内容涵盖 Docker 镜像构建、容器运行机制、Docker Compose 多服务编排,以及在 DevOps 流程中的持续集成与持续部署实践。通过真实场景演示,帮助开发者实现应用的快速部署、环境一致性与运维自动化。

2026.02.11

339

16

Docker 容器部署
Docker 容器部署

本专题整合了Docker容器部署相关内容,阅读专题下面的文章了解更多详细操作教程。

2026.03.31

491

14

Java容器化部署与Docker实践教程合集
Java容器化部署与Docker实践教程合集

聚焦 Java 应用的容器化与云原生部署,讲解 Dockerfile 编写规范与 Java 应用镜像构建、多阶段构建(Multi-stage Build)减小镜像体积、Jib / Buildpacks 免 Dockerfile 镜像构建方案、JVM 容器感知参数(-XX:MaxRAMPercentage)配置、Docker Compose 编排多服务(应用 + MySQL + Redis)、容器健康检查与资源限制、Kubernetes

2026.05.11

460

26

Go Docker与容器化部署教程合集
Go Docker与容器化部署教程合集

聚焦 Go 应用的容器化部署优势与实践,讲解 Go 静态编译特性(CGO_ENABLED=0)与 scratch / distroless 极小基础镜像构建、多阶段 Dockerfile 编写规范、交叉编译生成目标平台二进制、镜像安全扫描(Trivy)与漏洞修复、Docker Compose 本地编排开发环境、Kubernetes Deployment / Service / ConfigMap 部署 Go 服务、健康检查(Livene

2026.05.15

345

24

Hyperf 项目部署运维与性能调优手册
Hyperf 项目部署运维与性能调优手册

聚焦 Hyperf 在生产环境的落地,包含 Docker 高效打包、Swoole 配置优化、常见的内存溢出(OOM)问题排查方法以及热更新方案。

2026.05.19

525

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程