Device Mapper 存储驱动程序(已弃用)

荒废的

Device Mapper 驱动程序已弃用, 并在 Docker Engine v25.0 中删除。如果您使用的是 Device Mapper, 在升级到 Docker 之前,您必须迁移到受支持的存储驱动程序 引擎 v25.0。阅读 Docker 存储驱动程序页面,了解支持的存储驱动程序。

Device Mapper 是一个基于内核的框架,它支持许多高级 Linux 上的卷管理技术。Docker 的devicemapper存储驱动程序 利用此框架的精简配置和快照功能 用于镜像和容器管理。本文引用 Device Mapper storage 驱动程序设置为devicemapper,内核框架作为 Device Mapper 进行。

对于支持它的系统,devicemapper支持包含在 Linux 内核。但是,需要特定的配置才能将其与 Docker。

devicemapper驱动程序使用专用于 Docker 的块设备,并在 块级别,而不是文件级别。这些设备可以通过以下方式进行扩展 将物理存储添加到您的 Docker 主机,它们的性能比使用 作系统 (OS) 级别的文件系统。

先决条件

  • devicemapper在 Docker Engine 上受支持 - 在 CentOS、Fedora 上运行的社区、 SLES 15、Ubuntu、Debian 或 RHEL。
  • devicemapper需要lvm2device-mapper-persistent-data包 进行安装。
  • 更改存储驱动程序会生成您已经拥有的任何容器 在本地系统上创建无法访问。用docker save要保存容器, 并将现有镜像推送到 Docker Hub 或私有存储库,因此您可以 无需稍后重新创建它们。

使用devicemapper存储驱动程序

在执行这些过程之前,您必须首先满足所有先决条件

配置loop-lvm测试模式

此配置仅适用于测试。这loop-lvmmode 使 使用“环回”机制,允许本地磁盘上的文件 读取和写入,就好像它们是实际的物理磁盘或块一样 装置。 但是,添加了环回机制,并与作系统交互 filesystem 层,这意味着 IO作可能很慢且占用大量资源。 使用环回设备也会引入争用条件。 但是,设置loop-lvm模式可以帮助识别基本问题(例如 缺少用户空间包、内核驱动程序等)在尝试更多 启用 需要复杂的设置direct-lvm模式。loop-lvmmode 应 因此,仅用于在配置之前执行基本测试direct-lvm.

对于生产系统,请参阅为生产配置 direct-lvm 模式

  1. 停止 Docker。

    $ sudo systemctl stop docker
    
  2. 编辑/etc/docker/daemon.json.如果尚不存在,请创建它。若 该文件为空,请添加以下内容。

    {
      "storage-driver": "devicemapper"
    }

    请参阅 daemon 参考文档中每个存储驱动程序的所有存储选项

    如果daemon.json文件包含格式错误的 JSON。

  3. 启动 Docker。

    $ sudo systemctl start docker
    
  4. 验证守护进程是否正在使用devicemapperstorage 驱动程序。使用docker info命令并查找Storage Driver.

    $ docker info
    
      Containers: 0
        Running: 0
        Paused: 0
        Stopped: 0
      Images: 0
      Server Version: 17.03.1-ce
      Storage Driver: devicemapper
      Pool Name: docker-202:1-8413957-pool
      Pool Blocksize: 65.54 kB
      Base Device Size: 10.74 GB
      Backing Filesystem: xfs
      Data file: /dev/loop0
      Metadata file: /dev/loop1
      Data Space Used: 11.8 MB
      Data Space Total: 107.4 GB
      Data Space Available: 7.44 GB
      Metadata Space Used: 581.6 KB
      Metadata Space Total: 2.147 GB
      Metadata Space Available: 2.147 GB
      Thin Pool Minimum Free Space: 10.74 GB
      Udev Sync Supported: true
      Deferred Removal Enabled: false
      Deferred Deletion Enabled: false
      Deferred Deleted Device Count: 0
      Data loop file: /var/lib/docker/devicemapper/data
      Metadata loop file: /var/lib/docker/devicemapper/metadata
      Library Version: 1.02.135-RHEL7 (2016-11-16)
    <...>
    

