数据卷
1.什么是数据卷
容器卷就是将目录或者文件,存在一个或多个容器中,由docker挂载到容器
目的:数据的持久化,完全独立于容器的生命周期,因此docker不会在删除容器时删除其挂载的数据卷
特点:
数据卷可以在容器之间共享数据
卷中更改可以直接生效
数据卷更改不会包含在镜像的更新中
数据卷的生命周期一直持续到没有容器使用它位置
特点:
1.【数据卷】可以在容器之间共享和重用
2.对【数据卷】的修改立马会生效
3.对【数据卷】的更新不会影响镜像
4.【数据卷】默认存在,即便容器被删除
2.创建数据卷
创建后的数据卷默认存放目录:
/var/lib/docker/volume/<数据卷名称>/_data
docker volume create <数据卷名称>
3.查看数据卷
3-1.查看全部
docker volume ls
3-2.查看单个信息
docker volume inspect <数据卷名称>
4.删除数据卷
docker volume rm <数据卷名称>
5.清除未使用数据卷
5.清除未使用数据卷
docker volume prune
6.挂载方式
⚠️容器卷需要加入
--privileged=true
解决Docker挂载主机目录访问权限不够如果镜像的
Dockerfile
设置了VOLUME
,那么创建容器不指定数据时,就是匿名数据卷所有docker容器的数据卷,没有指定目录的情况下都是在目录
/var/lib/docker/volumes/{xxx}/_data
-v 容器内路径 # 匿名挂载
-v 数据卷名:容器内路径 # 具名挂载
-v 宿主机路径:容器内路径 # 指定路径挂载
--privileged=true # 增加root权限
6-1.匿名挂载
直接把容器内的路径挂载到匿名数据卷上
使用匿名挂载时,在容器删除后,Docker不会自动删除相应的数据卷
案列
docker run -d -v /etc nginx
docker inspect 8a3ee6b5214e
[
...,
"Mounts": [
{
"Type": "volume",
"Name": "702188ede9b6318eb4846606b5571db03999189b7de88225cbd41e9066ee2b9a",
"Source": "/var/lib/docker/volumes/702188ede9b6318eb4846606b5571db03999189b7de88225cbd41e9066ee2b9a/_data",
"Destination": "/etc",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
...
]
清理匿名数据卷
手动清理
如果没有一个容器使用该数据卷,那么可以手动清除该数据卷
docker volume prune
自动清理
docker run
的时候指定,--rm
参数启动容,在容器退出后,Docker会自动清理匿名数据卷
创建容器
docker run -it --rm --name nginx_01 -v /etc nginx bash
root@c58277561091:/#
查看数据卷
另一个终端查看
docker volume ls
DRIVER VOLUME NAME
local ed9f91c43ee04bb116e5bee8f125531eb4fdf463e517342ca10d8480bf48b5e2
退出容器
root@c58277561091:/# exit
exit
再次查看数据卷
docker volume ls
DRIVER VOLUME NAME
6-2.具名挂载
需要创建数据卷才能挂载
创建数据卷
docker volume create c1
查看数据卷
docker volume ls
DRIVER VOLUME NAME
local 702188ede9b6318eb4846606b5571db03999189b7de88225cbd41e9066ee2b9a
local c1
local dee9da5f8f214f388be4ca286b075eff96892c0b7a55caf01869ca1eac4cbc90
local f6fdf5982acb94704c9b66ff6ee9a538120f31487e5159177879cb27f210cbad
使用数据卷
docker run -d -v c1:/etc nginx
查看容器信息
docker inspect 8e709fa4371c
[
...,
"Mounts": [
{
"Type": "volume",
"Name": "c1",
"Source": "/var/lib/docker/volumes/c1/_data",
"Destination": "/etc",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
...
]
6-3.指定路径挂载
挂载案列
把容器内
/etc
目录挂载到本地Users/lxd670/e
目录
docker run -d -v /Users/lxd670/e:/etc nginx
查看容器信息
docker inspect f3285f6e8e76
[
...,
"Mounts": [
{
"Type": "bind",
"Source": "/Users/lxd670/e",
"Destination": "/etc",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
...
]
6-4.匿名挂载、具名挂载、指定路径挂载区别
匿名挂载
1.使用匿名挂载时,不需要为数据卷指定名称或路径。只需在容器启动时使用-v或--volume参数指定挂载的目标路径。
2.Docker会为每个匿名挂载自动生成一个唯一的目录,并将其挂载到容器中。这样的数据卷是匿名的,因为您不会知道其具体路径,无法在其他容器中重用它。
3.匿名挂载适用于临时性的数据存储,比如容器间的共享数据,或者只需要在当前容器的生命周期内使用的数据。
具名挂载
1.具名挂载需要为数据卷指定一个名称,然后在容器启动时使用-v或--volume参数指定挂载的目标路径和名称。
2.Docker会将该具名挂载与容器关联起来,以便在其他容器中重用该数据卷。
3.具名挂载的数据卷可以在多个容器之间共享,并且可以在容器启动时指定特定的数据卷名称,以便在多个容器中使用相同的数据。
指定路径挂载
1.指定路径挂载允许将主机上的特定路径挂载到容器中,而不是使用Docker管理的数据卷。
2.可以使用-v或--volume参数指定挂载的路径,格式为<host_path>:<container_path>。
3.被指定路径挂载的数据会直接与主机上的路径关联,容器对主机上的数据进行读写操作。
4.指定路径挂载适合需要与主机共享文件或目录的情况,但可能会导致与主机紧密耦合,不具备可移植性。
7.数据卷读写权限
读写(rw)
和只读(ro)
7-1.读写
# 容器实例内部可读可写(默认)
docker run -it --privileged=true -v /tmp/aaa:/root/aaa centos:7 /bin/bash
# 两者相同
docker run -it --privileged=true -v /tmp/aaa:/root/aaa:rw centos:7 /bin/bash
7-2.只读
# 容器实例内部只读权限
docker run -it --privileged=true -v /tmp/aaa:/root/aaa:ro centos:7 /bin/bash
8.卷的继承和共享
8-1.命令
docker run -it --name n1 --privileged=true --volumes-from [继承的容器id/容器名] /bin/bash
8-2.案列
# 创建容器c1
docker run -it --name c1 --privileged=true -v /tmp/aaa:/root/aaa centos:7 /bin/bash
# 使容器c2继承c1的数据卷
docker run -it --name c2 --privileged=true --volumes-from centos_7_1 /bin/bash