여니의 프로그래밍 study/도커, 쿠버네티스

[2장-3] 도커 엔진

여니's 2024. 3. 3. 12:01

 

참고서적 : 시작하세요! 도커/쿠버네티스


 

(8) 컨테이너 로깅

1. json-file 로그 사용하기

도커는 컨테이너의 표준 출력과 에러 로그를 

별도의 메타데이터 파일로 저장하며

이를 확인하는 명령어를 제공함.

 

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

 

 

mysql과 같은 어플리케이션을 구동하는 컨테이너는

포그라운드 모드로 실행이 되므로

-d 옵션을 써서 백그라운드 모드로 컨테이너를 생성하는 경우가 많음

 

docker logs 명령어를 써서

컨테이너의 표준 출력을 확인함으로써

애플리케이션의 상태를 알 수 있음

 

docker logs mysql

 

 

위 명령어를 입력하면

로그를 확인할 수 있음

 

 

-e 옵션을 제거하면

mysql 실행에 필요한 환경변수를

지정하지 않아 컨테이너가 시작되지 않는다.

 

docker run -d --name no_passwd_mysql mysql:5.7

 

docker ps --format "table {{.ID}}\t{{.Status}}\t{{.Ports}}\t{{.Names}}"

 

docker start no_passwd_mysql

 

docker ps --format "table {{.ID}}\t{{.Status}}\t{{.Ports}}\t{{.Names}}"

 

docker logs no_passwd_mysql

 

docker logs 명령어를 쓰면

간단하고 빠르게 에러 확인이 가능함

 

docker logs --tail 2 mysql

> 컨테이너 로그 중 마지막 2줄만 출력하는 명령어

 

 

docker logs audfuddjsms

run 명령어에서 -i -t 옵션을 설정해

docker attach 명령어를 사용할 수 있는 컨테이너에도 쓸 수 있고

컨테이너 내부에서 bash 셸 등을 입출력한 내용을 

확인할 수 있음.

 

 

기본적으로 컨테이너 로그는 JSON 형태로

도커 내부에 저장된다.

해당 파일은 다음 경로에 컨테이너의 ID로 시작하는 파일명으로 저장됨

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

 


 

2. syslog 로그

컨테이너의 로그는 JSON 뿐 아니라

syslog로 보내 저장하도록 설정이 가능함

 

syslog는 유닉스 계열 운영체제에서

로그를 수집하는 오래된 표준 중 하나로서

커널, 보안 등 시스템과 관련된 로그,

애플리케이션의 로그 등 다양한 종류의 로그를 수집해 저장함

 

유닉스 계열 운영체제에서는

syslog를 사용하는 인터페이스가 동일하기 때문에

체계적으로 로그를 수집하고 분석할 수 있다는 장점이 있음

 

syslog에 로그를 저장하는 컨테이너 생성 명령어

 

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

 

 

syslogtest라는 문구를 출력하고

컨테이너는 종료된다.

 

syslog 로깅 드라이버는

기본적으로 로컬호스트의 syslog에 저장하므로 

운영체제 및 배포판에 따라 syslog 파일의 위치를 알아야

이를 확인할 수 있음

 

 

syslog를 원격 서버에 설치하면

로그 옵션을 추가해

로그 정보를 원격 서버로 보낼 수 있음

 

syslog를 원격에 저장하는 방법 중 하나인

rsyslog를 써서

중앙 컨테이너로 로그를 저장할 수 있음

 

 

서버 호스트 > rsyslog 서비스가 시작하도록 컨테이너 구동

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

 

rsyslog 컨테이너 생성

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

 

 

컨테이너 내부의 rsyslog.conf 파일을 열어

syslog 서버를 구동시키는 항목의 주석을 해제한 후

변경사항을 저장함

 

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

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

tag : 로그 데이터가 기록될 때 함께 저장될 태그

 

 


 

3. fluentd 로깅

: fluentd는 각종 로그를 수집하고 저장할 수 있는 기능을 제공하는

오픈소스 도구 중 하나로

도커 엔진의 컨테이너의 로그를 fluentd를 통해

저장할 수 있도록 플러그인을 공식적으로 제공함

 

 

데이터 포맷으로 JSON을 사용하기 때문에

쉽게 사용할 수 있고

수집되는 데이터를 AWS S3, HDFS, MongoDB 등 다양한 저장소에

저장할 수 있다는 장점이 있음

 

특정 호스트에 생성되는 컨테이너는

하나의 fluentd 서버에 접근하고

fluentd는 몽고 DB에 데이터를 저장하는 구조임

 

 

각 서버 호스트에 fluentd 를 설치할 수도 있고

테스트를 위해 몽고 DB 서버, fluentd 서버, 도커 서버가

하나의 물리 머신에서 동작하도록 구성할 수도 있음

 

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

 

 fluent.conf 파일의 주 내용은

들어오는 로그 데이터를 몽고 DB에 전송

access라는 이름의 컬렉션에 로그를 저장하며

몽고 DB 컨테이너의 호스트 주소와 포트를 지정

 

 


 

9) 컨테이너 자원 할당 제한

컨테이너를 생성하는 run, create 명령어에서

컨테이너의 자원 할당량을 조정하도록

옵션을 입력할 수 있음

 

이를 설정하지 않으면

호스트의 자원을 모두 점유해서

다른 컨테이너들 뿐만 아니라

호스트 자체의 동작이 멈출 수 있음

 

docker inspect 명령어를 입력하여

컨테이너에 설정된 자원 제한을 확인할 수 있음

 

docker inspect rsyslog

 

 

자원 할당을 제한하기 위한 대표적인 방법

 

docker update (변경할 자원 제한 (컨테이너 이름)

ex.
docker update --cpuset-cups=1 centos ubuntu

 

 

1. 컨테이너 메모리 제한

: docker run 명령어에 --memory를 지정해서

컨테이너의 메모리를 제한할 수 있음

 

입력할수 있는 단위는 m, g이며

제한할수 있는 최소 메모리는 6MB

 

컨테이너의 메모리 사용량을 1GB로 제한하는 명령어

 

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

 

 

컨테이너에 할당된 메모리를 초과하면

컨테이너는 자동으로 종료되므로

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

 

docker inspect memory_1g | grep \"Memory\" "Memory":1073741824

 

 

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

'여니의 프로그래밍 study > 도커, 쿠버네티스' 카테고리의 다른 글

[2장-4] 도커 엔진  (0) 2024.03.13
[2장-1] 도커 엔진  (0) 2024.02.04
[1장] 도커란?  (1) 2024.01.21