[Docker] ②배포: Dockerfile

Jae Gyeong Lee·2024년 10월 19일

1. Dockerfile이란

  • Docker image 생성을 위한 명령어가 포함된 스크립트 파일
    ㄴ Dockerfile 문법으로 스크립트를 작성해 Docker image를 생성

  • Docker image는 Dockerfile에 나열된 명령어 수행을 통해 생성됨
    ㄴ Dockerfile을 통해 Docker image의 구성 방식을 알 수 있음

2. Dockerfile 생성

ⓐ메모장 열기 → ⓑDockerfile 스크립트 작성 → ⓒDockerfile 저장

ⓐ메모장 열기

  • 메모장 열기

ⓑDockerfile 스크립트 작성

<주요 Instruction>

ⓑ-1) FROM: 생성할 Docker image의 base가 되는 image 설정

  • 반드시 Dockerfile 최상단에 위치해야 하는 instruction
FROM <이미지명>:<태그>

ㄴ 태그를 명시하지 않는 경우 docker hub에 있는 최신 버전으로 설치

예) FROM ubuntu:20.04
예) FROM python:3.9
예) FROM python

ⓑ-2) MAINTAINER: docker image 작성자 정보 설정

MAINTAINER <작성자>
예) MAINTAINER jaegyeong_lee

ⓑ-3) LABEL: 주석과 같음, 별도의 기능 없음

  • 버전 정보 등 이미지에 대한 설명(이미지의 메타정보)을 작성하고자 할 때 활용
  • key="value" 형태로 작성, 2개 이상 설정 가능
예) 
LABEL version="0.5.0"
LABEL description="LABEL instruction test"
  • LABEL 정보 확인 방법: docker image 생성 후, 아래 명령어 실행
$docker image inspect <이미지명>
 ㄴLABEL 태그 확인

ⓑ-4) WORKDIR: docker container의 작업 디렉토리 설정

  • 작업 디렉토리가 지정되면 이후 명령어들은 해당 디텍토리를 기준으로 동작
WORKDIR <도커이미지  디렉토리>
예) WORKDIR /usr/src/app

ⓑ-5) COPY: HOST → docker image로 파일/폴더를 가져오기 위해 설정

  • HOST 환경에 있는 파일/폴더를 docker image 안으로 복사
COPY <HOST 파일 경로> <docker image 파일 경로>
예) COPY . .

# COPY <호스트 현재 디렉토리> <컨테이너  디렉토리(WORKDIR 설정 경로)>
# 즉, COPY의 첫번째 . 은 Dockerfile이 위치한 경로 ; 두번째 . 은 /usr/src/app
# ==> host Dockerfile이 위치한 경로 모든 파일들이 컨테이너의 /usr/src/app 경로로 복사

ⓑ-6) RUN: docker container '빌드' 시, 실행할 명령어 지정

예) 
RUN apt-get update #필수
RUN apt-get install -y vim
 ㄴ-y 옵션은 설치 도중 발생하는 팝업(설치여부 확인(yes or no)) 처리를 위함

위와 같이 해도 되나, 아래와 같이 한 번에 이어서 작성하는게 효율적.

# vim 설치
RUN apt-get update && apt-get install -y vim
 ㄴ 실행 절차: apt-get update 처리 → apt-get install -y vim 처리
# python 패키지
RUN pip install --no-cache-dir -r requirements.txt
 ㄴ 일반적으로 apt-get install 이 있으면 그걸 먼저 수행, pip install 후순위로 설정

ⓑ-7) CMD: docker container '실행(run)' 시, 실행할 명령어 설정

  • CMD 설정 명령어는 docker run .. 시 덮어씌울 수 있음
예) CMD ["python", "test,py"]
  • If you list more than one CMD, only the last one takes effect.

ⓑ-8) ENTRYPOINT: docker container '실행(run)' 시, 실행할 명령어 설정

  • ENTRYPOINT 설정 명령어는 docker run .. 시 덮어씌울 수 없음
예) ENTRYPOINT ["python", "test,py"]

CMD ENTRYPOINT 공통점

  • 컨테이너 실행 시 설정된 명령어(ENTRYPOINT, CMD) 자동 실행

CMD ENTRYPOINT 차이점

  • docker container run할 때 무조건 실행하고 싶은 명령어는 ENTRYPOINT에 설정

CMD ENTRYPOINT 특징

  • Dockerfile 생성 시 반드시 입력되어야 하는 값 아님
  • 별도의 설정값이 없으면, docker run … 시 자동으로 실행되는 명령어가 없는 것
    ㄴ 단, (ㄱ)CMD ENTRYPOINT 설정값 없고 (ㄴ) docker run … 시 명령어 입력하지 않으면, docker container run 즉시 종료

<기타 Instruction>

ADD - COPY랑 유사
EXPOSE
ENV
VOLUME
SHELL
USER
ARG
STOPSIGNAL
HEALTHCHECK

※ 참조: https://docs.docker.com/reference/dockerfile/

ⓒDockerfile 저장

  • 파일 저장 시 (1)형식: 모든타입 (2)파일명: "Dockerfile"
  • 파일명은 반드시 Dockerfile, 메모장 작성 시 파일명을 큰 따옴표 사이에 넣지 않으면 자동으로 .txt가 붙음

3. Dockerfile 작성 예

FROM python:3.9
MAINTAINER jaegyeong_lee
LABEL version="0.7.0"
LABEL description="TmaxAI project QA image"
WORKDIR /usr/src/app
COPY . .
RUN pip install --no-cache-dir -r requirements.txt
CMD ["bash"]
  • FROM python:3.9
    ㄴ base image로 python 설정

  • MAINTAINER jaegyeong_lee
    ㄴ 작성자 이름 jaegyeong_lee

  • LABEL version="0.7.0"
    LABEL description="Mirae Asset QA code"
    ㄴ Docker image에 주석 설정

  • WORKDIR /usr/src/app
    ㄴ Docker images 내 작업 디렉토리 /usr/src/app 설정

  • COPY . .
    ㄴ 첫번째 . 은 Dockerfile이 위치한 경로; 두번째 . 은 /usr/src/app

  • RUN pip install --no-cache-dir -r requirements.txt
    ㄴ python module 자동 설치(requirements.txt 에 명시된 module)

  • CMD ["bash"]
    ㄴdocker run -it <이미지명> 만 실행 시, Docker container 내 셀에 자동 접근

4. Dockerfile로 이미지 bulid

Local PC 내 Docerkfile이 위치한 경로로 이동 후

$docker build -t <이미지명:태그명> .
profile
안녕하세요 반갑습니다. 공부한 내용들을 기록하고 있습니다.

0개의 댓글