본문 바로가기
DevOps/Docker

7. 도커 컨테이너 로그와 자원 할당 제한

by 비어원 2022. 5. 17.
728x90

로그

도커 컨테이너로 애플리케이션을 실행할 때, 실행 중인 컨테이너의 로그를 봐야 할 때가 있다. 도커에서는 컨테이너의 stdout, stderr 로그를 별도의 메타데이터 파일로 저장하여 이를 확인하는 명령어를 제공한다.

$ docker logs ${container-name}
$ docker logs --tail 10 ${container-name}
$ docker logs -f ${container-name}
  • 로그가 너무 많다면 tail 옵션을 통해 마지막 로그 줄부터 읽을 수 있다.
  • -f 옵션을 통해 로그를 실시간으로 조회할 수 있다.

 

그러면 실제로 컨테이너의 로그는 어디에 저장될까? 컨테이너 로그는 JSON 형태로 도커 내부에 저장된다. 이 파일은 다음 경로로 저장된다.

/var/lib/docker/containers/${CONTAINER_ID}/${CONTAINER_ID}-json.log

 

실제로 ls 명령어를 써보면 여러개의 로그 디렉터리가 생성되어있는 것을 확인할 수 있다.

ls /var/lib/docker/containers

099746617cc4744f02c5eacd66ba8a0015d86b26424c5a183dffa5863e70a057  6eb713c38f9bfce25ec22335029b008e01c5c3549b0dddd7977361fb1eaf8c99
149315e78b74fd529ab8d2c7bfbb6615a3f91b58c07c767900d0118149fd4114  71da72806042a558f02c8e787ac8f9235e27d800f235d8a95c08086d9844c5ca
224ee5243d7be1484ccfd4643c132a5fe44020105f6f8b96c3fe81f8a8d5ee3a  75afa94effc93c05b5aecd8956ce252a8ee3febdb9ac02c8a1b1af043317f978
3fe3a825157278fbd11196678f39401c694247c14a3f85521d9a1efa72260b54  7f0faebe9159cb185599110cfe7a51ca781605e63073b328f9d0ed904816bb81
4611a79cb4dd58c38a15758ddab542fad5421f8a8ef53e49d4f94ec010018b96  ab60ea0dd4a3375da3cd8cae01a697211c45b30dacee3cf5d518bd6f675f2f80
5c28ac49b59955c0d20357473b67c8c2aa930e6968751bc903b641b7665f8466  b5af0353760e3b22c4fad2ef7cc25b1df359a7ec7ce857e0fd2494ab10f52974
60c8f09bce8a005e45f5bcda11a0027f9db41801900006eccf99b16fd3da221c  cd1eaaea651be83a1eb6569c46c93ac06c2f058b1b77648661b7c025bd0422db
6adb1dcf92ffe84b616606bcf8afe88cb5bcc2efeb3eda2f9626220492702c04  cd82d65e5b550d39079740330006a4766aad89b06c56f28a715b4c44e4704674

로그는 컨테이너가 구동 중이라면 지속적으로 쌓이기 때문에 언젠가는 호스트의 가용 용량보다 더 커질 수도 있다. 이를 방지하기 위해서 로그 파일의 크기를 제한시킬 수 있다.

  • --log-opt max-size=${SIZE} : 로그파일의 최대 크기
  • --log-opt max-file=${FILE_NUM} : 로그파일 개수

 

컨테이너 자원 할당 제한

컨테이너를 생성할 때 컨테이너의 자원 할당량을 조정하도록 옵션을 줄 수 있다. 아무런 옵션을 주지 않는다면 컨테이너는 호스트의 자원을 제한 없이 사용할 수 있다. 만약 하나의 호스트에 여러 컨테이너가 구동 중인데 한 컨테이너가 호스트의 자원을 모두 사용한다면 다른 컨테이너의 동작이 멈출 수 있기 때문에 자원할당 옵션을 설정하여 한 컨테이너가 자원을 독차지하여 다른 컨테이너에게 영향을 주지 않도록 하는 것이 좋다.

 

컨테이너에 할당된 자원 확인

