什么是存储卷?
存储卷就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这就意味着,当我们在容器中的这个目录下写入数据时,容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录。在宿主机上的这个与容器形成绑定关系的目录被称作存储卷。
卷的本质是文件或者目录,它可以绕过默认的联合文件系统,直接以文件或目录的形式存在于宿主机上。
宿主机的 /data/web 目录与容器中的 /container/data/web 目录绑定关系,然后容器中的进程向这个目录中写数据时,是直接写在宿主机的目录上的,绕过了容器文件系统,与宿主机的文件系统建立关联关系,实现了宿主机和容器共享数据共享。让容器直接访问宿主机中的内容,也可以宿主机向容器写入内容,容器和宿主机的数据读写是同步的。
不好理解的话,可以将这个过程看作是在你的 Windows 电脑上插了个 U 盘。其实也没有什么不好理解的,可以先看看后面的实战部分再来理解。
为什么需要存储卷?
-
数据丢失问题
容器按照业务类型,总体可以分为两类:- 无状态的(数据不需要被持久化)
- 有状态的(数据需要被持久化)
显然,容器更擅长无状态应用。因为未持久化数据的容器根目录的生命周期与容器的生命周期一样,容器文件系统的本质是在镜像层上面创建的读写层,运行中的容器对任何文件的修改都存在于该读写层,当容器被删除时,容器中的读写层也会随之消失。虽然容器希望所有的业务都尽量保持无状态,这样容器就可以开箱即用,并且可以任意调度,但实际业务总是有各种需要数据持久化的场景,比如 MySQL、Kafka 等有状态的业务。因此为了解决有状态业务的需求,Docker 提出了卷(Volume)的概念。
-
性能问题
UnionFS 对于修改删除等,一般效率非常低,如果对一于 I/O 要求比较高的应用,使用 Docker 的联合文件系统可能就不是非常适合了!如 redis 在实现持久化存储时,在底层存储时的性能要求比较高。 -
宿主机和容器互访不方便
宿主机访问容器,或者容器访问要通过docker cp来完成,操作非常不方便。 -
容器和容器共享不方便
每个 Docker 容器在运行时都是隔离的,拥有自己独立的文件系统、进程空间和网络环境等。这种隔离性保证了容器的安全性和稳定性,但同时也带来了一些限制,如文件共享的不便。我们即使是使用docker cp命令也无法直接将文件从一个容器拷贝到另一个文件。
存储卷分类
目前 Docker 提供了三种方式将数据从宿主机挂载到容器中。
volume docker管理卷,默认映射到宿主机的/var/lib/docker/volumes目录下,只需要在容器内指定容器的挂载点是什么,而被绑定宿主机下的那个目录,是由 Docker 容器引擎 daemon 自行创建一个空的目录,或者使用一个已经存在的目录,与存储卷建立存储关系,这种方式极大解脱用户在使用卷时的耦合关系,缺陷是用户无法指定那些使用目录,适用于临时存储。bind mount绑定数据卷,映射到宿主机指定路径下,在宿主机上的路径要人工的指定一个特定的路径,在容器中也需要指定一个特定的路径,两个已知的路径建立关联关系。tmpfs mount临时数据卷,映射到于宿主机内存中,一旦容器停止运行,tmpfs mount会被移除,数据就会丢失,用于高性能的临时数据存储。

管理卷 Volume
Volume 命令操作
docker volume create
- 功能:创建存储卷。
- 语法:
docker volume create [OPTIONS] [VOLUME] - 参数:
- -d 或 –drive:用于指定创建数据卷时所使用的存储驱动。这个不用管使用默认的
local就行了。 - –label:该选项允许为存储卷添加元数据标签。这些标签是以键值对的形式存储的,可以用于标识、分类或过滤卷。通过给存储卷添加标签,你可以更灵活地管理和查询存储卷。
- 演示:
如下图,我们不指定创建的管理卷名称,Docker 会给我随机生成一个管理卷的名称。当我们指定创建出的管理卷的名称就使用自己指定的!我们在创建时指定的元数据标签可以通过 docker volume inspect 查看!其次,通过该命令还能查看挂载点,即 Docker 引擎自行创建的一个空目录,可以用于将来容器的绑定!

可以看到确实是一个空的目录:

docker volume inspect
- 功能:查看一个或者多个卷的详细信息。
- 语法:
docker volume inspect [OPTIONS] VOLUME [VOLUMES] - 参数:
- -f:指定返回的文件格式,例如:json。
- 演示:
通过docker volume inspect我们能看到卷的详细信息。包括:卷的创建时间,卷的驱动,卷的标签,卷的挂载点,卷的名字等等。

docker volume ls
-
功能:列出所有卷。
-
语法:
docker volume ls [OPTIONS] -
别名:
docker volume list -
参数:
- -f 或 –filter:按指定条件过滤。
- -q:仅显示名称。
- –format:指定返回的格式,如:json。
-
演示:
我们可以列出全部的卷,也可以按照条件筛选。


2251

被折叠的 条评论
为什么被折叠?



