Docker 数据卷(Volume)详细介绍
1. 什么是 Docker 数据卷?
Docker 数据卷(Volume)是一种用于 持久化数据 和 容器间数据共享 的机制。由于容器的存储是临时的,容器删除后其中的数据会丢失,因此使用数据卷可以保证数据不会随着容器的销毁而丢失。
2. 数据卷的特点
- 持久化存储:容器删除后,数据卷仍然存在,不会随容器删除而丢失。
- 容器间共享:多个容器可以挂载同一个数据卷,实现数据共享。
- 高性能:相比于
bind mount
(绑定挂载),数据卷由 Docker 管理,性能更优。 - 独立于文件系统:可以在不同的操作系统或存储驱动(如 overlay2、aufs)间使用。
3. 常见的 Docker 数据卷操作
3.1 创建和管理数据卷
(1)创建数据卷
docker volume create my_volume
这个命令会创建一个名为
my_volume
的数据卷,并由 Docker 管理。
(2)查看所有数据卷
docker volume ls
列出当前所有的 Docker 数据卷。
(3)查看数据卷详细信息
docker volume inspect my_volume
显示
my_volume
的详细信息,包括存储位置、驱动等。
(4)删除数据卷
docker volume rm my_volume
删除
my_volume
数据卷。注意:如果某个容器正在使用该数据卷,删除会失败。
(5)清理未使用的数据卷
docker volume prune
删除所有未被任何容器使用的 Docker 数据卷。
4. 在容器中使用数据卷
4.1 使用 --mount
挂载数据卷
推荐使用 --mount
,它的语法清晰,适用于复杂场景:
docker run -d --name my_container --mount source=my_volume,target=/app busybox
source=my_volume
:使用名为my_volume
的 Docker 数据卷。target=/app
:把my_volume
挂载到容器内的/app
目录。
4.2 使用 -v
挂载数据卷
-v
语法较老,但仍然常用:
docker run -d --name my_container -v my_volume:/app busybox
作用与 --mount
相同,但 -v
不支持某些高级选项(如 readonly
)。
5. 绑定挂载(Bind Mounts)
除了 Docker 管理的数据卷,Docker 还支持将宿主机目录直接挂载到容器中:
docker run -d --name my_container -v /host/path:/container/path busybox
这种方式适用于:
- 开发环境(宿主机和容器同步文件)。
- 日志文件存储(容器删除后,日志仍然保留)。
⚠ 注意:Bind Mount 依赖于宿主机的路径,可能会导致跨平台兼容性问题。
6. 只读挂载
为了提高安全性,可以使用 :ro
(只读)挂载:
docker run -d --name my_container -v my_volume:/app:ro busybox
容器可以读取
/app
目录下的内容,但不能修改。
同样,使用 --mount
:
docker run -d --name my_container --mount source=my_volume,target=/app,readonly busybox
7. 共享数据卷
多个容器可以共享同一个数据卷:
docker run -d --name container1 -v my_volume:/app busybox
docker run -d --name container2 -v my_volume:/app busybox
container1
和container2
都可以访问/app
目录,实现数据共享。
8. 备份和恢复数据卷
8.1 备份数据卷
docker run --rm -v my_volume:/data -v $(pwd):/backup busybox tar -czf /backup/backup.tar.gz -C /data .
-v my_volume:/data
:将my_volume
挂载到容器的/data
。-v $(pwd):/backup
:把宿主机当前目录挂载到容器的/backup
。tar -czf
:打包/data
目录下的内容,生成backup.tar.gz
。
8.2 恢复数据卷
docker run --rm -v my_volume:/data -v $(pwd):/backup busybox tar -xzf /backup/backup.tar.gz -C /data
该命令会把
backup.tar.gz
中的数据解压到my_volume
里。
9. 删除数据卷
9.1 删除单个数据卷
docker volume rm my_volume
9.2 删除未被使用的所有数据卷
docker volume prune
这个命令会删除所有没有被任何容器使用的 Docker 数据卷。
10. 数据卷与 Docker Compose
在 docker-compose.yml
文件中,可以定义数据卷:
version: '3'
services:
app:
image: busybox
volumes:
- my_volume:/app
volumes:
my_volume:
然后运行:
docker-compose up -d
my_volume
会自动创建并挂载到/app
。
11. 总结
重点知识回顾
关键点 | 说明 |
---|---|
docker volume create my_volume | 创建数据卷 |
docker volume ls | 查看所有数据卷 |
docker volume inspect my_volume | 查看数据卷详情 |
docker volume rm my_volume | 删除数据卷 |
docker volume prune | 清理未使用的数据卷 |
docker run -v my_volume:/app busybox | 挂载数据卷 |
docker run -v /host/path:/container/path busybox | 绑定挂载 |
docker run -v my_volume:/app:ro busybox | 只读挂载 |
docker-compose.yml | 在 Docker Compose 中使用数据卷 |
tar -czf 和 tar -xzf | 备份和恢复数据卷 |
Docker 数据卷是 持久化数据 和 容器间数据共享 的关键工具,合理使用可以大大提高数据管理的灵活性和安全性。对于使用数据卷的必要性和好处,请阅读文章:docker数据卷的好处与必要性