此主机正在运行loop-lvm模式,不支持 生产系统。这可以通过以下事实来证明:Data loop file以及Metadata loop file位于/var/lib/docker/devicemapper.这些是环回挂载的 稀疏文件。对于生产系统,请参阅为生产配置 direct-lvm 模式

为生产环境配置 direct-lvm 模式

使用devicemapper存储驱动程序必须使用direct-lvm模式。此模式使用块设备创建精简池。这比 使用 Loopback 设备,更有效地使用系统资源,并阻止 设备可以根据需要增长。但是,需要的设置比loop-lvm模式。

满足先决条件后,请按照以下步骤 将 Docker 配置为使用devicemapper存储驱动程序direct-lvm模式。

警告

更改存储驱动程序会生成您已经拥有的任何容器 在本地系统上创建无法访问。用docker save要保存容器, 并将现有镜像推送到 Docker Hub 或私有存储库,因此您不会 需要稍后重新创建它们。

允许 Docker 配置 direct-lvm 模式

Docker 可以为您管理块设备,简化direct-lvm模式。这仅适用于新的 Docker 设置。您只能使用 单块设备。如果您需要使用多个块存储设备,请手动配置 direct-lvm 模式。 以下新配置选项可用:

选择描述必填?违约
dm.directlvm_device要配置的块存储设备的路径direct-lvm.是的dm.directlvm_device="/dev/xvdf"
dm.thinp_percent用于存储传入的块存储设备的空间百分比。95dm.thinp_percent=95
dm.thinp_metapercent用于传入块存储设备中的元数据存储的空间百分比。1dm.thinp_metapercent=1
dm.thinp_autoextend_thresholdlvm 何时应自动扩展精简池的阈值(占总存储空间的百分比)。80dm.thinp_autoextend_threshold=80
dm.thinp_autoextend_percent触发 autoextend 时增加精简池的百分比。20dm.thinp_autoextend_percent=20
dm.directlvm_device_force是否格式化块设备,即使其上已存在文件系统。如果设置为false如果存在文件系统,则会记录错误,并且文件系统保持不变。dm.directlvm_device_force=true

编辑daemon.json文件并设置适当的选项,然后重新启动 Docker 以使更改生效。以下内容daemon.jsonconfiguration 设置所有 选项。

{
  "storage-driver": "devicemapper",
  "storage-opts": [
    "dm.directlvm_device=/dev/xdf",
    "dm.thinp_percent=95",
    "dm.thinp_metapercent=1",
    "dm.thinp_autoextend_threshold=80",
    "dm.thinp_autoextend_percent=20",
    "dm.directlvm_device_force=false"
  ]
}

请参阅 daemon 参考文档中每个存储驱动程序的所有存储选项

重新启动 Docker 以使更改生效。Docker 调用命令 为您配置块设备。

警告

在 Docker 为您准备好块设备后更改这些值是 不支持,并导致错误。

您仍然需要执行定期维护任务

手动配置 direct-lvm 模式

