인프라

9. DockerFile

오늘의 나1 2021. 3. 14. 22:29

DockerFile 하는 일

완성된 이미지를 생성하기 위해 컨테이너에 설치해야 하는 패키지, 추가해야 하는 소스코드, 실행해야 하는 명령어와 셸 스크립트 등을 DockerFile에 기록해두면 도커는 이 파일을 읽어 컨테이너에서 작업을 수행한 뒤 이미지로 만들어냄

이미지를 배포하는 대신, 이미지를 생성하는 방법을 기록해 놓은 DockerFile을 배포할 수도 있음

DockerFile 작성

FROM ubuntu:14.04
LABEL "purpose"="practice"
RUN apt-get update
RUN apt-get install apache2 -y
ADD test.html /var/www/html
WORKDIR /var/www/html
RUN ["/bin/bash", "-c", "echo hello >> test2.html"]
EXPOSE 80
CMD apachectl -DFOREGROUND
  • FROM: 어떤 이미지를 사용할 지
  • LABEL: 메타데이터를 키=값 형식으로 저장
  • RUN: 컨테이너 내부에서 실행할 명령어
  • ADD: 컨테이너 내부에 파일 추가
  • WORKDIR: 컨테이너 내부에서 해당 디렉터리로 이동
  • EXPOSE: 컨테이너에서 오픈할 포트
  • CMD: 도커 파일로 빌드된 이미지로 컨테이너 생성 후 실행할 명령어

DockerFile 빌드

$ docker build -t mybuild:0.0 ./
  • DockerFile이 위치한 경로와 이미지명을 입력하여 빌드

빌드 컨텍스트

  • DockerFile이 위치한 디렉터리
  • 빌드 컨텍스트에 불필요한 파일이 있으면 빌드 속도가 느려지는 등 효율성이 떨어짐
  • .dockerignore 파일로 불필요한 파일이 빌드 컨텍스트에 포함되는 것을 방지해야 함

빌드 캐시

  • 한 번 이미지 빌드를 마치고 난 뒤 다시 같은 빌드를 진행하면 이전의 이미지 빌드에서 사용했던 캐시를 사용
  • 필요에 따라 빌드 캐시를 사용하지 않아야 하는 경우가 있다.
    • 빌드 시 --no-cache 옵션을 사용하여 캐시를 사용하지 않는다고 할 수 있다.
    • 예: 'RUN git clone' 명령어를 실행해 이미지 빌드할 때, 빌드 캐시가 사용되어 git 리포지토리의 최신 값을 가져오지 않는 경우가 있다.
      docker build --no-cache -t mybuild:0.0

멀티스테이지 빌드

  • 하나의 DockerFile 안에 여러 개의 FROM 이미지를 정의함으로써 빌드 완료 시 최종적으로 생성될 이미지의 크기를 줄이는 역할
  • 각 이미지는 먼저 FROM에서 명시된 순서대로 0, 1, ...의 순으로 차례대로 구분되어 사용
FROM golang
ADD main.go /root
WORKDIR /root
RUN go build -o /root/mainApp /root/main.go

FROM golang
ADD main2.go /root
WORKDIR /root
RUN go build -o /root/mainApp2 /root/main2.go

FROM alpine:latest
WORKDIR /root
COPY --from=0 /root/mainApp .
COPY --from=1 /root/mainApp2 .

'인프라' 카테고리의 다른 글

10. 도커 이미지 빌드 & 푸시 실습  (0) 2021.03.30
8. 도커 이미지 배포  (0) 2021.03.30
7. 도커 이미지  (0) 2021.03.03
4. 도커 네트워킹  (0) 2021.03.02
3. 도커 볼륨  (0) 2021.03.02