본문 바로가기
공부/도커 및 쿠버네티스

[시작하세요 도커/쿠버네티스] Dockerfile 작성하기

by GGT 2021. 9. 12.

Dockerfile 작성하기

도커를 상징하는 고래, 컨테이너를 싣고 있다.

개발한 애플리케이션을 간단히 컨테이너화하기 위해 도커는 'build' 명령어를 지원합니다.

도커 이미지를 생성하기 위해 필요한 일련의 작업들을 Dockerfile에 기록하면 도커는 빌드 명령어를 통해 이를 읽고 이미지를 생성합니다.

 

Dockerfile의 장점

  • Dockerfile을 사용하면 직접 컨테이너를 생성하고 애플리케이션 세팅 후 직접 이미지로 커밋해야 하는 번거로움을 덜 수 있음
  • 깃과 같은 개발 도구를 통해 빌드 및 배포의 자동화가 가능함
  • 명시적으로 필요한 패키지나 여러 명령어를 명확히 파악할 수 있음

 

Dockerfile 작성법

Dockerfile은 개발자가 직접 컨테이너를 생성하고 변경사항 적용 후 이미지로 커밋하는 작업을 대신해줍니다.

따라서 위 컨테이너에서 수행해야 할 작업을 직접 수행하는 대신 그 작업들을 명시해야 합니다.

 

Dockerfile에는 여러 작업들을 명시하기 위한 다양한 명령어들이 존재합니다.

다음 예제를 통해 기초적인 명령어들에 대해 알아보겠습니다.

예제 : 아파치 웹 서버 이미지 빌드용 Dockerfile

FROM ubuntu:14.04
# MAINTAINER below0 도커 1.13.0 이후 deprecated 
LABEL maintainer "below0" # K:V 형태

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(required) : 해당 이미지의 베이스가 될 이미지를 명시합니다. 사용하려는 이미지가 없다면 자동으로 pull합니다.
  • LABEL: 이미지에 메타데이터를 추가합니다 K:V 형태로 관리되며 여러 메타데이터를 추가할 수 있습니다.
  • RUN : 컨테이너에서 해당 명령어를 실행합니다.
  • ADD : 이미지에 로컬(Dockerfile의 위치)에 있는 파일을 추가합니다.
  • WORKDIR : 명령어를 실행할 디렉터리를 나타냅니다, '리눅스 cd 명령어와 유사함'
  • EXPOSE : 컨테이너가 사용할 포트번호를 명시합니다.
    • "docker run -P"로 컨테이너 실행 시 호스트의 랜덤 포트와 EXPOSE한 포트가 매핑됩니다.
    • "docker run -p 5000:80" 명령어로 직접 매핑도 가능합니다.
  • CMD : 최종적으로 해당 컨테이너가 수행할 명령어를 지정합니다.

 

RUN 명령어의 주의 사항

단 주의사항으로 해당 명령어로 작업 수행 시 '입력을 받는 상황'이 발생할 경우 오류로 처리합니다.
위 예제에서는 apache2 설치 시 '-y' 옵션을 추가해 자동으로 yes를 선택하도록 설정하였습니다.

Dockerfile의 일부 명령어는 배열 형태로 사용할 수 있으며 환경 변수 사용 시 이를 주의해야 합니다.
- RUN ["echo", "$ENV"] - 환경변수 사용 안함
- RUN ["sh", "-c", "echo $ENV"] - 환경변수 사용함

 

CMD VS ENTRYPOINT?

해당 컨테이너가 최종적으로 수행할 작업을 명시할 때

CMD를 사용하는 경우와 ENTRYPOINT를 사용하는 경우가 있습니다.

 

두 명령어는 모두 비슷한 작업을 수행하지만 약간의 차이가 존재합니다.

 

CMD의 경우 컨테이너 실행 시 다른 명령어를 인자로 주게되면 

Dockerfile에 기재된 CMD 명령어를 대신하여 수행하게 됩니다.

 

하지만 ENTRYPOINT의 경우에는 

어떠한 경우에도 해당 명령어의 인자를 대체하지 못하고 

명시한 그대로의 작업이 수행되게 된다는 차이가 존재합니다.

반응형

댓글