下面的过程将创建一个配置为精简池的逻辑卷,以 用作存储池的备份。它假定您有一个备用块 device 位于/dev/xvdf有足够的可用空间来完成任务。设备 标识符和卷大小在您的环境中可能不同,而您 应在整个过程中替换您自己的值。该程序还 假设 Docker 守护程序位于stopped州。

  1. 确定要使用的块设备。该设备位于/dev/(例如/dev/xvdf),并且需要足够的可用空间来存储 托管运行的工作负载的镜像和容器层。 固态驱动器是理想的选择。

  2. 停止 Docker。

    $ sudo systemctl stop docker
    
  3. 安装以下软件包:

    • RHEL / CentOS:device-mapper-persistent-data,lvm2和所有 依赖

    • Ubuntu / Debian / SLES 15thin-provisioning-tools,lvm2和所有 依赖

  4. 从步骤 1 开始,使用pvcreate命令。将设备名称替换为/dev/xvdf.

    警告

    接下来的几个步骤是破坏性的,因此请确保您已指定 正确的设备。

    $ sudo pvcreate /dev/xvdf
    
    Physical volume "/dev/xvdf" successfully created.
    
  5. 创建一个docker卷组,使用vgcreate命令。

    $ sudo vgcreate docker /dev/xvdf
    
    Volume group "docker" successfully created
    
  6. 创建两个名为thinpoolthinpoolmeta使用lvcreate命令。最后一个参数指定可用空间量 允许在空间不足时自动扩展数据或元数据, 作为临时的权宜之计。这些是建议的值。

    $ sudo lvcreate --wipesignatures y -n thinpool docker -l 95%VG
    
    Logical volume "thinpool" created.
    
    $ sudo lvcreate --wipesignatures y -n thinpoolmeta docker -l 1%VG
    
    Logical volume "thinpoolmeta" created.
    
  7. 将卷转换为精简池和元数据的存储位置 thin pool 使用lvconvert命令。

    $ sudo lvconvert -y \
    --zero n \
    -c 512K \
    --thinpool docker/thinpool \
    --poolmetadata docker/thinpoolmeta
    
    WARNING: Converting logical volume docker/thinpool and docker/thinpoolmeta to
    thin pool's data and metadata volumes with metadata wiping.
    THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)
    Converted docker/thinpool to thin pool.
    
  8. 通过lvm轮廓。

    $ sudo vi /etc/lvm/profile/docker-thinpool.profile
    
  9. 指定thin_pool_autoextend_thresholdthin_pool_autoextend_percent值。

    thin_pool_autoextend_threshold是之前使用的空间百分比lvm尝试自动扩展可用空间(100 = 已禁用,不推荐)。

    thin_pool_autoextend_percent是要添加到设备的空间量 自动扩展时(0 = 禁用)。

    以下示例在磁盘使用率达到 20% 时增加 20% 的容量 80%.

    activation {
      thin_pool_autoextend_threshold=80
      thin_pool_autoextend_percent=20
    }

    保存文件。

  10. 使用lvchange命令。

    $ sudo lvchange --metadataprofile docker-thinpool docker/thinpool
    
    Logical volume docker/thinpool changed.
    
  11. 确保已启用对逻辑卷的监控。

    $ sudo lvs -o+seg_monitor
    
    LV       VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Monitor
    thinpool docker twi-a-t--- 95.00g             0.00   0.01                             not monitored
    

    如果Monitor列报告,如上,卷为not monitored,则需要显式启用监控。没有 此步骤,逻辑卷的自动扩展不会发生, 无论应用的配置文件中的任何设置如何。

    $ sudo lvchange --monitor y docker/thinpool
    

    通过运行sudo lvs -o+seg_monitor命令。这Monitor列 现在应该报告逻辑卷正在monitored.

  12. 如果您以前曾在此主机上运行过 Docker,或者如果/var/lib/docker/存在,将其移开,以便 Docker 可以使用新的 LVM 池 存储 Image 和 Containers 的内容。

    $ sudo su -
    # mkdir /var/lib/docker.bk
    # mv /var/lib/docker/* /var/lib/docker.bk
    # exit
    

    如果以下任何步骤失败,并且您需要恢复,您可以删除/var/lib/docker并将其替换为/var/lib/docker.bk.

  13. 编辑/etc/docker/daemon.json并配置devicemapperstorage 驱动程序。如果文件以前为空,则它应该 现在包含以下内容:

    {
        "storage-driver": "devicemapper",
        "storage-opts": [
        "dm.thinpooldev=/dev/mapper/docker-thinpool",
        "dm.use_deferred_removal=true",
        "dm.use_deferred_deletion=true"
        ]
    }
  14. 启动 Docker。

    systemd

    $ sudo systemctl start docker
    

    服务范围:

    $ sudo service docker start
    
  15. 验证 Docker 是否正在使用新配置docker info.

    $ docker info
    
    Containers: 0
     Running: 0
     Paused: 0
     Stopped: 0
    Images: 0
    Server Version: 17.03.1-ce
    Storage Driver: devicemapper
     Pool Name: docker-thinpool
     Pool Blocksize: 524.3 kB
     Base Device Size: 10.74 GB
     Backing Filesystem: xfs
     Data file:
     Metadata file:
     Data Space Used: 19.92 MB
     Data Space Total: 102 GB
     Data Space Available: 102 GB
     Metadata Space Used: 147.5 kB
     Metadata Space Total: 1.07 GB
     Metadata Space Available: 1.069 GB
     Thin Pool Minimum Free Space: 10.2 GB
     Udev Sync Supported: true
     Deferred Removal Enabled: true
     Deferred Deletion Enabled: true
     Deferred Deleted Device Count: 0
     Library Version: 1.02.135-RHEL7 (2016-11-16)
    <...>
    

    如果 Docker 配置正确,则Data fileMetadata file是 blank,并且存储池名称为docker-thinpool.

  16. 验证配置正确后,您可以删除/var/lib/docker.bk目录中,其中包含先前的配置。

    $ sudo rm -rf /var/lib/docker.bk
    

