Chinaunix首页 | 论坛 | 博客
  • 博客访问: 875506
  • 博文数量: 204
  • 博客积分: 2433
  • 博客等级: 大尉
  • 技术积分: 2205
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-05 13:32
文章分类

全部博文(204)

分类: LINUX

2017-09-02 18:21:07

docker的默认存储方式是稀疏文件+loop设备,这种方式官方明文不建议使用于生产环境,因为性能低下,那么devicemapper的性能是否能适用生产环境?我们来看一下:


dockerdevicemapper是使用lvmsnapshot的机制来使用对镜像的服用,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 poolCHUNK大小,默认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根目录的大小,如果vg10G,thin pool4G(vg40%),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来生成dockerthin池,直接执行:docker-storage-setup,查看/dev/mapper,如下:

/dev/mapper/docker--vg-docker--pool -> ../dm-4<---dockerthin 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

可以看到dockerdevicemapper已经启动,以上是使用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的容量即可


到此两种驱动都已经介绍了,暂时写到这里,下一篇对比一下这两种的不同和遇到一些问题。

阅读(3236) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~