main-logo

Dockerfile

Dockerfile에 대해서

profile
나만애옹이없어
2024년 09월 26일 · 0 분 소요

들어가며

Docker를 사용하면 애플리케이션과 그 의존성을 하나의 컨테이너로 묶을 수 있습니다. 이를 통해 애플리케이션이 어디서든지 동일하게 실행되도록 보장할 수 있으며, 로컬 개발 환경, CI/CD 파이프라인 또는 클라우드 서버에서도 동일한 환경에서 실행됩니다.

Docker 이미지를 생성하기 위한 Dockerfile 키워드들의 역할과 작성법, 그리고 기본적인 실행 흐름에 대해 알아보겠습니다.

 

Dockerfile 키워드

FROM

FROM <image>

베이스 이미지를 지정하는 키워드. 가장 첫 번째 명령어.

 

WORKDIR

WORKDIR <directory>

작업 디렉터리를 설정합니다. 이후의 모든 명령어는 이 디렉터리를 기준으로 실행됩니다. 예를 들어, COPYRUN 명령어는 이 작업 디렉터리에서 동작합니다.

 

COPY

COPY <source> <destination>

로컬의 파일들을 Docker 이미지 내부로 복사합니다. 첫 번째 인자 <source>는 복사할 파일의 경로고, <destination>은 컨테이너 내에서 파일이 복사될 경로입니다.

 

RUN

RUN <command>

지정된 명령어를 실행합니다. 이 명령어는 컨테이너 이미지를 빌드 할 때 실행되며, 보통 소프트웨어 설치나 애플리케이션 빌드를 위한 스크립트 실행에 사용됩니다.

 

CMD

CMD ["executable", "param1", "param2"]

CMD는 컨테이너가 실행될 때 기본으로 실행할 명령을 정의합니다. 보통 애플리케이션을 시작하는 명령어를 정의합니다. CMD는 Dockerfile에서 하나만 사용할 수 있으며, 실행 시 사용자가 다른 명령어를 입력하면 CMD 명령어는 무시됩니다.

 

ENTRYPOINT

ENTRYPOINT ["executable", "param1", "param2"]

컨테이너가 실행될 때 항상 실행할 명령어를 지정합니다. CMD와 비슷하지만, 고정된 실행을 원할 때 사용합니다.

 

EXPOSE

EXPOSE <port>

컨테이너에서 외부에 노출할 포트를 지정합니다. 주의할 점으로는 expose만으로는 외부에서 해당 포트에 접근할 수 없고, 컨테이너를 실행할 때 -p 옵션을 사용해 호스트와 포트 번호를 일치시켜야 합니다.

 

ENV

ENV <key>=<value>

컨테이너 실행 중 사용할 환경 변수를 설정합니다.

 

ARG

ARG <name>=<default value>

ARG는 Docker 이미지를 빌드 할 때 전달할 변수를 정의합니다. ARG는 빌드 시점에 값을 지정하며, 런타임 시 사용할 수 없습니다. docker build --build-arg 명령어로 값을 지정할 수 있습니다.

 

이 외에도 Docker 공식 홈페이지의 레퍼런스에서 더 많은 명령어들을 확인할 수 있습니다.

 

Dockerfile 예시

아래는 GPT에게 부탁해서 만들어 본 Dockerfile의 샘플입니다. 대략적인 흐름에 대해서 알 수 있습니다.

# Use the official Node.js image as the base image
FROM node:18-alpine AS build

# Set the working directory in the container
WORKDIR /app

# Copy the package.json and package-lock.json into the container
COPY package*.json ./

# Install the dependencies
RUN npm install

# Copy the rest of the application code into the container
COPY . .

# Build the app
RUN npm run build

# Use an Nginx server to serve the static files
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html

# Expose port 8000
EXPOSE 8000

# Start Nginx when the container starts
CMD ["nginx", "-g", "daemon off;"]

 

Dockerfile 실행의 기본 흐름

Dockerfile이 실행되는 기본 흐름은 Docker 이미지 빌드와 컨테이너 실행 과정에서 이루어집니다. Dockerfile은 각 명령어를 하나씩 실행하여 이미지의 레이어를 쌓아가며, 최종적으로 이미지를 생성합니다. 이 이미지에서 컨테이너가 실행되며, Dockerfile에 정의된 대로 애플리케이션이 작동하게 됩니다.

 

이미지 레이어

Dockerfile의 각 명령어는 이미지의 레이어를 형성합니다. 각 명령어가 실행될 때마다 새로운 레이어가 생성되며, 이 레이어는 캐싱 됩니다. Docker는 이 캐싱 덕분에 이전에 실행된 명령어들이 변경되지 않으면 해당 레이어를 재사용할 수 있습니다. 예를 들어, package.json이 변경되지 않았다면, npm install을 다시 실행할 필요 없이 이전에 캐싱 된 레이어를 그대로 사용합니다.

이런 레이어 구조는 Docker 이미지를 빌드할 때 속도를 높이고, 이미지를 효율적으로 관리할 수 있도록 해줍니다.

 

실행 흐름

Dockerfile 작성

- Dockerfile에서 여러 명령어를 사용해 이미지를 정의합니다.

이미지 빌드

- docker build 명령어를 통해 Dockerfile을 기반으로 이미지를 빌드합니다. 각 명령어는 레이어를 형성하며, 캐싱 됩니다.

컨테이너 실행

- 빌드된 이미지를 사용해 docker run 명령어로 컨테이너를 실행합니다. 이때 포트 매핑, 환경 변수 전달 등 추가적인 설정이 가능합니다.

애플리케이션 실행

- 컨테이너는 애플리케이션을 실행하고, 애플리케이션의 프로세스가 종료되면 컨테이너도 종료됩니다.

 

읽을 거리 : Dockerfile(도커파일) - 스마트하게 도커 이미지를 빌드하는 방법