Linux(Centos or RHEL)/docker

도커 컨테이너 용량 제한...?

최소양 2020. 5. 12. 17:00

아래의 링크를 참조하였습니다.

https://reece.tech/posts/docker-container-size-quota/

 

Docker Container Size Quota · reecetech

Written by Guido Schade on April 23, 2019 Docker Container Size Quota Docker Container Size Quota Configuration We are running an on premise Kubernetes cluster on Red Hat Linux 7.5 (in VMware). The /var/lib/docker filesystem is a separate partition, forma

reece.tech

 

 

도커에는 컨테이너의 데이터가 너무 커지는 것을 방지하기 위해 용량을 제한하는 기능이 있습니다. 여기서는 해당 기능을 테스트 해 본 것을 적어봅니다.

 

사전지식

(1) xfs_quota 튜토리얼 및 red hat에서 설명하는 xfs_quota

https://www.golinuxcloud.com/configure-enable-disable-xfs-quota-grace-time/

https://access.redhat.com/documentation/en-s/red_hat_enterprise_linux/7/html/storage_administration_guide/xfsquota

 

(2) dockerstorage drivers

https://docs.docker.com/storage/storagedriver/select-storage-driver/

 

 

주의사항

(1) docker-ce-19.03.6-3.el7 버전을 이용해야 됩니다...(2020-05-12 기준)

현재최신 버전인 19.03.8과 그 이전 버전인 19.03.7에서는 Backing Filesystemxfs인 경우 <unknown>으로 표시가 되는 것 같습니다. 이러할 경우에는 도커의 용량 제한을 사용하지 못합니다. 따라서 “yum downgrade docker-ce-cli.x86_64 docker-ce.x86_64“ 명령어로 도커의 버전을 낮추시면 될 것 같습니다.(19.03.6에서는 이상이 없습니다.)

https://github.com/moby/moby/issues/40626

 

 

(2) 호스트의 디스크는 xfs 파일시스템을 사용해야합니다.

컨테이너의 용량을 제한하는 것은 xfsproject quota라는 기능을 이용하는 것 같습니다. 호스트가 xfs 파일시스템을 사용하지 않을 경우, 아래와 같은 에러를 만날 가능성이 높습니다.

 

docker: Error response from daemon: --storage-opt is supported only for overlay over xfs with 'pquota' mount option.

See 'docker run help'.

 

또한, xfs파일 시스템이 d_type을 제공해야합니다.

https://medium.com/@khushalbisht/docker-on-centos-7-with-xfs-filesystem-can-cause-trouble-when-d-type-is-not-supported-64cee61b39ab

 

 

(3) 도커에서 overlay가 아닌 overlay2 storage driver를 사용해야 됩니다.

overlay는 더 이상 도커에서 권장하는 storage driver가 아닙니다.

https://docs.docker.com/storage/storagedriver/overlayfs-driver/#prerequisites

 

또한, overlay에서 컨테이너의 용량을 제한하는 기능을 제공하는지는 잘 모르겠습니다... 자료를 찾아보아도 나오지를 않습니다.

 

 

사전작업

(1) xfsquota기능을 사용 가능하게끔 설정해 줍니다.

먼저 xfsquota기능을 사용할 수 있게끔 설정을 해 줄 필요가 있습니다. xfsquota기능은 user, group, project별로 사용 가능한 한도를 정해줄 수 있게끔 해 주는 xfs의 기능입니다. 이 중에서 project quota를 설정해야 xfs파일 시스템을 기반으로 한 도커의 용량 제한 기능을 사용할 수 있습니다.

설정 방법은 아래를 참조해 주시면 될 것 같습니다. 순서의 6번 정도까지 따라가시면 설정이 된 것이라고 판단해도 좋을 것입니다.

https://help.directadmin.com/item.php?id=557

 

 

(2) 도커가 overlay2storage driver로 사용하게끔 설정합니다.

비교적 최신 버전의 도커에서는 아래의 링크를 보고 daemon.json파일을 설정하면 됩니다.

https://docs.docker.com/storage/storagedriver/overlayfs-driver/#configure-docker-with-the-overlay-or-overlay2-storage-driver

 

 

하지만, 도커의 버전이 낮을 경우는 추가적으로 아래와 같은 옵션을 daemon.json에 추가해 줄 필요가 있습니다. 제가 테스트해 보았던 버전은 docker-ce-17.03.0.ce-1.el7.centos입니다.

 

"storage-opts": [

"overlay2.override_kernel_check=true"

]

 

https://blog.csdn.net/wangshuminjava/article/details/89310113?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

 


도커 컨테이너 용량 제한 테스트

step 0. 해당 기능을 사용하기 위한 설정이 완료되어있는지 체크

(1) xfspquota기능이 사용 가능한가

[root@centos77 ~]# mount | grep xfs

/dev/mapper/centos-root on / type xfs (rw,relatime,seclabel,attr2,inode64,usrquota,prjquota)

selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime)

/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

[root@centos77 ~]#

 

저는 dockerRoot Dir을 기본값인 ”/var/lib/docker”를 사용하였기 때문에, 해당 디렉토리의 마운트 포인트인 “/”pquota가 사용 가능하게끔 하였습니다.

 

 

(2) docker 데몬의 설정 확인

[root@centos77 ~]# docker info

...

Server Version: 19.03.6

Storage Driver: overlay2

Backing Filesystem: xfs

Supports d_type: true

...

 

도커의 버전과, Storage Driver, Backing Filesystem을 확인합니다.

 

 

