Developing

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

Devops/Fastcampus 캐시백 챌린지

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

DEV_BLOG 2022. 6. 8. 16:42

 

수강 인증샷

 

Dockerfile과 DockerImage save/load 관련된 클립들을 수강하는식으로 챌린지를 진행하였다. Docker 공식문서가 굉장히 긴데 일부를 같이 살펴보는 과정들이 좋았다. 필기하면서 긴가민가한 부분들은 다른분들의 블로깅을 참고해가면서 재차 확인하였고, tar 관련된부분은 늘 궁금하던 부분이었어서 흥미롭게 봤던 것 같다. 다음 포스팅으로는 도커허브 저장소 이용 및 AWS ECR 저장소 관련된 내용을 포스팅할 예정이다.

 

 

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"]

https://docs.docker.com/engine/reference/builder

도커파일의 공식문서는 위의 링크에서 확인가능하다. url뒤에 /#{subSection} 같은 식으로 원하는 내용을 찾을수도있다..

  • Format

INSTRUCTION [argument]

⇒ case-sensitive하지는 않지만 이때 instruction을 argument와 쉽게 구별해내기 위해 Instruction은 대문자로 적을 것을 권장한다.

⇒ 주석은 # 으로 표기한다. Dockerfile 명령어가 실행되기전 주석들은 제거된다.

⇒ FROM instruction으로 시작하여 parent image를 반드시 명시해주어야한다.

 

  • Environment replacement

⇒ENV statement로 선언되는 환경변수는 특정 명령어 내에서 변수로 사용될 수 있다.

⇒$variable_name | ${variable_name} 형식으로 사용할 수 있다.

${variable:-word} : variable이 있다면 결과값은 variable, 없다면 결과값이 word이다.

${variable:+word} : variable이 있다면 결과값은 word, 없다면 결과값이 empty string이다.

 

(Example)

FROM busybox
ENV FOO=/bar
WORKDIR ${FOO}     # WORKDIR /bar
ADD . $FOO         # ADD . /bar
COPY \\$FOO /quux   # COPY $FOO /quux

여기서 주의할점은 여기서의 FOO는 host운영체제의 환경변수가 아니라 컨테이너의 환경변수이다.

ENV 지시어를 사용하면 이미지빌드타임과 컨테이너런타임에 환경변수 값을 전달할 수 있다.

환경변수를 전달하는방법이 아니라 build argument를 전달하는방법도있다.

 

  • ARG

ARG <name>[=<default value>]

⇒ ARG는 build-time에 builder로 사용자가 전달할 수 있는 변수를 정의한다.

⇒ Default values / Arg Variable의 방법을 사용한다.

#Default values
FROM busybox
ARG user1=someuser
ARG buildno=1
#Arg Variable
From ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER=v1.0.0
RUN echo $CONT_IMG_VER

$ docker build --build-arg CONT_IMG_VER=v2.0.1 .
# 이런식으로 build argument를 넘길 수 있다고한다.

동일한 이름에 대해서 환경변수와 argument가 정의된 경우에는 ENV가 ARG를 덮어쓴다고 한다.

따라서 이경우에는 2.0.1을 옵션으로 넘겨주어도 1.0.0을 사용한다고 한다.

arg와 env를 —e, —build-arg 옵션으로 오버라이드 하는 예시는 하단의 링크에서 잘 설명되있는 것 같다.

https://github.com/heowc/programming-study/issues/90

 

 

  • Scope
FROM busybox
USER ${user:-some_user}
ARG user
USER #user
# ...

$ docker build --build-arg user=what_user .

이 경우에는 명확하다. 변수 user가 정의되기 전에 사용이 되었기에 argument를 넘겨주더라도 ${user:-some_user} 에서 some_user를 기본값으로 사용하게된다.

 

(Dockerfile Example)

FROM: 도커파일 시작하는 부분의 instruction으로 어떤 베이스 이미지를 사용할지 결정한다.

 

LABEL: 이미지의 메타데이터 설정으로 optional인 부분이다.

⇒  컨테이너 서비스관리가 복잡해질때,관리해야하는 이미지가 많아지는 경우 조직내에서 convention으로 깔끔하게 관리한다고 한다.

 

WORKDIR: 해당 경로를 작업경로로 만들어준다 : Set Working Directory

⇒ 우분투에서 cd로 디렉토리를 이동한다고 생각하면 된다.

 

COPY: COPY SRC DEST 의 구조를 취하게 된다.

⇒ SRC : 호스트 운영체제 경로

⇒ DEST : 이미지 상에서의 경로

⇒ COPY package*.json ./ 의 의미는 host 운영체제의 package로 시작하는 json file들을 복사해 이미지 상의 현재 디렉토리에 복사하라는 의미이다. 이때 WORKDIR 지시어를 사용하였으므로 /app/에 복사하게 된다.

 

RUN: docker image build상에서 해당 명령어를 실행하라는 의미이다.

 

COPY . . : 현재 디렉토리상의 모든 파일과 디렉토리를 /app/으로 복사

 

EXPOSE: 사용하는 port를 문서화한다. 해당 포트를 publishing하는 것은 아니고 expose는 이미지 사용자에게 포트사용번호를 알려주는 용도만 한다.

 

CMD : 컨테이너를 실행할때 어떤 명령어를 실행할지 결정한다. 배열형태로 받을 수도 있지만 double quote로 문자열로 묶어서 실행할 수도있다.

 

  • ENTRYPOINT
#exec form
ENTRYPOINT ["executable","param1","param2"]
#shell form
ENTRYPOINT command param1 param2

Entrypoint를 사용하면 커멘드에 앞서서 시작프로그램을 지정할 수 있다.

 

(Exec from ENTRYPOINT example)

FROM ubuntu
ENTRYPOINT ["top","-b"]
CMD ["-c"]

두개가 합쳐져서 top -b -c가 실행될 것이다.

 

  • USER
USER <users>[:<group>]
USER <UID>[:<GID>]

도커 컨테이너가 사용하게 될 기본 사용자를 지정한다. 도커 이미지 보안을 고려할 때 반드시 사용하는 지시어라고 한다.

 

 

이미지 압축파일로 저장

# 이미지를 tar압축 파일로 저장
# docker save -o [OUTPUT-FILE] IMAGE

# ubuntu:focal 이미지를 ubuntu_focal.tar 압축 파일로 저장
$ docker save -o ubuntu_focal.tar ubuntu:focal

 

이미지 압축에서 불러오기

# 이미지를 tar 압축파일로부터 불러오기
# docker load -i [INPUT-FILE]

# ubuntu_focal.tar 압축 파일에서 ubuntu:focal 이미지 불러오기
$ docker load -i ubuntu_focal.tar

 

tar파일로 save,load가 잘 되는 것을 확인할 수 있다.

인터넷이 안되는환경이나 public repository 거치치않고 이미지를 전달할때 이미지를 압축파일로 저장하고 불러오는 것이 유용하다고 한다!

 

 

https://bit.ly/3L3avNW

 

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

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

fastcampus.co.kr

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