docker存储配置与管理--项目三

一、Docker存储概念

1、容器本地存储与Docke存储驱动

容器本地存储:每个容器都被自动分配了内部存储,即容器本地存储。采用的是联合文件系统。通过存
储驱动进行管理。
容器本地存储空间:分层结构构成,由一个可写容器层和若干只读的镜像层组成。
联合文件系统:Docker的一种底层技术,由存储驱动(Storage Driver)实现。相应的存储驱动有aufs、overlay、overlay2、devicemapper、btrfs、zfs、vfs等。
存储驱动:控制镜像和容器在 docker 主机上的存储和管理方式。
每个Docker主机只能选择一种存储驱动,不能为每个容器选择不同的存储驱动。

(1)查看主机支持的存储驱动

语法:docker info

点击查看代码
 Storage Driver: overlay2 # 存储驱动是overlay2
 Backing Filesystem: xfs # 底层文件系统是xfs
 Supports d_type: true # 支持d_type
 Native Overlay Diff: true
 userxattr: false

(2)Linux发行版支持的存储驱动

您的操作系统和内核可能不支持每个存储驱动程序。
通常,以下配置适用于最新版本的Linux发行版:
image

(3)可支持的文件系统

关于Docker,备份文件系统是/var/lib/doker/所在的文件系统。某些存储驱动程序仅适用于特定的备份文件系统。
image

(4)更改现有的存储驱动

注意:

主机只能选择一个存储驱动。
系统版本和存储驱动的兼容问题。
更改存储驱动会使得现有的容器和镜像不可访问(原因:每种存储驱动存储镜像层的
位置是不同的)
但恢复存储驱动,可以再次访问之前的镜像和容器

2、容器和非持久化数据

非持久化数据:不需要保存的数据。容器本地存储中的数据属于非持久化数据。
容器创建时会创建非持久化存储,非持久化存储自动创建,从属于容器,生命周期与容器相同。删除容器也会删除全部非持久化数据。
非持久化数据存在问题:

  1. 这类数据从属于容器,生命周期与容器相同,会随着容器的删除而被删除.(易丢失)
  2. 当该容器不再运行时,数据不会持久保存,如果另一个进程需要,则可能很难从该
    容器中获取数据。(难获取)
  3. 容器的可写层与运行容器的Docker主机紧密耦合,无法轻松地将数据转移到其他位
    置。(难转移)
  4. 写入容器的可写层需要Docker存储驱动管理文件系统。存储驱动使用Linux内核提供的联合文件系统,其性能不如直接写入主机文件系统的Docker卷。(读写性能差)

3、容器和持久化数据

持久化数据:需要保存的数据。例如:日志、业务数据、客户信息等有用的数据。
外部存储:Docker通过将主机中的文件系统挂载到容器中供容器存取,从而实现持久化数据存储。
容器持久化数据存储方式:Docker目前支持卷、绑定挂载,这两种挂载类型实现容器的持久化。
卷(数据卷):Docker中进行持久化数据存储的最佳方式。本质是Docker主机文件系统中的目录或文件直接挂载到容器的文件系统中。
特点:

1.卷和容器是解耦的,可以独立地创建并管理卷
2.卷不与容器的生命周期绑定(容器的停止删除和卷无关)
3.可以将任意数量的卷装入容器,多个容器也可以共享一个或多个卷(多对多关系)

4、挂载类型

往容器中挂载的外部文件系统主要有:卷、绑定挂载、tmpfs挂载。无论哪种挂载,对容器内部来说是一样的,都会显示为文件或目录。

(1)卷

卷是Docker持久化存储数据的最佳方式。卷支持使用卷驱动,可以让用户将数据存储在远程主机或云提供商处等。

卷存储在主机文件系统中由Docker管理的位置,在Linux主机上该位置默认是
/var/lib/docker/volumes 目录。

可以以命名方式或匿名方式挂载卷:

  1. 匿名卷(Anonymous Volumes):首次挂载容器未指定名称,Docker为其随机指定一个唯一名称。
  2. 命名卷(Named Volumes):指定明确名称,和匿名卷其他特性相同。

卷适合以下应用场景:

  1. 在多个正在运行的容器之间共享数据。(数据共享)
  2. 当Docker主机不能保证具有特定目录结构时,卷有助于将Docker主机的配置与容器运行时解耦。(构建新目录与主机不同)
  3. 当需要将容器的数据存储到远程主机或云提供商处,而不是本地时。(可以远程挂载卷,公有云、灾备等场景)
  4. 当需要在两个Docker主机之间备份、恢复或迁移数据时。(主机间备份迁移)

(2)绑定挂载

绑定挂载可以存储到主机系统的任意位置,甚至会存储到一些重要的系统文件或目录中。
特点:

  1. 主机上进程或容器可以随时修改。
  2. 相比卷,功能更受限、性能更高。
  3. 绑定挂载运行访问敏感文件。

绑定挂载适合以下应用场景。

  1. 在主机和容器之间共享配置文件。
  2. 在Docker主机上的开发环境和容器之间共享源代码或构建工件。
  3. 当Docker主机上的目录结构保证与容器要求的绑定挂载一致时。

(3)tmpfs挂载

