
- 命名卷(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 虚拟化设置。
- Linux:
- 这些卷独立于项目目录,数据不会存储在运行
docker-compose up
的当前目录下。
- 绑定挂载(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
- 相比之下,
mysql_data:/var/lib/mysql
(没有./
)是一个命名卷,数据存储在 Docker 的内部卷存储路径,而不是项目目录。
- 配置中的具体含义:
mysql_data:/var/lib/mysql
:mysql_data
:Docker 管理的命名卷,持久化存储 MySQL 数据。/var/lib/mysql
:容器内的路径,MySQL 存储数据库文件的位置。
- 数据持久化在
mysql_data
卷中,即使容器被删除,数据仍保留在 Docker 的卷存储路径。
- 如何确认卷的位置?
- 查看所有卷:
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 删除 | 删除目录即可 |
适用场景 | 生产环境,需集中管理和持久化 | 开发/测试,需直接访问数据或便于调试 |
注意事项
- 命名卷的持久性:
- 使用
mysql_data
命名卷,数据在docker-compose down
时保留,除非显式删除卷(docker-compose down -v
)。 - 确认卷是否正确挂载:
bash docker inspect mysql_container
检查Mounts
部分,确认mysql_data
挂载到/var/lib/mysql
。
- 绑定挂载的权限:
- 使用
./mysql_data
时,确保宿主机目录有适当权限(MySQL 需要写权限):bash mkdir mysql_data chmod -R 777 mysql_data
- MySQL 容器可能以非 root 用户运行,需确保目录权限与容器用户兼容。
- Podman 兼容性:
- Podman 也支持命名卷和绑定挂载,行为与 Docker 一致。
- 命名卷存储在 Podman 的卷路径(通常
~/.local/share/containers/storage/volumes
或/var/lib/containers/storage/volumes
)。 - 绑定挂载(如
./mysql_data
)存储在项目目录,与 Docker 相同。
- 备份与迁移:
- 命名卷:使用
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 管理路径。
如果你希望在项目目录下存储数据,建议切换到绑定挂载,并确保目录权限正确!