최근에 쿠버네티스를 공부할 일이 있어서 보고 있는데, 쿠버네티스 자체가 도커(Docker) 오케스트레이션을 해주는 툴이라 도커에 대한 개념이 없으니, 공부하기가 힘들었습니다. 그래서 이렇게 급하게 책을 사서 공부하면서 내용을 정리하고자 합니다.

해당 내용은 위키북스에서 나온 시작하세요! 도커 책을 보면서 정리한 내용입니다. 책의 내용이 매우 좋아서 강추합니다.

이번에는 도커의 자원들을 제한하는 법에 대해서 보도록 하겠습니다.


설정된 자원 변경하기

보통 컨테이너를 생성하는 run, create 명령어에서 자원 할당을 조정할 수 있는데, 만들어진 컨테이너의 자원도 아래 명령어를 통해서 업데이트 할 수 있습니다.

$ docker update [변경할 자원 제한] [컨테이너 이름]
$ docker update --cpuset-cpus=1 centos

컨테이너 메모리 제한

--memory를 지정하여 컨테이너의 메모리를 제한 할 수 있습니다. 단위는 m(MB), g(GB) 이며 최소 메모리는 4MB입니다.

설정한 메모리 이상으로 메모리를 사용하면 컨테이너는 자동적으로 종료됩니다.

$ docker run -d \       # -d 데몬 형태로 생성 
> --memory="1g" \       # --memory: 컨테이너의 메모리를 제한, 여기서는 1GB로 제한
> --memory-swap="3g" \  # --memory-swap: 스왑메모리를 설정할 수 있습니다, 여기서는 3GB로 설정했습니다.
> --name memory_1g \    # --name: 컨테이너의 이름을 설정, 여기서는 "memory_1g"가 이름
> nginx                 # 이미지는 nginx를 사용

컨테이너 CPU 제한

가상 머신은 특정 개수의 CPU를 할당하지만, 컨테이너는 CPU 스케쥴링에 의해서 동일한 비율로 처리됩니다. --cpu-shares를 설정하면 컨테이너가 CPU를 얼마나 차지할 것인지를 설정할 수 있습니다.

기본적으로 설정되어 있는게 1024이기 때문에 2048을 설정하면 2배 만큼 더 할당받을 수 있습니다.

docker run -i -t --name cpu_share \   # --name: 컨테이너의 이름을 설정, 여기서는 cpu_share
> --cpu-shares 2048 \                 # --cpu-shares: CPU 할당량을 설정, 여기서는 2배 (기본값 1024)
> ubuntu:14.04                        # 이미지는 ubuntu:14.04

--cpuset-cpu는 여러개의 CPU가 있을때 몇 번째 CPU를 사용하게 할지 설정할 수 있습니다. CPU의 순서는 0번부터 시작합니다.

--cpuset-cpu=2          # 3번째 CPU만 사용 
--cpuset-cpu="0,3"      # 1번째와 4번째 CPU만 사용
--cpuset-cpu="0-2"      # 1~3번째 CPU를 사용

--cpus는 좀 더 직관적으로 CPU의 개수를 할당할 수 있습니다. (기본은 1)

$ docker run -d --name cpu_container \
> --cpus=0.5 \         # --cpus: CPU할당량, 전체 CPU의 50%만 점유 (기본값 1)
> ubuntu:14.04


컨테이너의 저장 공간 설정

컨테이너 내부에서 사용되는 파일시스템의 크기는 도커가 사용하는 스토리지 드라이버에 따라 다릅니다. 만약 AUFS 이면 컨테이너는 호스트와 저장 공간의 크기를 공유하지만, Devicemapper이면 10GB의 저장 공간을 할당 받습니다.

도커 17.03.0-ce를 기준으로 컨테이너 저장 공간크기를 개별적으로 설정하는 기능은 지원되지 않지만, 도커엔진이 Devicemapper를 사용한다면, 사용설정이 가능합니다.

--storage-driver=devicemapper       # 드라이버를 devicemapper로 사용 설정
--storage-opt dm.basesize=20G       # Storage의 저장 공간 크기를 20GB로 설정 

주의) 디바이스를 매퍼를 사용하지 않다가 --storage-driver 옵션으로 디바이스매퍼를 사용하면, 기존 도커에서 사용했던 컨테이너와 이미지를 사용할 수 없습니다.

하지만 저는 overlay2이네요, 해당 부분은 한번 검색을 해서 찾아보시면 좋을거 같습니다,

$ docker info | grep Storage       
Storage Driver: overlay2