로그
도커 컨테이너로 애플리케이션을 실행할 때, 실행 중인 컨테이너의 로그를 봐야 할 때가 있다. 도커에서는 컨테이너의 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
'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 |
댓글