tmpfs挂载仅限于运行Linux操作系统的Docker主机使用,它只存储在主机的内存中,不会被写到主机的文件系统中,因此不能持久保存容器的应用数据。

在不需要将数据持久保存到主机或容器中时,tmpfs挂载最合适。

如果容器产生了非持久化数据,那么可以考虑使用tmpfs挂载避免将数据永久存储到任何位置,并且通过避免写入容器的可写层来提高容器的性能。

二、Docker卷管理

docker volume 是Docker卷的管理命令。

创建卷的时候主机上的Docker根目录(linux默认是/var/lib/docker)下的volumes子目录内会生成一个以卷名命名的子目录,这个子目录里面再创建一个_data的子目录作为卷的数据存储路径。卷名必须唯一,不同的卷驱动不能使用相同的卷名。

1、创建卷

语法:docker volume create 卷名
选项:
-d //说明卷驱动名称(默认是'local') --label list //设置卷元数据
-o //设置驱动特殊选项
案例1:创建tmpfs卷,大小100m,uid为1000
image
案例2:创建匿名卷
语法:ddocker volume create

2、查看卷列表

使用 docker volume ls 命令列出当前的卷。

3、查看卷详细信息

使用 docker volume inspect 命令查看卷详细信息。包含卷在Docker主机文件系统中的具体位置。

4、删除卷

使用 docker volume rm 删除指定卷(不能删除正在被容器使用的卷)。
使用 docker volume prune 删除未被容器或服务使用的所有卷。
使用 dicker volume rm 删除未被使用的卷或空白卷

语法:docker volume rm 卷名 //删除指定卷
选项: -f //强制删除

三、容器文件系统挂载

使用 docker run 或 docker create 命令的相关选项将外部的文件系统挂载到容器中。
早期版本:

  1. 卷和绑定挂载都可以通过 -v 和 --mount 选项挂载到容器中,主要是两者的语法的细微区别。
  2. -v 用于独立容器, --mount 用于集群服务。
  3. tmpfs挂载可以使用 --tmpfs 选项。

docker 17.06或更高版本:

  1. 建议所有的容器或服务,绑定挂载、卷、tmpfs都使用 --mount 选项。(语法清晰、定制详细)
  2. --mount 选项也可以用于独立容器。

-v 和 --mount 的区别:

  1. -v 语法是将选项组合在一个字段中, --mount 的语法是将它们分开。
  2. --mount 采用键值对写法支持更多的设置选项, -v 写法更加简洁。

1、-v(--volume)选项

[root@hqs ~]# docker run(create)
-v, 【卷】:【容器挂载目的地】:【读写权限】

第一个host-src字段表示挂载源,来自主机的文件系统,为绝对路径或名称变量。

第二个container-dest字段表示挂载目标,即容器的挂载点,可以是目录或文件路径(绝对路径)

第三个options字段可选,以逗号分隔选项列表:
如:[rw|ro], [z|Z], [[r]shared|[r]slave|[r]p
rw:读写模式??
ro:只读模式
nocopy:禁止自动复制到卷存储地址

注意:

1.可以挂载主机现有的目录文件,如果不存在,则自动创建
2.mount选项则不可以自动创建目录文件

案例:
image

2.--mount 选项

绑定挂载、卷、tmpfs类型都使用 --mount 选项。
--mount 选项的参数由多个由逗号分隔的键值对组成

特殊键如下:

type:指定要挂载的类型,值可以是bind(绑定挂载)volume(卷)或tmpfs。

source(或src):指定挂载源

destination(或dst、target):指定挂载目标,即容器中的挂载点,必须采用绝对路径的形式

readonly:指定只读选项,表示源以只读方式挂载到容器中。

其他键:可以被多次指定,由若干键值对组成。卷和绑定挂载有不同的键。

注意:
1.指定主机现有的卷,如果没有则是自动创建卷
2.如果将一个空白的卷挂载到容器的文件目录中,会将里面的文件复制到卷中
3.如果挂载卷时,没有指定卷名称,则会生成一个匿名卷
4.当挂载主机目录文件时,不可以自动生成目录文件。

绑定卷案例:

image

绑定挂载案例:

注意:挂载指定主机文件,为绝对路径
image

3、备份、恢复和迁移数据卷

可以通过卷容器(Volume Container)实现卷的备份、恢复和迁移。
卷容器(数据卷容器):一种特殊的容器,专门用来将卷(或绑定挂载)提供给其他容器挂载。
--volumes-from 选项,创建容器时使用这个选项:

  1. 可基于 卷容器 创建一个新的容器;
  2. 新容器挂载 卷容器 提供的卷。

创建卷容器dbstore,该卷容器挂载一个匿名卷

[root@hqs tmp]# docker create -v /dbdata --name dbstore busybox /bin/sh

总结:

1.如果将主机上的目录绑定挂载到容器上的非空目录,则容器载的目录中的现有内容会被绑定挂载(主机上的目录)所遮盖。没有删除,只是被挂载期间无法访问
2. 无论主机上的目录是否为空,绑定挂载到容器中的非空目都会发生被遮盖的情况。

posted @ 2024-04-26 11:40  在睡觉24  阅读(15)  评论(0编辑  收藏  举报