docker 配置Btrfs和Device mapper存储驱动设置

运行环境:

docker -v

Docker version 1.12.1, build 23cf638

uname -a

Linux ceph-6-29 3.10.0-327.28.3.el7.x86_64 #1 SMP Thu Aug 18 19:05:49 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux\

一:docker 首次安装完成,默认存储设备为loop 回环设备,会创建一个100G的用于存储数据,和一个2G的用于存储元数据的稀疏文件,然后分别附加到回环块设备/dev/loop0和/dev/loop1。然后基于回环块设备创建thin pool。

1.1:查看回环块设备信息

[[email protected] ~]# losetup -a

/dev/loop0: [2245]:1937889 (/var/lib/docker/devicemapper/devicemapper/data)

/dev/loop1: [2245]:1937890 (/var/lib/docker/devicemapper/devicemapper/metadata)

1.2:查看回环设备大小

[[email protected] ~]# docker info

.。。。。。。。。。。。。。。。

Server Version: 1.12.1

Storage Driver: devicemapper

Pool Name: docker-8:197-537316283-pool

Pool Blocksize: 65.54 kB

Base Device Size: 10.74 GB 《《=============data 默认块大小

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: 107.4 GB

Metadata Space Used: 581.6 kB

Metadata Space Total: 2.147 GB 《《=============metadata 默认块大小

Metadata Space Available: 2.147 GB

Thin Pool Minimum Free Space: 10.74 GB

Udev Sync Supported: true

从上的信息可以看出,Base Device 只有10G 空间,我们测试期间发现,反复发布镜像,很容易把空间沾满,如果你想增大空间执行操作如下:

1.3:关闭docker

systemctl stop docker

1.4:删除docker目录文件,不删除也可以,不过有时候可能会导致docker 服务服务启动。

