Dockerfile이 뭐임?

  • 이전 글에 간단하게 씌여있긴 함
  • 요약 : 이미지를 빌드하기 위해 쓰는 명령 모음
  • 명령 한 줄 한 줄이 하나의 이미지 레이어를 만듬
  • 이전 글에서 “변경된 레이어만 실행할 수 있다”고 했던게 이 의미임

Dockerfile 쓰는 법

FROM
RUN
COPY / ADD
WORKDIR
EXPOSE
CMD / ENTRYPOINT
  • 보통 위의 순서로 쓴다고 함

FROM

  • 베이스 이미지 지정자
  • alpine, ubuntu, node, python, nginx 등등 쓸 수 있음
  • 하나의 Dockerfile에 여러 개의 From 을 쓸 수 있는데, 그걸 멀티 스테이지 빌드 라고 함

RUN

  • 이미지 빌드 시점에 씀
  • 필요한 패키지 설치한다거나 그럴 때 씀
  • 이미지에 고정되는거임
  • RUN 명령을 한 줄로 묶는게 좋음. 왜냐면 한 줄이라도 바뀌면 그 부분부터 다시 명령 시작하기 때문
  • 참고로 RUN 뒤에 오는 명령문은 /bin/sh -c 뒤에 붙어서 실행됨
    • -c 는 뒤에 오는 문자열을 직접 입력한 것 처럼 실행하겠다는 의미
  • 아래는 예시 코드
FROM centos:7
 
RUN yum -y update \   <- * 여기부터
 && yum -y install \
    curl \
    vim \
    iproute \
 && yum clean all \ <- 이거 써서 캐시 지워야 레이어가 깨끗해짐
 && rm -rf /var/cache/yum <- * 여기까지 줄로 써야됨
  • 주의 : 런타임 코드 쓰면 안됨!!!! (예시 : service nginx start)

COPY / ADD

  • 호스트 (내 컴퓨터) 에 있는 파일을 컨테이너 안에다가 심는 작업
  • ADD보다는 COPY를 쓴다고 함 (안전상의 문제)
  • 아래는 예시 코드
COPY . . <- 현재 호스트에서 작업하고 있는 부분을 컨테이너 안에 그대로 심음 (자주 )
  • 깔아야 하는 패키지가 많은 경우에 아래의 방법처럼 쓰는 경우도 있음
COPY requirements.txt . <- 지금 requirements.txt 먼저 컨테이너 안에 심음
RUN pip install -r requirements.txt <- 컨테이너 안에 들어간 requirements.txt 가지고 패키지 설치
COPY . . <- 나머지 파일들 복사
 
  • 참고 : gitignore 처럼 dockerignore도 있음. Dockerfile이랑 같은 디렉토리에 위치해 있으면 아래의 내용은 COPY 명령에서 제외됨
// .dockerignore
.git
node_modules
*.log

WORKDIR

  • 이 밑에 진행되는 명령들의 실행 디렉토리 설정
  • 말 그대로임 cd 같은거임
WORKDIR /app
  • COPY로 다 가져오기 전에 WORKDIR로 폴더 나눠두면 나중에 관리하기 편하겠죠?

EXPOSE

  • 해당 컨테이너가 사용하는 포트를 의미함
  • 참고 : 쿠버네티스의 경우 알아서 해줘서 의미없긴함
EXPOSE 8080

CMD

  • 컨테이너 실행할 때 자동으로 실행되는 명령
  • docker run “어쩌구” 이렇게 쓰면 CMD 내용 무시됨
  • 예시
CMD ["python", "app.py"] <- 이러면 기본 docker run 할때 docker run python app.py 인식

ENTRYPOINT

  • 항상 실행되는 고정 명령
  • CMD랑 같이 쓸 수도 있음
ENTRYPOINT ["nginx"]
CMD ["-g", "deamon off"]

참고

  • CMD, ENTRYPOINT는 이미지를 컨테이너화 해서 실행시킬 때만 의미가 있는거고 모든 명령에 붙는게 아님!

다음에 할 것

  • 도커 공식 튜토리얼 따라서 실습해보기