컨테이너에 할당된 자원은 docker inspect 명령어를 사용하여 볼 수 있다. (### 표시된 것이 grep 결과)

$ docker inspect nginx | grep Cpu -C 3
    ...
    "Isolation": "",
    "CpuShares": 0,                    ###
    "Memory": 0,
    "NanoCpus": 0,
    "CgroupParent": "",
    "BlkioWeight": 0,
    "BlkioWeightDevice": [],
    --
    "BlkioDeviceWriteBps": null,
    "BlkioDeviceReadIOps": null,
    "BlkioDeviceWriteIOps": null,
    "CpuPeriod": 0,                    ###
    "CpuQuota": 0,                    ###
    "CpuRealtimePeriod": 0,            ###
    "CpuRealtimeRuntime": 0,        ###
    "CpusetCpus": "",                ###
    "CpusetMems": "",                ###
    "Devices": [],
    "DeviceCgroupRules": null,
    "DeviceRequests": null,
    --
    "OomKillDisable": false,
    "PidsLimit": null,
    "Ulimits": null,
    "CpuCount": 0,                    ###
    "CpuPercent": 0,                ###
    "IOMaximumIOps": 0,
    "IOMaximumBandwidth": 0,
    ...

 

컨테이너 메모리 제한

컨테이너의 메모리를 제한하는 방법은 다음과 같다.

$ docker run -d \
    --memory=200m \
    --memory-swap=200m \
    --name memory-200m \
    nginx
  • --memory : 메모리 사용량 제한
  • --memory-swap : 스왑 메모리 사용량 제한, memory-swap >= memory 기본적으로 memory-swap == 2 * memory

 

컨테이너 CPU 제한

컨테이너의 CPU를 제한하는 방법은 다음과 같다.

$ docker run -d \
    --cpu-shares 1024 \
    --name cpu-1024 \
    nginx
  • --cpu-shares: 호스트에서 상대적으로 사용할 수 있는지 나타내는 값, 1024 = 1의 비중을 가진다.
  • cpu-shares=1024 가 1개, cpu-shares=512가 1개 있다면 1024가 66%, 512가 33% 차지, 즉 cpu-shares(i)/Sum(cpu-shares) 비중

 

--cpuset-cpus

호스트의 CPU가 여러 개 있을 때 --cpuset-cpus 옵션을 통해 특정 CPU만 사용하도록 지정할 수도 있다.

$ docker run -d \
--name cpuset_2 \
--cpuset-cpus=2 \
alicek106/stress \
stress --cpu 1
  • ,를 통해 여러가지의 cpu를 선택할 수 있다. --cpuset-cpus=1,3 (2,4 번째 CPU)
  • - 를 통해 범위를 지정할 수 있다. --cpuset-cpus=0-2 (1,2,3 번째 CPU)

 

htop 으로 코어별 CPU 사용량을 확인할 수 있다. 확인을 위해 htop을 먼저 설치해보자.

$ apt-get install htop

 

설치가 완료되었다면 htop 명령어를 입력하여 코어별 CPU 사용량을 확인해보자.

$ htop

htop 결과 필자가 실습하고 있는 머신의 CPU는 6코어인데 3번 CPU만 사용되는 것을 확인할 수 있다.

 

--cpu-period, --cpu-quota

컨테이너의 CFS(Completely Fair Scheduler) 주기는 기본적으로 100ms인데 --cpu-period, --cpu-quota 옵션을 통해 주기를 변경할 수 있다.

--cpu-period는 기본값은 100,000 이며 단위는 μs이다. (100ms)

--cpu-quota--cpu-period에 설정된 시간 중 CPU 스케줄링에 얼마나 할당될 것인지를 설정한다.

 

예를 들어 다음과 같이 설정한다고 하자.

$ docker run -d --name quota_1_4 \
--cpuset-cpus=2 \
--cpu-period=100000 \
--cpu-quota=25000 \
alicek106/stress \
stress --cpu 1

 

위의 예시에서는 100,000 중 25,000 만큼을 할당해 CPU 주기가 1/4로 줄어들었으므로 일반적인 컨테이너보다 CPU 성능이 1/4 정도로 감소하게 된다. 즉, 컨테이너는 --cpu-quota/--cpu-period 만큼의 CPU 시간을 할당받는다.

여기서 htop을 하면 3번 CPU에 1/4 보다 조금 많은 값을 쓰는 것을 알 수 있다. 컨테이너를 제외한 다른 곳에서도 약간의 3번 CPU를 사용하기 때문이다.

 

--cpus

--cpus 옵션은 직관적으로 CPU의 개수를 직접 지정한다. 예를 들어 --cpus=0.5 로 설정하면 --cpu-period=100000 --cpu-quota=50000 과 동일한 효과를 가진다.

$ docker run -d --name cpus_container \
--cpus=0.5 \
alicek106/stress \
stress --cpu 1
728x90

'DevOps > Docker' 카테고리의 다른 글

Harbor Private Registry 소개 및 설치  (1) 2023.10.09
6. Dockerfile  (0) 2022.05.14
5. Docker Image  (0) 2022.05.14
4. Docker Network  (0) 2022.05.14
3. Docker Volume  (0) 2022.04.24

댓글