管理 devicemapper

监视精简池

不要单独依赖 LVM 自动扩展。卷组 自动扩展,但卷仍可填满。您可以监控 卷上的可用空间lvslvs -a.考虑使用监控 工具,例如 Nagios。

要查看 LVM 日志,您可以使用journalctl:

$ sudo journalctl -fu dm-event.service

如果反复遇到精简池问题,则可以设置存储选项dm.min_free_space的值(表示百分比)/etc/docker/daemon.json.例如,将其设置为10确保 当可用空间等于或接近 10% 时,作失败并显示警告。 请参阅 Engine 守护程序参考中的 storage driver 选项

增加正在运行的设备的容量

您可以增加正在运行的精简池设备上的池容量。这是 如果数据的逻辑卷已满且卷组已满,则很有用 能力。具体过程取决于您使用的是 loop-lvm 精简池还是 direct-lvm 精简池

调整 loop-lvm thin 池的大小

调整loop-lvmthin pool 是使用 device_tool 实用程序, 但您可以改用 Operating System Utilities

使用 device_tool 实用程序

一个名为device_tool.gomoby/moby Github 存储库中提供。您可以使用此工具调整loop-lvm薄池 / 避免上述漫长的过程。此工具不保证有效,但您 应该只使用loop-lvm在非生产系统上。

如果您不想使用device_tool中,您可以手动调整精简池的大小

  1. 要使用该工具,请克隆 Github 存储库,更改为contrib/docker-device-tool,然后按照README.md以编译该工具。

  2. 使用该工具。以下示例将精简池的大小调整为 200GB。

    $ ./device_tool resize 200GB
    
使用作系统实用程序

如果您不想使用 device-tool 实用程序, 您可以调整loop-lvm使用以下过程手动精简池。

loop-lvm模式,则使用环回设备存储数据,并使用另一个 以存储元数据。loop-lvmmode 仅支持用于测试,因为 它具有明显的性能和稳定性缺点。

如果您正在使用loop-lvmmode 时,将docker info显示文件 的 pathsData loop fileMetadata loop file:

$ docker info |grep 'loop file'

 Data loop file: /var/lib/docker/devicemapper/data
 Metadata loop file: /var/lib/docker/devicemapper/metadata

