Docker Logging 및 자원 할당
Docker Logging
- 컨테이너의 표준 출력(StdOut)과 에러(StdErr) 로그를 별도의 메타데이터 파일로 저장하며 이를 확인하는 명령어를 제공함
 $ docker logs [컨테이너명]- 컨테이너 내부에서 출력을 보여주는 명령어
 
$ docker logs --tail n [컨테이너명]: 최근 n개의 줄의 로그만 보여줌$ docker logs -f [컨테이너명]: 로그를 스트림으로 확인할 수 있음
로그 저장방식
- 컨테이너 로그는 JSON 형태로 도커 내부에 저장됨
 --log-opt옵션으로 컨테이너 Json 로그 파일의 최대 크기를 지정할 수 있음docker run -it
–log-opt max-size=10k –log-opt max-file=3
–name log-test ubuntu:14.04- 각종 로깅 드라이버를 사용하여 수집할 수도 있음
 - 도커 데몬에 적용함으로 모든 컨테이너에서 일괄적으로 동일한 조건으로 사용할 수도 있음
    
DOCKER_OPTS="--log-driver=syslog"
 
syslog 로그
- 컨테이너 로그는 JSON 뿐만 아니라 syslog로 보내 저장하도록 설정할 수 있음
    
syslog란?
유닉스 계열 운영체제에서 로그를 수집하는 오래된 표준 중 하나 커널, 보안 등 시스템과 관련된 로그, 어플리케이션의 로그 등 다양한 로그를 수집해 저장함
 - 기본적으로 로컬호스트의 syslog에 저장
 - 운영체제 및 배포판에 따라 syslog 파일의 위치를 알아야 확인이 가능
 - 우분투
    
- /var/log/syslog
 
 - 
    
CentOS RHEL - /var/logmessages
 
 - 
    
우분투 16.04 CoreOS - journalctl -u docker.service
 
 - syslog를 원격 서버에 설치하면, 로그 정보를 원격 서버에 보낼 수 있음
    
- rsyslog를 이용해 중앙 컨테이너로 로그를 저장할 수 있음
 
 
fluentd 로깅
- 각종 로그를 수집 및 저장할 수 있는 오픈소스 도구
 - JSON을 사용하기 때문에, 다양한 저장소에 저장할 수 있음
 
Docker 컨테이너 자원할당
Docker 자원 확인 및 업데이트
$ docker inspect (컨테이너 이름)docker update (변경할 자원 제한) (컨테이너 이름) docker update –cpuset-cpus=1 centos ubuntu
- 메모리 제한
    
docker run -d \
– memory=”1g” \
–name memory_1g \
nginx- m(메가바이트), g(기가바이트)로 제한할 수 있는 최소 메모리는 4MB
 - 컨테이너에 할당된 메모리를 초과하면 컨테이너는 자동으로 종료되므로 어플리케이션에 따라 적절한 메모리 할당이 필요
 
 - 컨테이너 CPU 제한
    
--cpu-shares- 컨테이너에 가중치를 설정해 해당 컨테이너가 CPU를 상대적으로 얼마나 사용가능한지 설정
 - 어느 비중만큼 나눠 쓸 것인지 명시하는 옵션
 - 상대적인 값으로 아무 설정도 하지 않았을 시, default는 1024로 1의 비중을 뜻함
 - 다른 컨테이너가 512를 할당하면 상대적으로 2:1의 비율로 CPU를 사용하여 총 66%:33%를 쓰게 됨
 
--cpuset-cpu- 컨테이너가 특정 CPU만 사용하도록 설정
 - index는 0부터 시작
 - 여러개 지정을 원하면 –cpuset-cpu=”0,3” 또는 “0-2”로 설정 가능함
 
--cpu-period, --cpu-quota- 컨테이너의 CFS(Completely Fair Scheduler) 주기는 기본적으로 100ms
 - 위 옵션으로 이 주기를 변경 가능함
 --cpu-quota=100000이 100ms을 의미함--cpu-period=100000 \--cpu-quota=25000을 하면 CPU 주기가 1/4로 감소- [cpu-quota]/[-cpu-period] 만큼의 CPU 시간을 할당받음
 
 
CFS(Completely Fair Scheduler)란
- 리눅스 커널의 2.6.23 릴리스에 병합된 프로세스 스케줄러이며 현재의 기본 스케줄러
 - 프로세스 실행을 위해 CPU 자원 할당을 관리하며 상호작용 성능을 극대화하면서도 전반적인 CPU 이용을 극대화
 - 프로세서 시간을 제공할 때 밸런스(공평성)를 유지하는 것
 - 프로세스에 공평한 양의 프로세서가 제공되어야 함
 - 작업 시간의 밸런스가 무너진 경우에는(다른 작업에 비해 하나 이상의 작업에 공평한 양의 시간이 주어지지 않은 경우) 작업 시간이 적게 지정된 작업에 실행 시간이 주어져야 함
 
- Block I/O 제한
    
- 컨테이너를 생성할 때, 옵션 미설정 시 컨테이너 내부에서 파일을 읽고 쓰는 대역폭 제한이 설정되지 않음
 - 블록 입출력을 과도하게 사용하지 않도록 하려면, 블록 입출력을 제한해야 함
 --device-write-bps/--device-read-bps/--device-write-iops/--device-read-iops- 초당 설정
 
- Direct I/O의 경우만 블록 입출력에 제한이 되며, Buffered I/O는 제한되지 않음