Docker&Kubernetes

[Docker] 도커 엔진 (컨테이너 로깅, logs, syslog, memory)

랩실외톨이 2024. 3. 1. 21:23
반응형

 

 

 

 

 

 

컨테이너 로깅

 

json-file 로그 사용하기

 

컨테이너 내부에서 어떤 일이 일어나는지 아는 것은 디버깅, 운영 측면에서 중요

도커 컨테이너의 표준 출력(StdOut)과 에러(StdErr) 로그를 별도의 메타데이터 파일로 저장하고 이를 확인하는 명령어 제공

 

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

 

 

mysql과 같은 애플리케이션을 구동하는 컨테이너는 포그라운드 모드로 실행되기 때문에 -d 옵션을 사용해 백그라운드 모드로 컨테이너 생성.

=> 잘 구동되는지 여부는 알 수 없지만 docker logs 명령어를 써서 컨테이너의 표준 출력 확인

 

 

 

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

 

docker run -d --name no_passwd_mysql \
mysql:5.7

 

 

-e 옵션을 제외하고 동일한 컨테이너를 생성했습니다.

 

 

 

컨테이너 목록을 조회해 보니 no_passwd 컨테이너는 생성됐으나 실행되지 않았습니다.

docker start 명령어로 다시 시작해도 컨테이너는 다시 시작되지 않습니다.

 

 

 

 

 

docker logs 명령어로 애플리케이션에 무슨 문제가 있는지 확인해 보겠습니다.

 

 

 

 

mysql에 실행에 필요한 환경변수를 지정하지 않아 컨테이너가 시작되지 않았습니다.

이처럼 컨테이너가 정상적으로 작동하지 않고, docker attach 명령어도 사용하지 못하는 개발 환경에서 logs 명령어를 사용하면 간단하고 빠르게 에러를 확인할 수 있습니다.

 

 

 

 

--tail: 마지막 로그 줄부터 출력할 줄의 수를 설정 가능

--since: 유닉스 시간을 입력해 특정 시간 이후의 로그 확인 가능

-t: 타임스탬프 표시

-f 로그를 스트림으로 확인가능

 

 

 

 

run 명령어에서 -it 옵션을 설정해 docker attach 명령어를 사용할 수 있는 컨테이너에도 사용 가능.

컨테이너 내부에서 bash 셸 등을 입출력한 내용을 확인 가능.

 

 

 

 

반응형

 

 

 

 

위와 같은 컨테이너 로그는 JSON 형태로 도커 내부에 저장됩니다.

 

 cat /var/lib/docker/containers/{container ID}/{container ID}-json.log

 

 

컨테이너 내부 출력이 너무 많은 상태로 방치하면 json 파일의 크기가 커져 호스트의 저장 공간을 차지.

 

--log--opt: 컨테이너 json 로그 파일의 최대 크기를 지정.

max-size: 로그 파일의 최대 크기

max-file: 로그 파일의 개수

 

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

 

 

설정을 안 했다면 도커는 컨테이너 로그를 json 파일로 저장하지만,

각종 로깅 드라이버를 사용하게 설정해 컨테이너 로그를 수집할 수 있습니다.

ex) syslog, journald, fluentd, awslogs

 

 

 

 

 

반응형

 

 

 

 

syslog 로그

 

컨테이너의 로그는 JSON뿐 아니라 syslog로 보내 저장하도록 설정 가능

유닉스 계열 운영체제에서 로그를 수집하는 오래된 표준

 

커널, 보안 등 시스템과 관련된 로그, 애플리케이션의 로그 등 다양한 종류의 로그를 수집해 저장

대부분의 유닉스 계열 운영체제에서는 syslog를 사용하는 인터페이스가 동일, 체계적으로 로그를 수집하고 분석할 수 있다는 장점이 있음

 

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

 

syslog에 로그를 저장하는 컨테이너를 생성했습니다.

컨테이너의 커맨드가 echo syslogtest로 설정되기 때문에 syslogtest라는 문구를 출력하고 컨테이너는 종료됩니다.

 

syslog 로깅 드라이버는 로컬 호스트의 syslog에 저장하므로 운영체제 및 배포판에 따라 syslog 파일의 위치가 다름

 

우분투 14.04: /var/log/syslog

CentOS, RHEL: /var/log/messages

우분투 16:04, Core OS: journalctl -u docker.service 명령어

 

syslog를 원격 서버에 설치하면 로그 옵션을 추가해 로그 정보를 원격 서버로 보낼 수 있습니다.

rsyslog를 써서 중앙 컨테이너로 로그를 저장할 수 있습니다.

 

이를 위해서는 서버, 클라이언트 각 두 개의 머신을 따로 설정해야 합니다.