按照以下步骤增加精简池的大小。在此示例中, 精简池为 100 GB,并增加到 200 GB。

  1. 列出设备的大小。

    $ sudo ls -lh /var/lib/docker/devicemapper/
    
    total 1175492
    -rw------- 1 root root 100G Mar 30 05:22 data
    -rw------- 1 root root 2.0G Mar 31 11:17 metadata
    
  2. 增加data文件设置为 200 Gtruncate命令 用于增大减小文件大小。请注意, 减小大小是一种破坏性作。

    $ sudo truncate -s 200G /var/lib/docker/devicemapper/data
    
  3. 验证文件大小是否已更改。

    $ sudo ls -lh /var/lib/docker/devicemapper/
    
    total 1.2G
    -rw------- 1 root root 200G Apr 14 08:47 data
    -rw------- 1 root root 2.0G Apr 19 13:27 metadata
    
  4. 环回文件在磁盘上已更改,但在内存中未更改。列出 的大小 内存中的环回设备,以 GB 为单位。重新加载它,然后再次列出大小。 重新加载后,大小为 200 GB。

    $ echo $[ $(sudo blockdev --getsize64 /dev/loop0) / 1024 / 1024 / 1024 ]
    
    100
    
    $ sudo losetup -c /dev/loop0
    
    $ echo $[ $(sudo blockdev --getsize64 /dev/loop0) / 1024 / 1024 / 1024 ]
    
    200
    
  5. 重新加载 devicemapper 精简池。

    一个。首先获取池名称。存储池名称是第一个字段,由:.此命令将提取它。

    $ sudo dmsetup status | grep ' thin-pool ' | awk -F ': ' {'print $1'}
    docker-8:1-123141-pool
    

    b.转储精简池的设备映射器表。

    $ sudo dmsetup table docker-8:1-123141-pool
    0 209715200 thin-pool 7:1 7:0 128 32768 1 skip_block_zeroing
    

    c. 使用第二个字段计算精简池的总扇区数 的输出。该数字以 512-k 扇区表示。一个 100G 文件具有 209715200 512-k 扇区。如果将此数字翻倍到 200G,则得到 419430400 512-k 扇区。

    d. 使用以下命令使用新的扇区号重新加载精简池 三dmsetup命令。

    $ sudo dmsetup suspend docker-8:1-123141-pool
    $ sudo dmsetup reload docker-8:1-123141-pool --table '0 419430400 thin-pool 7:1 7:0 128 32768 1 skip_block_zeroing'
    $ sudo dmsetup resume docker-8:1-123141-pool
    

调整 direct-lvm 精简池的大小

要扩展direct-lvmthin pool,您需要先附加一个新的块存储设备 添加到 Docker 主机中,并记下内核为其分配的名称。在 在此示例中,新的块设备为/dev/xvdg.

按照以下过程扩展direct-lvmthin pool,将 block device 和其他参数来适应你的情况。

  1. 收集有关卷组的信息。

    使用pvdisplay命令查找当前位于 use 替换为您的精简池和卷组的名称。

    $ sudo pvdisplay |grep 'VG Name'
    
    PV Name               /dev/xvdf
    VG Name               docker
    

    在以下步骤中,将块存储设备或卷组名称替换为 适当。

  2. 使用vgextend命令与VG Name以及块存储设备的名称。

    $ sudo vgextend docker /dev/xvdg
    
    Physical volume "/dev/xvdg" successfully created.
    Volume group "docker" successfully extended
    
  3. 扩展docker/thinpool逻辑卷。此命令使用 100% 的 卷,没有自动扩展。扩展元数据精简池 相反,请使用docker/thinpool_tmeta.

    $ sudo lvextend -l+100%FREE -n docker/thinpool
    
    Size of logical volume docker/thinpool_tdata changed from 95.00 GiB (24319 extents) to 198.00 GiB (50688 extents).
    Logical volume docker/thinpool_tdata successfully resized.
    
  4. 使用Data Space Available字段中的 output 的docker info.如果您扩展了docker/thinpool_tmeta逻辑 volume 中,请查找Metadata Space Available.

    Storage Driver: devicemapper
     Pool Name: docker-thinpool
     Pool Blocksize: 524.3 kB
     Base Device Size: 10.74 GB
     Backing Filesystem: xfs
     Data file:
     Metadata file:
     Data Space Used: 212.3 MB
     Data Space Total: 212.6 GB
     Data Space Available: 212.4 GB
     Metadata Space Used: 286.7 kB
     Metadata Space Total: 1.07 GB
     Metadata Space Available: 1.069 GB
    <...>

