티스토리 뷰

728x90
반응형

컨테이너 로깅

json-file 로그 사용하기

도커는 컨테이너의 표준 출력과 에러 로그를 별도의 메타데이터 파일로 저장하며 이를 확인하는 명령어를 제공한다.

$ docker run -d --name mysql \
> -e MYSQL_ROOT_PASSWORD=1234 \
> mysql:5.7

docker logs 명령어는 컨테이너 내부에서 출력을 보여주는 명령어이다.

$ docker logs mysql

컨테이너가 정상적으로 실행 및 동작하지 않고 docker attach 명령어도 사용하지 못하는 개발 환경에서 docker logs 명령어를 쓰면 간단하고 빠르게 에러 확인 가능.

--since 옵션에 유닉스 시간을 입력해 특정 시간 이후의 로그를 확인할 수 있으며, -t 옵션으로 타임스탬프를 표시할 수도 있다. 컨테이너에서 실시간으로 출력되는 내용을 확인하려면 -f 옵션을 써서 로그를 스트림으로 확인할 수도 있다.

$ docker logs --since 1474765979 mysql

$ docker logs -f -t mysql

docker logs 명령어는 run 명령어에서 -it 옵션을 설정해 docker attach 명령어를 사용할 수 있는 컨테이너에도 쓸 수 있으며, 컨테이너 내부에서 bash 셸 등을 입출력한 내용을 확인할 수 있다.

$ docker run -it --name logstest ubuntu:14.04
root@70a3cbf08551:/# echo test!
test!

$ docker logs logstest

기본적으로 위와 같은 컨테이너 로그는 JSON 형태로 도커 내부에 저장된다. 이 파일은 다음 경로에 컨테이너ID로 시작하는 파일명으로 저장된다.

# sudo에서
$ cat /var/lib/docker/containers/컨테이너ID/컨테이너ID-json.log

--log-opt 옵션으로 컨테이너 json 로그 파일의 최대 크기를 지정할 수 있다.

$ docker run -it --log-opt max-size=10k --log-opt max-file=3 --name log-test ubuntu:14.04

어떠한 설정도 하지 않았다면 도커는 위와 같이 컨테이너 로그를 JSON 파일로 저장하지만 그 밖에도 각종 로깅 드라이버를 사용하게 설정해 컨테이너 로그를 수집할 수 있다. 사용 가능한 드라이버의 대표적인 예로 syslog, journald, fluentd, awslogs 등이 있다.



syslog 로그

컨테이너의 로그는 JSON뿐 아니라 syslog로 보내 저장하도록 설정할 수 있다. 다음 명령어를 입력해 syslog에 로그를 저장하는 컨테이너를 생성하고 로그를 확인하자.

$ docker run -d --name syslog_container --log-driver=syslog ubuntu:14.04 echo syslogtest

$ tail /var/log/syslog



fluentd 로깅

fluentd는 각종 로그를 수집하고 저장할 수 있는 기능을 제공하는 오픈소스 도구로서, 도커 엔진의 컨테이너 로그를 fluentd를 통해 저장할 수 있도록 플러그인을 공식적으로 제공한다. fluentd은 데이터 포맷으로 JSON을 사용하기 때문에 쉽게 사용할 수 있을뿐만 아니라 수집되는 데이터를 AWS S3, HDFS, MongoDB 등 다양한 저장소에 저장할 수 있다는 장점이 있다.

fluentd와 몽고DB를 연동해 데이터를 저장하는 방법을 알아보자. 어떤 컨테이너가 fluentd에 접근하고, fluentd는 몽고DB에 데이터를 저장하는 구조이다.

example

각각 다른 서버에 설치하면 힘드니깐 한개로 위의 구성도로 설치해보자. 여기서부터 IP는 본인걸 확인해서 본일걸 적어야됨.

몽고DB 설치

$ docker run --name mongoDB -d -p 27017:27017 mongo

fluent.conf 파일을 생성하자. 이건 fluent에 들어오는 로그 데이터를 몽고DB에 전송하고, access라는 이름의 컬렉션에 로그를 저장하며, 몽고DB 컨테이너의 호스트 주소와 포트를 지정한다. 는 로그의 태그가 docker로 시작하면 이를 MongoDB에 전달하는 것을 의미한다.

<source>
  @type forward
</source>

<match docker.**>
  @type mongo
  database nginx
  collection access
  host 192.168.10.2
  port 27017
  flush_interval 10s
</match>

fluent.conf파일이 저장된 디렉터리에서 다음 명령어를 입력해 fluentd 컨테이너를 생성한다. fluentd 이미지에 몽고DB에 연결하는 플러그인이 내장되있는 저자님의 도커이미지를 내려받는다.

$ docker run -d --name fluentd -p 24224:24224 -v $(pwd)/fluent.conf:/fluentd/etc/fluent.conf -e FLUENTD_CONF=fluent.conf alicek106/fluentd:mongo