rm -rf /var/lib/docker/*

1.5:调整回环设备文件和镜像的大小,例如,我们将回环境设备文件大小设置为100G,元数据文件大小为4G,基础镜像大小为20G:

另外,–storage-opt还有其它一些参数,比较dm.fs指定文件系统(默认为ext4)等。

vim /usr/lib/systemd/system/docker.service

添加启动项内容如下:

ExecStart=/usr/bin/dockerd --storage-opt dm.basesize=100G  dm.loopdatasize=50G --storage-opt dm.loopmetadatasize=4G

1.6:启动docker服务

systemctl daemon-reload

systemctl start docker

1.7:在粗验证docker配置信息:

docker info

.。。。。。。。。。。。。。。

Server Version: 1.12.1

Storage Driver: devicemapper

Pool Name: docker-8:197-537315670-pool

Pool Blocksize: 65.54 kB

Base Device Size: 107.4     《《=============Base Device 默认块大小

Backing Filesystem: xfs

Data file: /dev/loop0

Metadata file: /dev/loop1

Data Space Used: 53.74 MB 《《=============data 默认块大小

Data Space Total: 53.69 GB

Data Space Available: 53.63 GB

Metadata Space Used: 532.5 kB

Metadata Space Total: 4.295     《《=============Metadata 默认块大小

Metadata Space Available: 4.294 GB

Thin Pool Minimum Free Space: 5.369 GB

1.8: 以上是直接修改配置调整存储空间大小,验证配置修改生效;

二:通过dd 创建存储空间文件方式调整存储空间;

2.1:在线验证docker配置信息:

docker info

.。。。。。。。。。。。。。。

Server Version: 1.12.1

Storage Driver: devicemapper

Pool Name: docker-8:197-537315670-pool

Pool Blocksize: 65.54 kB

Base Device Size: 107.4     《《=============Base Device 默认块大小

Backing Filesystem: xfs

Data file: /dev/loop0

Metadata file: /dev/loop1

Data Space Used: 53.74 MB 《《=============data 默认块大小

Data Space Total: 53.69 GB

Data Space Available: 53.63 GB

Metadata Space Used: 532.5 kB

Metadata Space Total: 4.295     《《=============Metadata 默认块大小

Metadata Space Available: 4.294 GB

Thin Pool Minimum Free Space: 5.369 GB

1.3:关闭docker

systemctl stop docker

1.4:删除docker目录文件,不删除也可以,不过有时候可能会导致docker 服务服务启动。

rm -rf /var/lib/docker/*

1.5: 创建存储空间文件

创建目录

mkdir -p /var/lib/docker/devicemapper/devicemapper

cd /var/lib/docker/devicemapper/devicemapper

Create your pool:

dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=80

dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/metadata bs=4k count=0 seek=1024000

1.6:验证存储空间大小

[[email protected] devicemapper]# ls -lsh

total 0

0 -rw-r--r-- 1 root root  80G Sep 12 21:35 data

0 -rw-r--r-- 1 root root 4.0G Sep 12 21:36 metadata

1.7: 查看启动服务配置文件:

vim /usr/lib/systemd/system/docker.service

启动项内容爆出默认即可:

ExecStart=/usr/bin/dockerd

1.8:启动docker服务

systemctl daemon-reload

systemctl start docker

1.9:验证配置:

[[email protected] devicemapper]# docker info

Containers: 0

Running: 0

Paused: 0

Stopped: 0

Images: 0

Server Version: 1.12.1

Storage Driver: devicemapper

Pool Name: docker-8:197-537315670-pool

Pool Blocksize: 65.54 kB

Base Device Size: 10.74   《《=============Base Device 默认块大小

Backing Filesystem: xfs

Data file: /dev/loop0

Metadata file: /dev/loop1

Data Space Used: 11.8 MB 《《=============data 默认块大小

Data Space Total: 107.4 GB

Data Space Available: 107.4 GB

Metadata Space Used: 704.5 kB

Metadata Space Total: 4.194   《《============= Metadata 默认块大小

Metadata Space Available: 4.194 GB

Thin Pool Minimum Free Space: 10.74 GB

Udev Sync Supported: true

2.0: 验证查看info信息,空间信息没有发生变化,这种配置方式,这种貌似不太靠谱,上面是在国外查询资料时看到有人这么做,仅供参考:

以上两种方式的演示,基本对docker的存储有所了解,但是以上方式都不推荐在生产环境使用,使用回环设备,性能差不说,也不太稳定,总是出一些奇葩的问题,我们深受其害,所有查找资料总计梳理下面两种配置docker 使用存储空间的方式,现已经在生产系统测试验证可靠性。

以下内容可能牵扯很多存储相关的知识,请查询相关资料,本文不做阐述,目前,Docker支持AUFS、Btrfs、Device mapper、OverlayFS、ZFS五种存储驱动。就如Docker官网上说的,没有单一的驱动适合所有的应用场景,要根据不同的场景选择合适的存储驱动,才能有效的提高Docker的性能。

AUFS :最早的docker虽支持的存储启动,以补丁方式加入内核,问题比较多!AUFS能透明覆盖一或多个现有文件系统的层状文件系统,把多层合并成文件系统的单层表示。

devicemapper:写时复制(CoW)。CoW就是copy-on-write,表示只在需要写时才去复制,这个是针对已有文件的修改场景。

Btrfs:btrfs驱动程序,docker build 非常快,-但是devicemapper 设备之间不共享可执行内存。

OverlayFS:是一个非常快的工会的文件系统。它现在合并在主Linux内核作为3.18.0。

具体参考信息如下:

https://docs.docker.com/engine/reference/commandline/dockerd/

http://dockone.io/article/1513

下面主要介绍如何快速简单的配置使用btrfs 和  devicemapper  驱动;

三:使用裸设备直接存储docker 数据,即将真实磁盘链接到 docker data 存储数据。

3.1:配置要求,

a:系统需要有一块未使用的磁盘或分区;

b:掌握分区常用命令

3.2:查看系统分区信息:

# lsblk

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT

sda      8:0    0 558.4G  0 disk

。。。。。。。。。。。。。。。。。。

├─sda4   8:4    0     1K  0 part

├─sda5   8:5    0 355.9G  0 part /dbdata

├─sda6   8:6    0    80G  0 part 《=======本次演示使用分区

。。。。。。。。。。。。

3.3:修改前查看info信息:

[[email protected] ~]# docker info

。。。。。。。。。。。。。。。。。。。。。

Images: 5

Server Version: 1.12.1

Storage Driver: devicemapper

Pool Name: docker-8:2-269225707-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: 1.944 GB

Data Space Total: 107.4 GB

Data Space Available: 98.49 GB

Metadata Space Used: 2.834 MB

Metadata Space Total: 2.147 GB

Metadata Space Available: 2.145 GB

Thin Pool Minimum Free Space: 10.74 GB

3.4:关闭docker

systemctl stop docker

3.5:删除docker目录文件,不删除也可以,不过有时候可能会导致docker 服务服务启动。

rm -rf /var/lib/docker/*

3.6:系统分区;

我这边要做的操作是使用 fdisk 删除 /dev/sda6 分区,将剩余空间重现划分为两个分区,信息如下:

dm.datadev= /dev/sda6  ==>70G

dm.metadatadev= /dev/sda7  ==>10G

3.7:添加启动项内容如下:

vim /usr/lib/systemd/system/docker.service

修改启动项如下:

ExecStart=/usr/bin/dockerd --storage-opt dm.datadev=/dev/sda6  --storage-opt dm.metadatadev=/dev/sda7 --storage-opt dm.blocksize=512K --storage-opt dm.basesize=80G

3.8:启动docker服务

systemctl daemon-reload

systemctl start docker

3.9:验证修改效果:

[[email protected] docker]# docker info

。。。。。。。。。。。。。。。。

Images: 0

Server Version: 1.12.1

Storage Driver: devicemapper

Pool Name: docker-8:2-403544979-pool

Pool Blocksize: 524.3 kB

Base Device Size: 85.9 GB 《《=============存储位置已变更

Backing Filesystem: xfs

Data file: /dev/sda6 《《=============存储位置已变更

Metadata file: /dev/sda7 《《=============存储位置已变更

Data Space Used: 79.17 MB

Data Space Total: 85.9 GB

Data Space Available: 85.82 GB

Metadata Space Used: 737.3 kB

Metadata Space Total: 10.74 GB

Metadata Space Available: 10.74 GB

Thin Pool Minimum Free Space: 8.59 GB

通过以上配置,可以实现docker将数据存储到裸设备,原理上速度应该不错,这种方式的缺点是,磁盘空间的使用量不好监控。有些人使用lvm 处理之后再这么配置,然后添加配置

dockerd --storage-opt dm.min_free_space=10%  来保障空间使用情况,我测试了一下直接使用裸设备,这个参数添加后docker 无法启动。我觉得中间加一层lvm 的配置变得有些麻烦,就没这么做。

四:配置使用btrfs 文件系统;

这种方式配置比较简单,文件系统挂载系统后再将docker 的数据写入,系统后挂载点,系统监控可以监控磁盘空间,可以实现告警。

4.1:配置要求,

a:系统需要有一块未使用的磁盘或分区;

b:掌握分区常用命令

4.2:修改前docker info 信息如下:

Pool Name: docker-8:197-270105280-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: 768.3 MB

Data Space Total: 107.4 GB

Data Space Available: 106.6 GB

Metadata Space Used: 1.79 MB

Metadata Space Total: 2.147 GB

Metadata Space Available: 2.146 GB

Thin Pool Minimum Free Space: 10.74 GB

Udev Sync Supported: true

4.3:查看系统分区信息:

sdm      8:192  0 278.9G  0 disk

├.......................

├─sdm2   8:194  0    80G  0 part 《=======本次演示使用分区

......................

[[email protected] ~]#

4.4:格式化文件系统

安装基础包

yum  install btrfs-*

将 /dev/sdm2 格式化为btrfs 文件系统:

mkfs.btrfs -f /dev/sdm2

4.5:查看分区UUID ,为挂载做准备:

blkid

/dev/sdm1: UUID="4f00e697-43a9-4088-9f47-363238ddd36c" TYPE="xfs"

/dev/sdm2: UUID="15b78ce6-5ddd-42e3-a3e0-fd226e3dbd4a" UUID_SUB="66494e3f-4708-4376-a416-c769bfa96651" TYPE="btrfs"

4.5:关闭docker

systemctl stop docker

4.6:删除docker目录文件,不删除也可以,不过有时候可能会导致docker 服务服务启动。

rm -rf /var/lib/docker/*

4.7:添加系统开机自动挂载:

vim /etc/fstab

UUID=15b78ce6-5ddd-42e3-a3e0-fd226e3dbd4a /var/lib/docker         btrfs   defaults        0 0

保存退出后:

执行 mount -a

查看系统分区挂载情况:

[[email protected] ~]# df -h

Filesystem      Size  Used Avail Use% Mounted on

..............................

/dev/sdm2        80G  2.4G   77G   3% /var/lib/docker

4.8:添加启动项内容如下:

Btrfs 配置选项 :btrfs.min_space  ,剩余空间小于这个值,系统会给出告警信息;

vim /usr/lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd -s btrfs -g /var/lib/docker --storage-opt btrfs.min_space=10G

4.9:启动docker服务

systemctl daemon-reload

systemctl start docker

4.10: 配置信息验证:

[[email protected] ~]# docker info

................

Server Version: 1.12.1

Storage Driver: Btrfs          <================存储信息

Build Version: Btrfs v3.19.1

Library Version: 101

Logging Driver: json-file

Cgroup Driver: cgroupfs

Plugins:

Volume: local

Network: host bridge null overlay

Swarm: inactive

Runtimes: runc

Default Runtime: runc

以上3-4 步骤介绍了配置Btrfs和Device mapper存储驱动设置,不足之处各位看官指正。

参考文档:

Docker五种存储驱动原理及应用场景和性能测试对比:http://dockone.io/article/1513

Docker容器的持久存储模式:http://dockone.io/article/1283

http://vitan.github.io/docker/2016/01/22/aufs-vs-devicemapper.html

http://www.cnblogs.com/itcomputer/p/5667917.html

https://github.com/snitm/docker/tree/master/daemon/graphdriver/devmapper

时间: 2024-10-15 04:46:32

docker 配置Btrfs和Device mapper存储驱动设置的相关文章

Docker存储驱动之Device Mapper简介

Device Mapper是一个基于kernel的框架,它增强了很多Linux上的高级卷管理技术.Docker的devicemapper驱动在镜像和容器管理上,利用了该框架的超配和快照功能.为了区别,本文使用Device Mapper指驱动中的框架,而devicemapper指Docker的存储驱动. 注意:商业支持的Docker Engine(CS-Engine)建议在RHEL和CentOS上使用devicemapper存储驱动. AUFS之外的另一种选择 Docker最初运行在Ubuntu和

Docker五种存储驱动原理及应用场景和性能测试对比

Docker最开始采用AUFS作为文件系统,也得益于AUFS分层的概念,实现了多个Container可以共享同一个image.但由于AUFS未并入Linux内核,且只支持Ubuntu,考虑到兼容性问题,在Docker 0.7版本中引入了存储驱动, 目前,Docker支持AUFS.Btrfs.Device mapper.OverlayFS.ZFS五种存储驱动.就如Docker官网上说的,没有单一的驱动适合所有的应用场景,要根据不同的场景选择合适的存储驱动,才能有效的提高Docker的性能.如何选择

使用 Device Mapper来改变Docker容器的大小

作者:Jérôme Petazzoni ( Docker 布道师) 译者:Mark Shao ( EMC 中国高级工程师) 如果在 CentOS . REHL . Fedor 或者其他默认没有 AUFS 支持的 Linux 发行版上使用 Docker ,你可能需要用到 Device Mapper 的存储插件.将这个插件设置为默认,它会把你所有的容器存储到一个 100G 的简短文件中,并且限制每个容器最大为 10GB .这篇文章将展示如何突破这个限制,并且把容器的存储移动到一个指定的分区或者 LV

docker的存储驱动选择,aufs和devicemapper比较

mapper存储驱动存在问题: 在镜像上创建一个大文件 exit退出后commit容器 镜像没有生成成功,但是磁盘占用满咯 强制删除存储目录,显示Device or resource busy 下次reboot重启的时候才能释放掉空间 网上推荐: Aufs实现起来比较简单,但是由于其迟迟不能加入linux内核,导致兼容性差.目前,仅有Ubuntu支持.Devicemapper虽然实现起来复杂,但兼容性好.其存在的一点不足是,当metadata和data空间被耗尽时,需要重启Docker来扩充空间

docker存储驱动

http://www.sohu.com/a/101016494_116235 https://success.docker.com/article/compatibility-matrix Red Hat Enterprise Linux:4.x版本内核或更高版本 + Docker 17.06 版本或更高版本,建议使用 Overlay2. Red Hat Enterprise Linux:低版本内核或低版本的 Docker,建议使用 Device Mapper. Ubuntu Linux:4.x

Docker存储驱动devicemapper介绍和配置

devicemapper介绍 Device Mapper是Linux系统中基于内核的高级卷管理技术框架.Docker的devicemapper存储驱动就是基于该框架的精简置备和快照功能来实现镜像和容器的管理. 注:Device Mapper是Linux的一种技术框架,而devicemapper是Docker Engine基于Device Mapper提供的一种存储驱动. 早期的Docker运行在Ubuntu和Debian Linux上并使用AUFS作为后端存储.Docker流行之后,越来越多的的

Docker存储驱动之Btrfs简介

简介 Btrfs是下一代的copy-on-write文件系统,它支持很多高级特性,使其更加适合Docker.Btrfs合并在内核主线中,并且它的on-disk-format也逐渐稳定了.不过,它的很多特性还仍然处于开发中. Docker的btrfs存储驱动利用了很多Btrfs特性来管理镜像和容器.这些特性中最重要的就是thin provisioning(超配).copy-on-write和快照. Btrfs特性 Btrfs一直被认为是Linux文件系统的未来.在Linux内核主线的全力支持下,稳

Centos7 为Docker配置overlay存储驱动

前提: RHEL或CentOS 使用新的docker存储驱动(overlay or overlay2),需要升级系统内核版本到3.10.0-514以上版本.梳理步骤如下: 确认内核 3.10.0-514以上版本 uname -r 3.10.0-514.++++.x86_64 系统升级 sudo yum upgrade --assumeyes --tolerant sudo yum update --assumeyes 确认内核是否加载 overlay模块 lsmod | grep overlay

聊一聊docker存储驱动

目录 镜像的分层特性 容器读写层的工作原理 写时复制 用时配置 Docker存储驱动 AUFS OverlayFS Devicemapper 常用存储驱动对比 AUFS VS OverlayFS OverlayFS VS Device mapper 镜像的分层特性 在说docker的文件系统之前,我们需要先想清楚一个问题.我们知道docker的启动是依赖于image,docker在启动之前,需要先拉取image,然后启动.多个容器可以使用同一个image启动.那么问题来了:这些个容器是共用一个i