激活devicemapper重新启动后

如果重启主机并发现docker服务启动失败, 查找错误 “Non existing device”。您需要重新激活 使用以下命令的逻辑卷:

$ sudo lvchange -ay docker/thinpool

如何devicemapper存储驱动程序工作

警告

不要直接作/var/lib/docker/.这些文件和目录由 Docker 管理。

使用lsblk命令查看设备及其存储池,从作 系统的观点:

$ sudo lsblk

NAME                    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda                    202:0    0    8G  0 disk
└─xvda1                 202:1    0    8G  0 part /
xvdf                    202:80   0  100G  0 disk
├─docker-thinpool_tmeta 253:0    0 1020M  0 lvm
│ └─docker-thinpool     253:2    0   95G  0 lvm
└─docker-thinpool_tdata 253:1    0   95G  0 lvm
  └─docker-thinpool     253:2    0   95G  0 lvm

使用mount命令以查看 Docker 正在使用的挂载点:

$ mount |grep devicemapper
/dev/xvda1 on /var/lib/docker/devicemapper type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

当您使用devicemapper中,Docker 将镜像和层内容存储在 thin池,并通过将它们挂载到 的子目录/var/lib/docker/devicemapper/.

磁盘上的镜像和容器层

/var/lib/docker/devicemapper/metadata/目录包含有关 Devicemapper 配置本身以及每个镜像和容器层 存在。这devicemapper存储驱动程序使用快照,并且此元数据 包括有关这些快照的信息。这些文件采用 JSON 格式。

/var/lib/docker/devicemapper/mnt/目录包含每个镜像的挂载点 和存在的容器层。镜像层挂载点为空,但 容器的挂载点显示容器的文件系统,就像它从 在容器内。

镜像分层和共享

devicemapper存储驱动程序使用专用块设备,而不是 格式化的文件系统,并在块级别对文件执行最大 写入时复制 (CoW)作期间的性能。

快照

另一个特点devicemapper是它使用快照(有时也称为瘦设备虚拟设备),这些快照存储了 每一层都是非常小、轻量级的薄池。快照提供了许多 好处:

  • 在容器之间共享的层仅存储在磁盘上 一次,除非它们是可写的。例如,如果您有 10 个不同的 镜像,这些镜像均基于alpinealpineimage 及其所有 父镜像在磁盘上只存储一次。

  • 快照是写入时复制 (CoW) 策略的实现。这意味着 仅将给定文件或目录复制到容器的可写对象 层。

  • 因为devicemapper在区块级别运行,在 可写层可以同时修改。

  • 可以使用标准的作系统级备份实用程序备份快照。只 复制/var/lib/docker/devicemapper/.

Devicemapper 工作流程

当您使用devicemapper存储驱动程序、所有对象 与 镜像和容器层的/var/lib/docker/devicemapper/,它由一个或多个块级 设备,环回设备(仅用于测试)或物理磁盘。

  • 基本设备是最低级别的对象。这是 thin pool 本身。 您可以使用docker info.它包含一个文件系统。这个基地 device 是每个镜像和容器层的起点。基地 device 是 Device Mapper 实现细节,而不是 Docker 层。

  • 有关基本设备和每个镜像或容器层的元数据存储在/var/lib/docker/devicemapper/metadata/JSON 格式。这些层是 写入时复制快照,这意味着它们在发散之前是空的 从其父图层。

  • 每个容器的可写层都挂载在/var/lib/docker/devicemapper/mnt/.每个 只读镜像层和每个已停止的容器。

