Developing

패스트캠퍼스 캐시백 챌린지 51일차 본문

Devops/Fastcampus 캐시백 챌린지

패스트캠퍼스 캐시백 챌린지 51일차

DEV_BLOG 2022. 6. 7. 22:53

수강 인증샷

 

Docker log와 이미지 구조와 관련된 클립들을 수강하는식으로 챌린지를 진행하였다. docker inspect로 layer architecture로 이루어진 것을 확인할 수 있었고, git과 비슷하게 생긴 command들을 보면서 신기해했던 것 같다. 자주듣다보니 어느정도 Image layer과 container layer의 차이정도에는 익숙해진듯하다.. Docker log 관련 내용도 유익하였다. 다음 포스팅으로는Dockerfile과 관련된 내용을 포스팅할 예정이다.

 

STDOUT / STDERR

  • 대게 어플리케이션에서 로그를 다룰때 어플리케이션 해당 언어 프레임워크에서 제공해주는 로그 프레임워크를 사용하여 표준 출력으로 로그를 내보내거나 syslog로 내보내거나 elastic search 같은 외부 저장소로 보내는등 어플리케이션 단에서 구현한다.
  • 도커 컨테이너에서 로그를 다루기 위해서는 어플리케이션에서 로그를 stdout,stderr로 내보내는 것을 표준으로 삼아야한다.

⇒ log를 쌓아서 logging driver가 처리할 수 있도록 하고, 사용목적에 맞게 선택하여 로그 드라이버를 사용하면 된다.

⇒ 가장 기본적으로 많이 사용되는 로그 드라이버는 json-file(한줄에 json하나로 구성이 되는 형태의 로그파일)이다.

 

로그 확인하기

# 전체 로그 확인
$ docker logs [container]

# 마지막 로그 10줄 확인
$ docker logs --tail 10 [container]

# 실시간 로그 스트림 확인
$ docker logs -f [container]

# 로그마다 타임스탬프 표시
$ docker logs -f -t [container]

옵션 주는 것에 따라 내용이 달라지는 것을 확인할 수 있다!

 

호스트 운영체제의 로그 저장 경로

$ cat /var/lib/docker/containers/${CONTAINER_ID}/${CONTAINER_ID}-json.log 

한줄마다 json의 형태로 stream의 형태가 stdout/stderr 여부가 찍혀있고 timestamp도 찍혀있는 것을 확인할 수 있다.

 

로그 용량 제한하기

# 한 로그 파일 당 최대 크기를 3Mb로 제한하고, 최대 로그 파일 3개로 로테이팅
$ docker run \
  -d \
  --log-driver=json-file \
  --log-opt max-size=3m \
  --log-opt max-file=5 \
  nginx

도커 엔진을 운영체제에 설치하면 기본적으로 로그 용량에 대한 제한이 설정되어있지 않다.

컨테이너 단위로 로그 용량 제한을 할 수 있지만, 도커 엔진에서 기본설정을 진행할 수도있다. (운영환경에서 필수 설정)

 

도커 로그 드라이버

로그 드라이버를 사용해 file의 형태로 host 운영체제에 담긴다. host 운영체제상에 log agent를 설치할 수 있는데, firebeat , fluentd 같은 것을 설치하여 중앙화된 로그 시스템인 elastic,splunk,graylog,cloudwatch 쪽으로 컨테이너 로그를 수집해서 쌓는식으로 중앙에서 전체적인 컨테이너 로그를 확인할 수 있게된다.

 

도커 이미지 구조

  • 도커 이미지는 3개가 있다고 가정한다. 이해를 돕기위해 nginx는 ubuntu 기반으로, web app 이미지는 nginx 이미지 기반으로 만들어졌다고 가정한다.
  • Docker Image

⇒ ubuntu 이미지의 경우 3개의 layer로 구성되어있는데, 새로운 변경사항이 생길때마다 새로운 layer가 쌓이는 구조이다. 따라서 가장 오래된 변경사항은 layerA라고 볼 수 있다.

⇒ nginx는 ubuntu이미지를 기반으로 만들어졌기에 nginx 이미지를 구성하기 위한 요소만 쌓인다.

⇒ web app도 마찬가지로 nginx이미지를 기반으로 만들어졌기에 nginx 기반 레이어위에 새로운 레이어가 쌓인다.

  • Docker Container

⇒ Docker Container에서 Web app image를 사용하는 것을 확인할 수 있는데, 이렇게 컨테이너를 생성하게 되면 image layer의 형태로 복사가된다. 이때 이 image layer는 읽기전용으로 생성되어 수정이 불가능하다.

⇒ 컨테이너가 생성될때마다 Container layer가 생성되어 읽기와 쓰기가 모두 가능한 레이어이다.

⇒ 컨테이너가 종료될때 Container layer도 같이 삭제된다.

 

Dockerfile 없이 이미지 생성

# docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
# ubuntu 컨테이너의 현재 상태를 my_ubuntu:v1 이미지로 생성
$ docker commit -a fastcampus -m "First Commit" ubuntu my_ubuntu:v1

기존 컨테이너를 기반으로 변경사항을 하고 커밋을 할 수 있다.

 

Dockerfile 이용하여 이미지 생성

#Dockerfile
FROM node:12-alpine
RUN apk add --no-cache python3 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node","src/index.js"]

# docker build [OPTIONS] PATH
# ./ 디렉토리를 빌드 컨텍스트로 my_app:v1 이미지 빌드(Dockerfile 이용)
$ docker build -t my_app:v1 ./

# ./ 디렉토리를 빌드 컨텍스트로 my_app:v1 이미지 빌드 (example/MyDockerfile 이용)
$ docker build -t my_app:v1 -f example/MyDockerfile ./

아래의 경우 경우 현재 디렉토리를 기반으로 빌드를 수행하고 tag지정을 하게되는데, f 옵션을 주게되면 다른 디렉토리의 Dockerfile을 사용하게 된다.

 

빌트 컨텍스트

  • 도커 빌드 명령 수행 시 현재 디렉토리(Current Working Directory)를 빌드 컨텍스트(Build Context)라고 한다. Dockerfile로부터 이미지 빌드에 필요한 정보를 도커 데몬에게 전달하기 위한 목적이다.

.dockerignore

  • .gitignore과 동일한 문법을 가지고 있다.
  • 특정 디렉토리 혹은 파일 목록을 빌드 컨텍스트에서 제외하기 위한 목적

 

https://bit.ly/3L3avNW

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

* 본 포스팅은 패스트캠퍼스 환급 챌린지를 위해 작성되었습니다.