用 Docker 跑服务时,最头疼的可能就是数据存哪儿了 —— 容器删了数据也跟着丢?改个配置还要钻进容器里操作?其实掌握「卷」和「绑定挂载」这两招,这些问题都能轻松解决。今天就用大白话聊聊这两种数据管理方式,看完就能上手~

一、先搞懂:为啥需要管理数据?

容器就像个临时小房子,默认情况下,里面的文件随着容器删除就没了。但数据库、配置文件这些东西得长期留着啊!所以 Docker 提供了两种「外挂存储」方式:卷(Volumes)绑定挂载(Bind Mounts),让数据能跳出容器独立存活。

二、卷(Volumes):Docker 帮你管数据

啥是卷?
简单说就是 Docker 在主机上专门划的一块「自留地」(一般在/var/lib/docker/volumes/),由 Docker 全权管理,咱们不用操心路径和权限,只管拿来用。

怎么用?

  1. 先创建一个卷:
docker volume create 我的数据卷
  1. 启动容器时挂上它:
docker run -d --name 我的应用 -v 我的数据卷:/容器里的路径 镜像名

比如把卷挂到容器的/app/data,容器里存这儿的数据,就算容器删了,卷里的东西也还在~

为啥选它?
✅ 多个容器能共享一个卷,适合团队协作或多服务共用数据
✅ 备份迁移方便,Docker 自带工具支持
✅ 不用担心主机目录结构变了影响挂载(比如换台电脑也能用)

小技巧
给卷加个标签,方便管理一堆卷时区分:

docker volume create --label 项目=我的网站 网站数据卷

三、绑定挂载(Bind Mounts):直接挂钩主机文件

啥是绑定挂载?
把主机上的某个文件或文件夹,直接「粘」到容器里指定的位置。比如主机的/home/我的配置,挂载到容器的/app/config,改主机文件,容器里立马生效。

怎么用?
启动容器时指定主机路径和容器路径:

docker run -d --name 我的应用 -v /主机路径:/容器路径 镜像名

举个栗子:

  • Linux/Mac:-v /home/我/nginx.conf:/etc/nginx/nginx.conf
  • Windows:-v C:\Users\我\nginx.conf:/etc/nginx/nginx.conf

为啥选它?
✅ 改配置不用进容器,直接在主机编辑,实时生效
✅ 适合开发时挂载代码目录,改完代码容器里立马更新
✅ 性能好,没有额外开销

注意点
⚠️ 主机路径必须存在,不然 Docker 会自动建个目录(可能出问题)
⚠️ 路径别写错!Windows 用\的话记得写成\\,或者直接用/更稳妥

四、进阶:用 Docker Compose 批量管理

多容器应用(比如前端 + 数据库)的话,用docker-compose.yml配置更方便。举个例子:

version: '3'
services:
  网站:
    image: nginx
    volumes:
      - 网站数据卷:/usr/share/nginx/html  # 卷
      - ./nginx.conf:/etc/nginx/nginx.conf:ro  # 只读绑定挂载(:ro表示只读)
  数据库:
    image: postgres
    volumes:
      - 数据库卷:/var/lib/postgresql/data  # 卷
      - ./初始化.sql:/docker-entrypoint-initdb.d/初始化.sql  # 绑定挂载

volumes:
  网站数据卷:
  数据库卷:

启动只需docker-compose up -d,卷和挂载全搞定~

五、避坑指南 & 最佳实践

  1. 选卷还是绑定挂载?
    长期存数据、多容器共享 → 用卷;临时开发、改配置 → 用绑定挂载。
  2. 备份很重要!
    卷备份:
docker run --rm -v 我的卷:/数据 -v $(pwd):/备份 busybox tar cvf /备份/备份.tar /数据
  1. 删卷删不掉?
    先检查有没有容器在用,用docker volume rm -f 卷名强制删。
  2. 权限问题?
    绑定挂载时,确保主机目录权限对容器内用户开放(比如chmod 777临时测试,生产环境按需调整)。

数据管理是 Docker 的核心技能,卷和绑定挂载看似简单,用好了能省超多事。下次部署应用时,别再让数据「裸奔」啦~ 😉

END
最后修改:2025 年 08 月 05 日
如果觉得我的文章对你有用,请随意赞赏