每个镜像图层都是其下方图层的快照。每个 image 是池中存在的基本设备的快照。当您运行 container 的 Shell,它是容器所基于的镜像的快照。以下内容 示例显示了具有两个正在运行的容器的 Docker 主机。第一个是ubuntu容器,第二个是busybox容器。

Ubuntu 和 busybox 镜像层

容器读取和写入的工作原理devicemapper

读取文件

devicemapper,读取发生在块级别。下图显示 读取单个块 (0x44f) 容器。

Reading a block with devicemapper

应用程序对 block 发出读取请求0x44f在容器中。因为 容器是镜像的薄快照,它没有块,但它 有一个指针,指向它确实存在的最近父镜像上的块,并且 它从那里读取块。该块现在存在于容器的内存中。

写入文件

编写新文件:使用devicemapper驱动程序, 将新数据写入 container 是通过按需分配作完成的。每个块 新文件被分配到容器的可写层中,块是 写在那里。

更新现有文件:从 它所在的 nearest 图层。当容器写入文件时,只有 修改后的块将写入容器的可写层。

删除文件或目录:当您删除 容器的可写层,或者当镜像层删除存在的文件时 在其父层中,devicemapper存储驱动程序拦截进一步读取 尝试对该文件或目录执行作,并响应该文件或目录执行 不存在。

写入然后删除文件:如果容器写入文件及更高版本 删除文件,所有这些作都发生在容器的 writable 层。在这种情况下,如果您使用direct-lvm,则块将被释放。如果你 用loop-lvm,则块可能无法释放。这是不使用loop-lvm在生产中。

Device Mapper 和 Docker 性能

  • allocate-on demand性能影响:

    devicemapper存储驱动程序使用allocate-on-demand作设置为 将 thin pool 中的新块分配到容器的可写层中。 每个块为 64KB,因此这是使用的最小空间量 进行写入。

  • 写入时复制性能影响:容器首次修改 specific 块,则该块将写入容器的可写层。 因为这些写入发生在块级别而不是文件级别,所以 将性能影响降至最低。但是,写入大量块可以 仍然会对性能产生负面影响,并且devicemapper存储驱动程序可能 实际上,在这种情况下,性能比其他存储驱动程序差。为 写入密集型工作负载,您应该使用数据卷,这会绕过存储 驱动程序。

性能最佳实践

请记住这些事项,以便在使用devicemapperstorage 驱动程序。

  • direct-lvm:这loop-lvmmode 不执行,不应 用于生产。

  • 使用快速存储:固态硬盘 (SSD) 提供更快的读取速度和 写入次数比旋转磁盘的次数多。

  • 内存使用情况devicemapper比其他存储使用更多的内存 司机。每个启动的容器都会将其文件的一个或多个副本加载到 memory,具体取决于同一文件的块数 同一时间。由于内存压力,devicemapper存储驱动程序 对于高密度使用案例中的某些工作负载来说,这可能不是正确的选择。

  • 将卷用于写入密集型工作负载:卷提供最好和最 为写入密集型工作负载提供可预测的性能。这是因为他们绕过了 存储驱动程序,并且不会产生任何引入的潜在开销 通过精简配置和写入时复制。卷还有其他好处,例如 允许您在容器之间共享数据,并在没有 正在运行的容器正在使用它们。

    注意

    使用devicemapperjson-filelog 驱动程序,默认情况下,容器生成的日志文件仍然存储在 Docker 的 dataroot 目录中/var/lib/docker.如果您的容器生成大量日志消息,这可能会导致磁盘使用量增加或由于磁盘已满而无法管理系统。您可以配置日志驱动程序以在外部存储容器日志。