도커 컨테이너 용량 제한...?
아래의 링크를 참조하였습니다.
https://reece.tech/posts/docker-container-size-quota/
도커에는 컨테이너의 데이터가 너무 커지는 것을 방지하기 위해 용량을 제한하는 기능이 있습니다. 여기서는 해당 기능을 테스트 해 본 것을 적어봅니다.
사전지식
(1) xfs_quota 튜토리얼 및 red hat에서 설명하는 xfs_quota
https://www.golinuxcloud.com/configure-enable-disable-xfs-quota-grace-time/
(2) docker의 storage 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 Filesystem가 xfs인 경우 <unknown>으로 표시가 되는 것 같습니다. 이러할 경우에는 도커의 용량 제한을 사용하지 못합니다. 따라서 “yum downgrade docker-ce-cli.x86_64 docker-ce.x86_64“ 명령어로 도커의 버전을 낮추시면 될 것 같습니다.(19.03.6에서는 이상이 없습니다.)
https://github.com/moby/moby/issues/40626
(2) 호스트의 디스크는 xfs 파일시스템을 사용해야합니다.
컨테이너의 용량을 제한하는 것은 xfs의 project 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을 제공해야합니다.
(3) 도커에서 overlay가 아닌 overlay2 storage driver를 사용해야 됩니다.
overlay는 더 이상 도커에서 권장하는 storage driver가 아닙니다.
https://docs.docker.com/storage/storagedriver/overlayfs-driver/#prerequisites
또한, overlay에서 컨테이너의 용량을 제한하는 기능을 제공하는지는 잘 모르겠습니다... 자료를 찾아보아도 나오지를 않습니다.
사전작업
(1) xfs의 quota기능을 사용 가능하게끔 설정해 줍니다.
먼저 xfs의 quota기능을 사용할 수 있게끔 설정을 해 줄 필요가 있습니다. xfs의 quota기능은 user, group, project별로 사용 가능한 한도를 정해줄 수 있게끔 해 주는 xfs의 기능입니다. 이 중에서 project quota를 설정해야 xfs파일 시스템을 기반으로 한 도커의 용량 제한 기능을 사용할 수 있습니다.
설정 방법은 아래를 참조해 주시면 될 것 같습니다. 순서의 6번 정도까지 따라가시면 설정이 된 것이라고 판단해도 좋을 것입니다.
https://help.directadmin.com/item.php?id=557
(2) 도커가 overlay2를 storage driver로 사용하게끔 설정합니다.
비교적 최신 버전의 도커에서는 아래의 링크를 보고 daemon.json파일을 설정하면 됩니다.
하지만, 도커의 버전이 낮을 경우는 추가적으로 아래와 같은 옵션을 daemon.json에 추가해 줄 필요가 있습니다. 제가 테스트해 보았던 버전은 docker-ce-17.03.0.ce-1.el7.centos입니다.
"storage-opts": [
"overlay2.override_kernel_check=true"
]
도커 컨테이너 용량 제한 테스트
step 0. 해당 기능을 사용하기 위한 설정이 완료되어있는지 체크
(1) xfs의 pquota기능이 사용 가능한가
[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 ~]#
저는 docker의 Root 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:/#
호스트의 디스크 용량과 컨테이너의 사용 가능한 용량이 같은 것을 확인할 수 있습니다.