docker 数据卷详解
docker 数据卷
参考:
docker volumes
1. 为什么需要数据卷?
一个容器运行一段时间,会产生一些数据,日志等,如果数据放到容器中,如果容器删除了,数据就没了。
2. 什么是数据卷?
可以将卷
理解为宿主机的目录
,当我们使用卷
绑定容器的目录
,可以理解为我们将宿主机的目录
和容器的目录
建立了映射关系。
比如:
容器的/test目录和宿主机的/test目录绑定;
在容器的/test目录新建A文件;
在宿主机的/test/A文件存在;
如果删除了容器,宿主机的/test/A文件依然存在;
3. 测试容器数据卷使用
首先创建一个docker volume
docker volume create testA
查看volume的信息
docker volume inspect testA
[
{
"CreatedAt": "2023-01-10T14:17:27Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/testA/_data",
"Name": "testA",
"Options": {},
"Scope": "local"
}
]
macbook找不到路径,是因为mac的docker是运行在虚拟中的,可以使用以下命令
docker run --pid=host --privileged -it --rm justincormack/nsenter1
数据卷的路径即为/var/lib/docker/volumes/testA/_data
启动一个容器,绑定该数据卷
docker run -it -d --volume=testA:/testA --name test-volume1 centos:7
使用docker inspect 查看volume数据
"Mounts": [
{
"Type": "volume",
"Name": "test",
"Source": "/var/lib/docker/volumes/testA/_data",
"Destination": "/testA",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
4. 使用docker volume命令管理volume
- create:创建
- rm:删除
- ls:显示list
- inspect:显示详情
- prune:删除没有用到的volume
5. 使用docker run --volume 绑定数据卷
使用 --volume
映射卷
和容器目录
. 内容是 <卷>:<容器目录>:<Mode>
卷的形式:
- 为空,即为匿名挂载,会生成
/var/lib/docker/volumes/随机字符串/_data
目录 - 为不加 / 的名称,即为具名挂载,比如:testA,会生成
/var/lib/docker/volumes/testA/_data
目录 - 为加 / 的名称,即为绑定挂载,比如:
/Users/wuqi/test
,即为本机的路径. (可以绑定文件和目录,卷只能绑定目录)
Mode:ro或者rw
如果没有目录,会自动创建一个新的目录。
一个卷可以同时被多个容器使用,docker run的时候加 --volumes-from
参数即可继承容器的volume并绑定。
6. 查看volume是否被使用
-
查看容器使用的volume
docker inspect testCcon -f '{{.Mounts}}'
-
查看volume被那些容器使用了
docker ps -a -f "volume=testA"
7. 匿名挂载和具名挂载的区别
加了 --rm ,当容器停止的时候匿名卷会自动删除
8. 使用docker commit
绑定volume:
docker run -d --volume=/Users/wuqi/test1:/test1 --volume=test2:/test2 -it --name=centos-test centos
修改文件test1,和目录test2
vi test1
cd /test2
touch test2file
vi touch2file
使用commit提交这次修改
docker commit -a "qi.wu" -m "this is test file" centos-test qi.wu/centos:01
用提交的新image创建容器
docker run -it --rm qi.wu/centos:01
发现只有test1文件和test2目录
docker inspect 76b720a8f904 -f "{{.Mounts}}"
使用docker inspect发现没有绑定volume。这是因为卷的数据是独立于容器的,容器里只记录了卷操作,真正的数据修改是在宿主机上的。
9. 使用docker run --mount 命令绑定数据卷
跟使用--volume有同样的效果,使用key=>value形式,更清晰。
- type用于指定挂载类型,
volume
表示使用卷,bind
表示使用绑定挂载, - source参数指定对应的卷名,如果使用匿名卷,则省略source参数
- target参数用于指定将卷或者宿主机目录挂载到容器的哪个目录上,如果使用绑定挂载,source参数对应宿主机上的目录。
docker run -it -d --name=test-mount --mount type=volume,src=test1,dst=/data nginx
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码