step 1. run 명령어로 컨테이너의 용량 제한

https://docs.docker.com/engine/reference/commandline/run/#set-storage-driver-options-per-container

 

docker run 명령어로 컨테이너를 실행시킬 때, ”--storage-opt size=“옵션을 넣어주면 됩니다.

 

(1) 컨테이너 용량을 2G로 테스트

[root@centos77 ~]# docker run -it --rm --storage-opt size=2G ubuntu /bin/bash

root@03b8c9085865:/# df -Th

Filesystem Type Size Used Avail Use% Mounted on

overlay overlay 2.0G 8.0K 2.0G 1% /

tmpfs tmpfs 64M 0 64M 0% /dev

tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup

shm tmpfs 64M 0 64M 0% /dev/shm

/dev/mapper/centos-root xfs 27G 13G 15G 45% /etc/hosts

tmpfs tmpfs 1.9G 0 1.9G 0% /proc/asound

tmpfs tmpfs 1.9G 0 1.9G 0% /proc/acpi

tmpfs tmpfs 1.9G 0 1.9G 0% /proc/scsi

tmpfs tmpfs 1.9G 0 1.9G 0% /sys/firmware

root@03b8c9085865:/# dd if=/dev/zero of=out bs=4096k

dd: error writing 'out': No space left on device

512+0 records in

511+0 records out

2147418112 bytes (2.1 GB, 2.0 GiB) copied, 19.7608 s, 109 MB/s

root@03b8c9085865:/# exit

 

 

 

(2) 컨테이너 용량을 1G로 테스트

[root@centos77 ~]# docker run -it --rm --storage-opt size=1G ubuntu /bin/bash

root@92910cc7f400:/# df -Th

Filesystem Type Size Used Avail Use% Mounted on

overlay overlay 1.0G 8.0K 1.0G 1% /

tmpfs tmpfs 64M 0 64M 0% /dev

tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup

shm tmpfs 64M 0 64M 0% /dev/shm

/dev/mapper/centos-root xfs 27G 13G 15G 45% /etc/hosts

tmpfs tmpfs 1.9G 0 1.9G 0% /proc/asound

tmpfs tmpfs 1.9G 0 1.9G 0% /proc/acpi

tmpfs tmpfs 1.9G 0 1.9G 0% /proc/scsi

tmpfs tmpfs 1.9G 0 1.9G 0% /sys/firmware

root@92910cc7f400:/# dd if=/dev/zero of=out bs=4096k

dd: error writing 'out': No space left on device

256+0 records in

255+0 records out

1073676288 bytes (1.1 GB, 1.0 GiB) copied, 0.545906 s, 2.0 GB/s

root@92910cc7f400:/# exit

exit

[root@centos77 ~]#

 

 

 

step 2. 도커 데몬에 설정을 지정

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

 

(1) daemon.json 파일 수정 및 도커 데몬 재시작

[root@centos77 ~]# vim /etc/docker/daemon.json

{

"storage-opts": [ "overlay2.size=2G" ]

}

[root@centos77 ~]# systemctl restart docker

[root@centos77 ~]#

 

 

(2) 컨테이너를 실행

[root@centos77 ~]# docker run -it --rm ubuntu /bin/bash

root@ac1af854ab91:/# df -Th

Filesystem Type Size Used Avail Use% Mounted on

overlay overlay 2.0G 8.0K 2.0G 1% /

tmpfs tmpfs 64M 0 64M 0% /dev

tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup

shm tmpfs 64M 0 64M 0% /dev/shm

/dev/mapper/centos-root xfs 27G 13G 15G 45% /etc/hosts

tmpfs tmpfs 1.9G 0 1.9G 0% /proc/asound

tmpfs tmpfs 1.9G 0 1.9G 0% /proc/acpi

tmpfs tmpfs 1.9G 0 1.9G 0% /proc/scsi

tmpfs tmpfs 1.9G 0 1.9G 0% /sys/firmware

root@ac1af854ab91:/# dd if=/dev/zero of=out bs=4096k

dd: error writing 'out': No space left on device

512+0 records in

511+0 records out

2147418112 bytes (2.1 GB, 2.0 GiB) copied, 1.24696 s, 1.7 GB/s

root@ac1af854ab91:/# exit

exit

[root@centos77 ~]#

 

 

(3) 도커 데몬 설정을 원상 복구시키고, 다시 컨테이너를 실행

[root@centos77 ~]# vim /etc/docker/daemon.json

{

}

[root@centos77 ~]# systemctl restart docker

[root@centos77 ~]# docker run -it --rm ubuntu /bin/bash

root@87be143a761d:/# df -Th

Filesystem Type Size Used Avail Use% Mounted on

overlay overlay 27G 13G 15G 45% /

tmpfs tmpfs 64M 0 64M 0% /dev

tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup

shm tmpfs 64M 0 64M 0% /dev/shm

/dev/mapper/centos-root xfs 27G 13G 15G 45% /etc/hosts

tmpfs tmpfs 1.9G 0 1.9G 0% /proc/asound

tmpfs tmpfs 1.9G 0 1.9G 0% /proc/acpi

tmpfs tmpfs 1.9G 0 1.9G 0% /proc/scsi

tmpfs tmpfs 1.9G 0 1.9G 0% /sys/firmware

root@87be143a761d:/#

 

호스트의 디스크 용량과 컨테이너의 사용 가능한 용량이 같은 것을 확인할 수 있습니다.