github twitter email
direct-lvm mode for docker
Feb 23, 2017
3 minutes read

Docker는 ubuntu를 기반으로 개발되었습니다.
그렇기 떄문에 도커의 기본적인 파일 스토리지 시스템은 AUFS입니다.
문제는 AUFS는 레드헷 개열에서 지원하지 않는 파일시스템이지요.

도커가 유명해지면서 REHL에서 사용하길 원하는 니즈가 급증하자 Redhat과 docker에서 협력하여 파일 스토리지 시스템 드라이버를 개발하였습니다. 해당 드라이버의 이름이 Devicemapper입니다. 도커의 두번째 공식 파일 스토리지 드라이버가 되었지요. 그래서 레드햇 계열 리눅스에 도커를 설치하면 Devicemapper가 드라이버로 loop-lvm 모드로 올라옵니다. 문제는 상용으로 사용시 loop-lvm으로 사용하면 안된다는 점입니다.

1.13.1 버전부터 Overlay2 또는 Overlay가 Devicemapper대신 기본 스토리지 드라이버로 설정되어 올라옵니다. (커널이 지원한다는 가정하에)

loop-lvm: sparse 파일을 이용하여 이미지와 컨테이너 스냅샷이 사용하는 가상 풀을 생성합니다. sparse 파일은 저장장치가 꽉 차거나 디스크 크기 할당량 초과 시 쓰기 문제가 발생 할 수 있습니다. 또한 모든 복사와 백업에 대한 완벽한 지원을 보장하지 않습니다. 속도가 느립니다..

direct-lvm: 드라이버가 할당된 lvm 블록 장치에 직접 read/write를 수행합니다.

그럼 이제 direct-lvm 모드로 설정해보겠습니다.

Configure direct-lvm mode for production

이미 사용하고 있는 이미지가 있다면 백업해주세요. (개인 Registry 혹은 도커 허브 등..)

도커 데몬 중단

물리 디스크 LVM 설정

root # fdisk /dev/xvdb
...
Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): 8e
Changed type of partition 'Linux' to 'Linux LVM'
root # fdisk -l /dev/xvdb
Disk /dev/xvdb: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xa38a231b
    Device Boot      Start         End      Blocks   Id  System
/dev/xvdb1            2048   209715199   104856576   8e  Linux LVM

LVM2, thin-provisioning-tools 설치

thin-provisioning-tools는 lvm2를 설치할때 설치 되는 device-mapper-persistent-data에 포함되어있습니다.

root # yum install lvm2 -y
...
Installed:
  lvm2.x86_64 7:2.02.166-1.el7_3.2
Dependency Installed:
  device-mapper-event.x86_64 7:1.02.135-1.el7_3.2                           device-mapper-event-libs.x86_64 7:1.02.135-1.el7_3.2
  device-mapper-persistent-data.x86_64 0:0.6.3-1.el7                        libaio.x86_64 0:0.3.109-13.el7
  lvm2-libs.x86_64 7:2.02.166-1.el7_3.2
Dependency Updated:
  device-mapper.x86_64 7:1.02.135-1.el7_3.2                                device-mapper-libs.x86_64 7:1.02.135-1.el7_3.2

/dev/xvdb1을 대체하는 물리적 볼륨 생성

root # pvcreate /dev/xvdb1
  Physical volume "/dev/xvdb1" successfully created.

도커 불륨 그룹 생성

root # vgcreate docker /dev/xvdb1
  Volume group "docker" successfully created

thinpool과 thinpoolmeta라는 이름의 논리 볼륨 생성

저장공간이 부족 할 때를 대비하여 95%의 논리 데이터를 할당하였습니다. 이후 공간이 부족 할 때 임시 방편으로 데이터나 메타데이터를 자동으로 확장하기 위함입니다.

root # lvcreate --wipesignatures y -n thinpool docker -l 95%VG
  Logical volume "thinpool" created.
root # lvcreate --wipesignatures y -n thinpoolmeta docker -l 1%VG
  Logical volume "thinpoolmeta" created.

해당 풀을 thin pool로 컨버팅

root # 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.

LVM 프로필을 이용하여 해당 풀의 자동 확장 기능을 설정합니다

thin_pool_autoextend_threshold: autoextend가 발생되는 시기를 정의하는 %값입니다. thin_pool_autoextend_percent: autoextend가 진행되었을 때 확장 가능한 디스크 %을 설정합니다.

아래와 같이 파일을 설정합니다. 100G 풀에서 80G를 사용하게 될 경우 100G가 풀이 110G로 확장되겠네요.

root # cat /etc/lvm/profile/docker-thinpool.profile
activation {
    thin_pool_autoextend_threshold=80
    thin_pool_autoextend_percent=10
}

새로운 lvm 프로필을 적용시켜줍니다

root # lvchange --metadataprofile docker-thinpool docker/thinpool
  Logical volume docker/thinpool changed.

lv가 모니터링되고 있는지 확인합니다

root #  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                             monitored

기존에 사용하는 도커가 있다면 백업해줍시다

root # mkdir /var/lib/docker.bk
root # mv /var/lib/docker/* /var/lib/docker.bk

devicemapper 옵션을 설정합니다

daemon.json 파일을 수정하여 진행합니다.

root # cat /etc/docker/daemon.json
{
  "storage-driver": "devicemapper",
   "storage-opts": [
     "dm.thinpooldev=/dev/mapper/docker-thinpool",
     "dm.use_deferred_removal=true",
     "dm.use_deferred_deletion=true"
   ]
}

누락되는 마운트 포인트를 방지하기 위해 dm.use_deferred_removal, dm.use_deferred_deletion 두개의 옵션은 항상 설정해 주어야 합니다.

docker 실행

root # systemctl start docker

호스트서버에서 devicemapper 구조 확인

lsblk 명령어를 이용하여 현재의 구조를 확인 할 수 있습니다.

root # lsblk /dev/xvdb1
NAME                    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvdb1                   202:17   0  100G  0 part
├─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

그럼 이만 :-)


Tags: docker

Back to posts