在Docker中,数据卷挂载是实现容器与宿主机之间数据持久化和共享的关键技术
1. 数据卷挂载的三种方式
- 绑定挂载(Bind Mount):直接将宿主机目录映射到容器。
- Docker管理卷(Volume):由Docker自动创建和管理的存储卷。
- 临时文件系统(tmpfs):数据仅存储在内存中(本文不展开)。
2. 绑定挂载(Bind Mount)
# 将宿主机的 `/host/path` 目录挂载到容器的 `/container/path`
docker run -v /host/path:/container/path image_name
# 使用更明确的 --mount 参数
docker run --mount type=bind,source=/host/path,target=/container/path image_name
注意事项
- 如果宿主机目录不存在,Docker会自动创建,但可能需要处理权限问题。
- 权限问题:若容器内进程无写权限,可尝试以下方法:
- 在宿主机修改目录权限:
chmod 777 /host/path
- 启动容器时指定用户:
docker run -u root ...
- 在宿主机修改目录权限:
3. Docker管理卷(Volume)
创建并挂载卷
# 创建具名卷
docker volume create my_volume
# 挂载卷到容器
docker run -v my_volume:/container/path image_name
# 或让Docker自动生成匿名卷(卷名随机)
docker run -v /container/path image_name
管理卷
# 查看所有卷
docker volume ls
# 查看卷详细信息
docker volume inspect my_volume
# 删除未使用的卷
docker volume prune
# 删除特定卷
docker volume rm my_volume
4. 实战示例:Nginx挂载网页目录
# 创建宿主机目录(假设当前目录为 ~/myapp)
mkdir html
# 运行Nginx并挂载目录
docker run -d -p 80:80 -v $(pwd)/html:/usr/share/nginx/html nginx
- 在宿主机
~/myapp/html
中放置index.html
,容器会实时加载该文件。
5. 数据卷容器(Legacy方式,仅供参考)
# 创建数据卷容器
docker create -v /data --name mydata busybox
# 其他容器通过 --volumes-from 共享卷
docker run --volumes-from mydata image_name
6. 关键区别总结
方式 | 数据位置 | 管理方 | 适用场景 |
---|---|---|---|
绑定挂载 | 宿主机指定路径 | 用户 | 开发环境,需直接修改文件 |
Docker管理卷 | /var/lib/docker/volumes/ | Docker | 生产环境,数据持久化 |
数据卷容器 | 依赖其他容器 | Docker | 旧版Docker共享数据(不推荐) |
7. 常见问题
- Q: 容器内看不到挂载的文件?
- A: 检查宿主机目录路径是否正确,或是否因权限问题导致挂载失败。
- Q: 如何备份数据卷?
- A: 使用
docker run --volumes-from 容器名 -v $(pwd):/backup busybox tar cvf /backup/data.tar /data
将卷数据打包到宿主机。
- A: 使用