分类: LINUX
2017-09-02 18:21:07
docker的默认存储方式是稀疏文件+loop设备,这种方式官方明文不建议使用于生产环境,因为性能低下,那么devicemapper的性能是否能适用生产环境?我们来看一下:
docker的devicemapper是使用lvm的snapshot的机制来使用对镜像的服用,docker开启devicemapper并不复杂,可以使用docker-storage-setup来配置,如下:
修改/usr/lib/docker-storage-setup/docker-storage-setup
STORAGE_DRIVER=devicemapper<--指定存储驱动
EXTRA_DOCKER_STORAGE_OPTIONS="--storage-opt dm.fs=xfs"<--附加参数
DATA_SIZE=40%FREE<--定义创建DATA thin pool的大小,默认为VG 的40%
MIN_DATA_SIZE=2G<--定义DATA pool最小值,默认为2G,如果VG小于2G则创建失败
CHUNK_SIZE=512K<--定义thin pool的CHUNK大小,默认512k
AUTO_EXTEND_POOL=yes<--定义是否自动扩容 thin pool大小,默认为自动扩容
POOL_AUTOEXTEND_THRESHOLD=60<--定义自动扩容的百分比,默认为当前 pool 使用 60%时自动扩容,100表示disable,最小为50 lvm thin — LVM thin provisioning
POOL_AUTOEXTEND_PERCENT=20<--定义每次扩容的大小,默认为 20%,即当前pool大小为100G,那么自动扩容 20G,扩容后大小为120G,100表示disable
DEVICE_WAIT_TIMEOUT=60
WIPE_SIGNATURES=true<--擦除disk label type,例如:fdisk /dev/sda,disk label type=dos,擦除此标记
DOCKER_ROOT_VOLUME=yes<--是否把docker根目录(/var/lib/docker)挂载到lvm磁盘上
DOCKER_ROOT_VOLUME_SIZE=40%FREE<--docker根目录的大小,如果vg为10G,则thin pool为4G(vg的40%),docker根目录为2.4((vg总容量-thin pool的容量)的40%)
此配置配置好后,修改/etc/sysconfig/docker-storage-setup,添加:
DEVS=/dev/sdb<--指定使用那个磁盘
VG=docker-vg<--vg组的名字
SETUP_LVM_THIN_POOL=yes
现在可以使用docker-storage-setup来生成docker的thin池,直接执行:docker-storage-setup,查看/dev/mapper,如下:
/dev/mapper/docker--vg-docker--pool -> ../dm-4<---docker的thin pool
/dev/mapper/docker--vg-docker--pool_tdata -> ../dm-3<--数据
/dev/mapper/docker--vg-docker--pool_tmeta -> ../dm-2<--元数据
/dev/mapper/docker--vg-docker--root--lv -> ../dm-5<--docker根目录
接下来查看挂载:
/dev/mapper/docker--vg-docker--root--lv 24G 34M 24G 1% /var/lib/docker
可以看到 docker—root-lv挂载在/var/lib/docker目录,也就是docker根目录
查看docker info:
Storage Driver: devicemapper
Pool Name: docker--vg-docker--pool
Pool Blocksize: 524.3 kB
Base Device Size: 21.47 GB
Backing Filesystem: xfs
Data file:
Metadata file:
Data Space Used: 342.9 MB
Data Space Total: 81.38 GB
Data Space Available: 81.04 GB
Metadata Space Used: 155.6 kB
Metadata Space Total: 109.1 MB
Metadata Space Available: 108.9 MB
Thin Pool Minimum Free Space: 8.138 GB
可以看到docker的devicemapper已经启动,以上是使用docker-storage-setup工具直接生成,当然也可以手动配置lvm,不过手动没试过。
配置docker-root-lv的时候最好一开始就计划好,是否要把/var/lib/docker挂载在lvm上,自己就试过,一开始没配置DOCKER_ROOT_VOLUME=yes,生成了lvm,后来又开启了这个功能,又执行了一次docker-storage-setup,结果docker启动不起来,出现什么data use…的错误,
这是的解决办法,就是停止docker,docker-storage-setup –reset,删除/var/lib/docker,重新配置后,再执行docker-storage-setup重新生成。
以上是使用devicemapper存储驱动的步骤,那下面我们来看一下,怎么使用overlayfs,overlayfs是文件储存,它和devicemapper驱动不同,devicemapper是基于块,overlayfs是基于文件。
使用Overlayfs驱动,相对简单,先查看系统是否加载了overlay模块:lsmod | grep -I overlay
没有就加载一下:echo ‘overlay’ > /etc/modules-load.d/overlay.conf
修改/usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd-current \
--storage-driver=overlay \<--加入这行
--add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
--default-runtime=docker-runc \
--exec-opt native.cgroupdriver=systemd \
--userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
$OPTIONS \
$DOCKER_STORAGE_OPTIONS \
$DOCKER_NETWORK_OPTIONS \
$ADD_REGISTRY \
$BLOCK_REGISTRY \
$INSECURE_REGISTRY
启动docker,查看docker info:
Server Version: 1.12.6
Storage Driver: overlay<---overlay启动了
Backing Filesystem: xfs
Logging Driver: journald
Cgroup Driver: systemd
Plugins:
Volume: local
Network: null host bridge overlay
Swarm: inactive
Runtimes: docker-runc runc
Default Runtime: docker-runc
===================
Devicemapper的容器的根目录默认是10G,如果需要扩容,修改:
/usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd-current \
--storage-opt dm.basesize=20G \<---加入这一行,修改成20G
--add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \
--default-runtime=docker-runc \
--exec-opt native.cgroupdriver=systemd \
--userland-proxy-path=/usr/libexec/docker/docker-proxy-current \
$OPTIONS \
$DOCKER_STORAGE_OPTIONS \
$DOCKER_NETWORK_OPTIONS \
$ADD_REGISTRY \
$BLOCK_REGISTRY \
$INSECURE_REGISTRY
重启docker,如果已有容器运行,需要删掉,并重新pull,否则在现有的容器也会看不到改变。
Overlay容器的空间是共享docker根目录,也就是/var/lib/docker,可以分配一个lvm挂载此目录,以后动态调整lvm的容量即可
到此两种驱动都已经介绍了,暂时写到这里,下一篇对比一下这两种的不同和遇到一些问题。