数据卷

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
posted @ 2023-09-23 15:21  lxd670  阅读(47)  评论(0编辑  收藏  举报