Docker Compose配置命名卷(named volume)或绑定挂载(Bind Mount)

  1. 命名卷(Named Volume)
  • docker-compose.yml 中,mysql_data 是一个命名卷,定义在文件底部的 volumes 顶级键中:
    yaml volumes: mysql_data:
  • 命名卷由 Docker 管理,数据存储在 Docker 的默认卷存储目录,通常是:
    • Linux: /var/lib/docker/volumes/mysql_data/_data
    • Windows/Mac(Docker Desktop): 类似路径,具体取决于 Docker 虚拟化设置。
  • 这些卷独立于项目目录,数据不会存储在运行 docker-compose up 的当前目录下。
  1. 绑定挂载(Bind Mount)与命名卷的区别
  • 如果你希望卷存储在当前项目目录的相对路径下,需要使用 绑定挂载,例如: “`yaml volumes:
    • ./mysql_data:/var/lib/mysql
      “`
    • ./mysql_data 表示当前项目目录下的 mysql_data 文件夹(相对路径)。
    • Docker 会将宿主机的 ./mysql_data 目录挂载到容器的 /var/lib/mysql 路径。
    • 如果 ./mysql_data 不存在,Docker 会自动创建该目录。
  • 相比之下,mysql_data:/var/lib/mysql(没有 ./)是一个命名卷,数据存储在 Docker 的内部卷存储路径,而不是项目目录。
  1. 配置中的具体含义
  • mysql_data:/var/lib/mysql
    • mysql_data:Docker 管理的命名卷,持久化存储 MySQL 数据。
    • /var/lib/mysql:容器内的路径,MySQL 存储数据库文件的位置。
  • 数据持久化在 mysql_data 卷中,即使容器被删除,数据仍保留在 Docker 的卷存储路径。
  1. 如何确认卷的位置
  • 查看所有卷:
    bash docker volume ls
    输出可能包含 mysql_data(完整名称可能是 project_mysql_data,其中 project 是项目目录名)。
  • 检查卷的存储路径:
    bash docker volume inspect mysql_data
    输出会显示 Mountpoint,例如:
    json { "Name": "mysql_data", "Mountpoint": "/var/lib/docker/volumes/mysql_data/_data" }
  • Mountpoint 是宿主机上卷数据的实际存储路径。

命名卷 vs. 绑定挂载的选择

特性命名卷(如 mysql_data)绑定挂载(如 ./mysql_data)
存储位置Docker 管理路径(/var/lib/docker/volumes/项目目录下的相对路径
管理方式通过 docker volume 命令管理直接在文件系统管理,易于访问和备份
可移植性更适合跨主机迁移(通过卷导出/导入)依赖宿主机路径,可能不适合跨主机
清理需用 docker volume rm 删除删除目录即可
适用场景生产环境,需集中管理和持久化开发/测试,需直接访问数据或便于调试

注意事项

  1. 命名卷的持久性
  • 使用 mysql_data 命名卷,数据在 docker-compose down 时保留,除非显式删除卷(docker-compose down -v)。
  • 确认卷是否正确挂载:
    bash docker inspect mysql_container
    检查 Mounts 部分,确认 mysql_data 挂载到 /var/lib/mysql
  1. 绑定挂载的权限
  • 使用 ./mysql_data 时,确保宿主机目录有适当权限(MySQL 需要写权限):
    bash mkdir mysql_data chmod -R 777 mysql_data
  • MySQL 容器可能以非 root 用户运行,需确保目录权限与容器用户兼容。
  1. Podman 兼容性
  • Podman 也支持命名卷和绑定挂载,行为与 Docker 一致。
  • 命名卷存储在 Podman 的卷路径(通常 ~/.local/share/containers/storage/volumes/var/lib/containers/storage/volumes)。
  • 绑定挂载(如 ./mysql_data)存储在项目目录,与 Docker 相同。
  1. 备份与迁移
  • 命名卷:使用 docker volume inspect 找到数据路径,或导出卷:
    bash docker run --rm -v mysql_data:/volume -v $(pwd):/backup busybox tar cvf /backup/mysql_data.tar /volume
  • 绑定挂载:直接备份 ./mysql_data 目录:
    bash tar cvf mysql_data.tar mysql_data

总结

  • volumes: mysql_data:/var/lib/mysql 使用的是 命名卷,存储在 Docker 的默认卷路径(例如 /var/lib/docker/volumes/mysql_data/_data),而不是当前项目目录的相对路径。
  • 若需存储在当前目录,改用绑定挂载(如 ./mysql_data:/var/lib/mysql),并移除 volumes 顶级定义。
  • 命名卷适合生产环境,绑定挂载适合开发/测试,便于直接访问数据。
  • 在上述 WordPress + MySQL 配置中,命名卷 (mysql_data, wordpress_data) 提供持久化存储,运行 docker-compose up -d 即可启动服务,数据安全存储在 Docker 管理路径。

如果你希望在项目目录下存储数据,建议切换到绑定挂载,并确保目录权限正确!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注