Kubernetes

Dockerfile 개념과 작성법 그리고 작성예시

hihikiki 2023. 7. 23. 01:53

Dockerfile은 Docker 컨테이너 이미지를 빌드하기 위한 지침을 작성하는 파일입니다.

Dockerfile을 작성할 때는 몇 가지 중요한 문법 규칙을 따라야 합니다. 

아래는 기본적인 Dockerfile 작성 관련 문법을 설명합니다.


Dockerfile 명령어

1. FROM

베이스 이미지를 지정합니다. Docker 이미지는 FROM으로 지정한 기본 이미지 위에 구축됩니다.

FROM base_image
dockerfile로 이미지를 만들 때 이미지의 크기를 줄여야 container생성을 빠르게 할 수 있기 때문에 Dockerfile을 얼마나 최적화하여 만드는 가가 매우 중요합니다. 이때 base image로 자주 쓰이는 것들이 있습니다. 
<자주 쓰이는 base image>
1. alpine: 알파인 (Alpine)은 경량화된 리눅스 배포판으로, Docker 컨테이너와 같은 리소스 제한 환경에서 많이 사용됩니다. 어떻게 경량화했는가?라고 한다면 최소한의 패키지와 라이브러리만 설치된 버전이기 때문입니다. 만약 추가로 패키지나 라이브러리가 필요하다면 apk로 설치를 하면 됩니다.
2. ubuntu, debian: 대중적인 리눅스 배포판들로, 강력한 커뮤니티 지원과 다양한 패키지들을 제공합니다.
3. node: Node.js 기반 애플리케이션을 빌드하기 위한 베이스 이미지로, Node.js 개발 환경을 제공합니다. 
4. python: Python 기반 애플리케이션을 빌드하기 위한 베이스 이미지로, Python 개발 환경을 제공합니다. 
5. openjdk: Java 기반 애플리케이션을 빌드하기 위한 베이스 이미지로, Java 개발 환경을 제공합니다. 
6. nginx: 웹 서버를 구동하기 위한 베이스 이미지로, 정적 파일 서비스에 많이 사용됩니다.


2. RUN

명령을 실행하여 이미지에 패키지를 설치하거나 소프트웨어를 구성하는 등의 작업을 수행합니다.

RUN command


3. COPY

호스트 시스템의 파일이나 디렉토리를 컨테이너 내부로 복사합니다.

COPY src dest

4. ADD

COPY와 유사하게 파일이나 디렉토리를 컨테이너 내부로 복사합니다. 또한, URL이나 압축 파일을 자동으로 다운로드하고 압축을 풀 수도 있습니다.

ADD src dest

5. WORKDIR

작업 디렉토리를 설정합니다. RUN, CMD, ENTRYPOINT 등의 명령은 이 디렉토리를 기준으로 실행됩니다.

WORKDIR /path/to/directory

6. EXPOSE

컨테이너가 외부에 노출해야 하는 포트 번호를 설정합니다.

EXPOSE port

7. CMD

컨테이너가 시작될 때 실행될 명령을 설정합니다. Dockerfile 내에서 한 번만 사용할 수 있으며, 보통 실행 명령을 작성합니다.

CMD command


8. ENTRYPOINT

CMD와 비슷하지만, 컨테이너가 시작될 때 항상 실행되어야 하는 명령을 설정합니다. 일반적으로 실행 스크립트나 실행 파일을 지정합니다.

ENTRYPOINT command

9. ENV

환경 변수를 설정합니다. 컨테이너 내부에서 사용할 환경 변수를 정의할 수 있습니다.

ENV key value


Dockerfile 활용 예시

Python으로 작성한 app.py라는 스크립트가 있을 때 이를 실행시키기 위한 Dockerfile은 아래와 같다

# app.py
print("Hello, Docker!")
# Dockerfile

# 베이스 이미지를 Python 이미지로 선택
FROM python:3

# 작업 디렉토리 설정
WORKDIR /app

# 현재 디렉토리의 app.py 파일을 컨테이너의 /app 디렉토리로 복사
COPY app.py /app/

# 컨테이너가 시작될 때 실행할 명령을 지정 (Python 스크립트 실행)
ENTRYPOINT ["python", "app.py"]

ADD 와 COPY 명령어 차이점은?

두 가지 모두 파일이나 디렉토리를 이미지로 복사하는 것은 동일합니다.

하지만 COPY는 단순히 소스 경로에 있는 파일이나 디렉토리 복사만 지원합니다. 이전 빌드에서 동일한 파일을 복사하는 것이라면 캐싱되어 빌드 시간이 단축됩니다.

반면 ADD는 단순한 파일이나 디렉토리 복사 뿐만 아니라 원격 URL로 파일을 다운받거나 압축파일을 자동으로 압축해주는 부가적인 기능이 더 있습니다. 외부 파일이 변경되지 않는 다면 캐싱되지만 계속 변경된다면 매번 외부 리소스를 다운받아서 재빌드를 해야합니다.

 

요약하면 단순 파일 및 디렉토리 복사 COPY, 외부 URL로 파일을 다운받거나 압축을 풀어야 한다면 ADD를!

 

CMD와 ENTRYPOIN 차이점은?

 다 컨테이너가 시작될 때 실행되어야 하는 명령을 지정하는데 사용되고 Dockerfile안에서 한 번만 실행할 수 있습니다.

하지만 ENTRYPOINT는 컨테이너가 항상 실행되어야 하는 메인 실행 파일 또는 스크립트를 설정하는데 사용되고, CMD는 기본 실행 파일 또는 스크립트에 전달되는 기본 인자를 설정하는데 사용됩니다.