이제 로그를 수집할 테스트 컨테이너 nginx를 생성하자. --log-opt tag랑 fluent.conf의 태그에 맞아서 몽고DB에 저장된다.

$ docker run -p 80:80 -d --log-driver=fluentd --log-opt fluentd-address=192.168.10.2:24224 --log-opt tag=docker.nginx.webserver nginx

80번 포트의 웹서버에 한번 접근해서 로그를 남기고 몽고DB 컨테이너에 들어가 로그를 확인하자.

$ docker exec -it mongoDB mongo

>show dbs

> use nginx

> show collections

> db['access'].find()



컨테이너 자원 할당 제한

컨테이너를 생성하는 run, create 명령어에서 컨테이너의 자원 할당량을 조정하도록 옵션을 사용할 수 있다. 컨테이너에 자원 할당 옵션을 설정하지 않으면 호스트의 자원을 전부 점유해 다른 컨테이너들뿐만 아니라 호스트 자체의 동작이 먼풀 수도 있다.

설정된 자원 제한을 확인하는 방법은 docker inspect 명령어를 입력하는 것이다.



컨테이너 메모리 제한

docker run 명령어에 --memory를 지정해 컨테이너의 메모리를 제한할 수 있다.

$ docker run -d --memory="1g" --name memory_1g nginx

$ docker inspect memory_1g | grep \"Memory\"



컨테이너 CPU 제한

--cpu-shares

--cpu-shares 옵션은 컨테이너에 가중치를 설정해 해당 컨테이너가 CPU를 상대적으로 얼마나 사용할 수 있는지를 나타낸다. 시스템에 존재하는 CPU를 어느 비중만큼 나눠 쓸 것인지를 명시하는 옵션이다.

$ docker run -it --name cpu_share --cpu-shares 1024 ubuntu:14.04

아무런 설정을 하지 않았을 때 컨테이너가 가지는 값이 1024이고, CPU 할당에서 1의 비중을 의미한다.

실제로 --cpu-shares 옵션이 어떻게 동작하는지 확인해보자.

$ docker run -d --name cpu_1024 --cpu-shares 1024 alicek106/stress stress --cpu 1

$ ps aux | grep stress
# 100퍼 사용

$ docker run -d --name cpu_512 --cpu-shares 512 alicek106/stress stress --cpu 1
# 시간이 충분히 흐른뒤..

$ ps aux | grep stress
# 두컨테이너가 cpu를 2:1 비율로 사용함.

지금 위에서 실행한 2개의 컨텐이너는 꼭 중지해야된다. 안그러면 cpu 부하 계속줌.



--cpuset-cpus

호스트에 CPU가 여러 개 있을 때 --cpuset-cpus 옵션을 지정해 컨테이너가 특정 CPU만 사용하도록 설정할 수 있다. 컨테이너가 3번째 CPU만 사용하도록 설정해보자.

$ docker run -d --name cpuset_2 --cpuset-cpus=2 alicek106/stress stress --cpu 1

$ sudo apt-get install htop
# CPU별로 사용량을 확인하는 도구.

$ htop



--cpu-period, --cpu-quota

컨테이너의 CFS(Completely Fair Scheduler) 주기는 기본적으로 100ms로 설정되지만 run 명령어의 옵션 중 --cpu-period--cpu-quota로 이 주기를 변경할 수 있다.

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

--cpu-period의 값은 기본적으로 100000이며, 이는 100ms를 뜻한다. --cpu-quota는 --cpu-period에 설정된 시간 중 CPU 스케줄링에 얼마나 할당할 것인지를 설정한다. 위에 컨테이너는 100000 중 25000만큼을 할당해 CPU 주기가 1/4로 줄었으므로 CPU 성능이 일반적인 컨테이너 CPU 성능의 1/4이 된다.

성능을 비교해보자.

$ docker run -d --name quota_1_1 --cpu-period=100000 --cpu-quota=100000 alicek106/stress stress --cpu 1

$ ps aux | grep stress
25
...
...
100

첫 번째 컨테이너가 두번째 컨테이너의 1/4 정도로 CPU를 사용하고 있음.

병렬 처리를 위해 CPU를 많이 소모하는 워크로드를 수행해야 한다면 --cpuset-cpu 옵션을 사용하는 것이 좋다. --cpuset-cpu 옵션을 사용하면 특정 컨테이너가 특정 CPU에서만 동작하는 CPU 친화성을 보장할 수 있고, CPU 캐시 미스 또는 컨텍스트 스위칭과 같이 성능을 하락시키는 요인을 최소화할 가능성이 높아지기 때문이다.





출처
시작하세요! 도커/쿠버네티스(용찬호 저, 위키북스)
example

728x90
반응형
댓글
반응형
250x250
글 보관함
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday
링크