生产环境存数据首选 Volume,开发调试代码同步用 Bind Mount,别混用。
先说结论:生产环境持久化数据推荐用 Volume,开发环境代码同步适合用 Bind Mount。
- 适合:Volume 用于数据库、日志等需要持久化且由 Docker 管理的数据;Bind Mount 用于开发时宿主机代码实时同步到容器。
- 重点看:Volume 由 Docker 管理存储在特定目录(通常 /var/lib/docker/volumes),Bind Mount 由用户指定宿主机任意路径。
- 别忽略:Bind Mount 依赖宿主机路径结构,跨平台兼容性低,且可能存在权限或安全风险。
核心命令与管理
创建并使用 Volume:
docker run -d `--name` myapp -v myvolume:/app/data nginx使用 Bind Mount 挂载本地目录:
docker run -d `--name` devapp -v $(pwd):/app nginxVolume 常用管理命令:
docker volume ls # 查看所有卷
docker volume inspect myvolume # 查看卷详情
docker volume prune # 清理未使用的卷生产场景:Volume 持久化与备份
1. 部署数据库
docker volume create db-data
docker run -d `--name` mysql -v db-data:/var/lib/mysql mysql:8.02. 数据备份与恢复
备份数据卷到宿主机当前目录:
docker run `--rm` -v db-data:/data -v $(pwd):/backup alpine tar czf /backup/backup.tar.gz -C /data .恢复数据到新的数据卷:
docker volume create db-data-new
docker run `--rm` -v db-data-new:/data -v $(pwd):/backup alpine tar xzf /backup/backup.tar.gz -C /data开发场景:Bind Mount 与权限
1. 代码同步
确保宿主机目录存在,挂载到容器:
mkdir -p /home/user/app
docker run -d `--name` devapp -v /home/user/app:/app nginx2. 权限与 SELinux 配置
若宿主机开启 SELinux,挂载目录可能因权限被拒绝,需添加 :z 或 :Z 后缀:
docker run -d `--name` devapp -v /home/user/app:/app:z nginx若容器内进程非 root 运行,需提前调整宿主机目录权限:
chown -R 1000:1000 /home/user/app验证挂载是否生效
使用 inspect 命令查看挂载详情:
docker inspect <容器名> | grep -A 10 Mounts在宿主机对应路径写入文件,检查容器内是否可见:
echo "test" > /home/user/app/test.txt
docker exec devapp cat /app/test.txt常见坑与安全风险
- 路径存在性:Bind Mount 路径若不存在,Docker 可能会自动创建目录,但所有者通常为 root,导致容器内写入权限问题。
- 安全风险:严禁使用 Bind Mount 挂载宿主机敏感目录(如 /etc, /root, /usr),防止容器逃逸或敏感信息泄露。
- 跨平台兼容:Bind Mount 路径格式依赖操作系统(Windows 与 Linux 不同),迁移需注意。
- Volume 管理:Volume 数据存储在 Docker 管理目录,直接操作宿主机文件需谨慎,建议使用 docker 命令管理。