서버 호스트: 192.168.0.100

클라이언트 호스트: 192.168.0.101

 

서버 호스트에 rsyslog 서비스가 시작하도록 설정된 컨테이너를 구동하고,

클라이언트 호스트에서 컨테이너를 생성해 서버의 rsyslog 컨테이너에 로그를 저장합니다.

저는 서버, 클라이언트를 갖출 수 있는 환경이 아니어서 코드만 작성해 보겠습니다.

 

docker run -t -i \
-h rsyslog \
--name rsyslog_server \
-p 514:514 -p 514:514/udp \
ubuntu:14.04

 

rsyslog 컨테이너를 생성했습니다.

이제 컨테이너 내부에 rsyslog.conf 파일을 열어 syslog 서버를 구동시키는 항목의 주석을 해제한 후 변경 사항을 저장하겠습니다.

 

vi /etc/rsyslog.conf

 

 

 

#provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

#provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

 

 

설정 후 rsyslog 서비스를 재시작합니다.

 

service rsyslog restart

 

 

 

 

반응형

 

 

 

 

 

이 컨테이너를 나와 클라이언트 호스트에서 컨테이너를 생성합니다.

로그를 기록하기 위해 echo 명령어도 실행합니다.

 

docker run -i -t \
--log-driver=syslog \
--log-opt syslog-address=tcp://192.168.0.100:514 \
--log-opt tag="mylog" \
ubuntu:14.04

//컨테이너 생성 후
echo test

 

 

--log-opt: 로깅 드라이버에 추가할 옵션.

syslog-address에: rsyslog 컨테이너에 접근할 수 있는 주소 입력.

tag: 로그 데이터가 기록될 때 함께 저장될 태그, 로그를 분류하기 위해 사용

 

tail /var/log/syslog

 

 

다시 서버의 rsyslog 컨테이너로 돌아와 컨테이너 내부의 syslog 파일을 확인하면 로그가 전송된 것을 확인할 수 있습니다.

 

--log-opt 옵션으로 syslog-facility를 쓰면 로그가 저장될 파일을 바꿀 수 있습니다.

facility: 로그를 생성하는 주체에 따라 로그를 다르게 저장하는 것.

기본적으로 deamon으로 설정돼 있지만 kern, user, mail 등 다른 facility 사용 가능

 

 

 

 

반응형

 

 

 

 

 

컨테이너 자원 할당 제한

 

컨테이너를 생성하는 run, create 명령어에서 컨테이너의 자원 할당량을 조정하도록 옵션을 입력할 수 있습니다.

아무런 옵션을 입력하지 않으면 컨테이너는 호스트의 자원을 제한 없이 쓸 수 있게 설정됩니다.

효율을 위해서는 자원 할당을 제한해 호스트와 다른 컨테이너의 동작을 방해하지 않게 설정하는 것이 좋습니다.

 

 

docker inspect 명령어를 입력하면 현재 컨테이너의 자원 제한을 확인할 수 있습니다.

자원 할당을 제한하기 위해 컨테이너에 적용할 수 있는 옵션은 많지만, 대표적인 몇 가지만 알아보겠습니다.

 

컨테이너 메모리 제한

 

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

m(mega), g(giga) byte이며 제한할 수 있는 메모리는 최소 4MB입니다.

 

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

 

 

 

 

컨테이너 내에서 동작하는 프로세스가 컨테이너에 할당된 메모리를 초과하면 컨테이너는 자동으로 종료되기 때문에

애플리케이션에 따라 메모리를 적절하게 할당하는 것이 좋습니다.

 

docker run -d --name memory_6m \
--memory="6m" \
mysql

 

 

메모리를 6mb로 설정해서 컨테이너를 생성했습니다.

 

 

 

 

하지만 너무 메모리 할당량이 적어서 메모리 부족으로 인해 컨테이너가 실행되지 않았습니다.

 

컨테이너의 Swap 메모리는 메모리의 2배로 설정되지만 별도로 지정할 수 있습니다.

 

docker run -it --name swap_500m \
--memory=200m \
--memory-swap=500m \
ubuntu:14.04

 

 

위의 코드처럼 Swap 메모리를 500mb, 메모리를 200mb로 설정해 컨테이너를 생성할 수 있습니다.

 

*Swap 메모리란?

 

비휘발성인 저장 매체 (일반적으로 디스크 공간)를 사용하여 메모리 부족 시 데이터를 저장하는 데 사용
램이 가득 차거나 필요한 경우에만 사용
시스템이 재부팅되어도 스왑 메모리에 저장된 데이터는 유지

 

 

 

 

 

출처: 시작하세요! 도커 / 쿠버네티스

 

 

반응형