들어가며
Docker를 사용하면 애플리케이션과 그 의존성을 하나의 컨테이너로 묶을 수 있습니다. 이를 통해 애플리케이션이 어디서든지 동일하게 실행되도록 보장할 수 있으며, 로컬 개발 환경, CI/CD 파이프라인 또는 클라우드 서버에서도 동일한 환경에서 실행됩니다.
Docker 이미지를 생성하기 위한 Dockerfile 키워드들의 역할과 작성법, 그리고 기본적인 실행 흐름에 대해 알아보겠습니다.
Dockerfile 키워드
FROM
FROM <image>
베이스 이미지를 지정하는 키워드. 가장 첫 번째 명령어.
WORKDIR
WORKDIR <directory>
작업 디렉터리를 설정합니다. 이후의 모든 명령어는 이 디렉터리를 기준으로 실행됩니다. 예를 들어, COPY
나 RUN
명령어는 이 작업 디렉터리에서 동작합니다.
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(도커파일) - 스마트하게 도커 이미지를 빌드하는 방법