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
그럼 이만 :-)