클라우드

[클라우드] Dockerfile 개념 정리 가이드

Newbie Developer 2025. 2. 7. 14:56

안녕하세요. 새내기 개발자입니다. 공부하면서 정리하는 글로 틀린 부분은 언제나 댓글로 환영입니다!

 

Dockerfile은 컨테이너 이미지를 생성하기 위한 설정 파일입니다.
이 파일을 사용하면 애플리케이션의 실행 환경을 코드로 정의하고, 쉽게 배포할 수 있습니다.

오늘은 Dockerfile이 무엇인지, 그리고 효율적으로 작성하는 방법을 살펴보겠습니다! 🎯


1. Dockerfile이란?

Dockerfile은 컨테이너 이미지의 청사진 역할을 합니다.
예를 들어, 우리가 어떤 프로그램을 실행하려면 OS, 라이브러리, 실행 파일 등이 필요하죠?
이 모든 환경을 코드로 정의하면, 누구나 동일한 환경에서 애플리케이션을 실행할 수 있습니다.

 

Dockerfile을 사용하면
✔️ 개발 환경이 일관되게 유지됨
✔️ 애플리케이션 배포가 간편해짐
✔️ 불필요한 설치 과정 없이 실행 가능

 


2. Dockerfile의 기본 구조

Dockerfile은 여러 명령어를 조합하여 컨테이너를 구축합니다.
아래는 주요 명령어와 역할을 정리한 표입니다.

명령어 설명
FROM 기반 이미지를 지정
WORKDIR 작업 디렉토리 설정
COPY 로컬 파일을 컨테이너에 복사
ADD 파일 및 압축 파일을 컨테이너에 추가
RUN 명령어 실행 (소프트웨어 설치 등)
CMD 컨테이너 실행 시 기본적으로 실행할 명령어
ENTRYPOINT 컨테이너 실행 시 실행될 명령어 설정
ENV 환경 변수 설정
EXPOSE 컨테이너에서 사용할 포트 지정
VOLUME 데이터 볼륨 마운트
ARG 빌드 시 전달할 변수 설정

3. 기본적인 Dockerfile 작성 예제

아래는 Node.js 기반 애플리케이션을 실행하는 Dockerfile 예제입니다.

# 1. 사용할 베이스 이미지 지정
FROM node:18

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

# 3. 로컬 파일을 컨테이너로 복사
COPY package.json ./
COPY package-lock.json ./

# 4. 의존성 설치
RUN npm install

# 5. 애플리케이션 소스 코드 복사
COPY . .

# 6. 컨테이너에서 실행할 포트 지정
EXPOSE 3000

# 7. 실행 명령어 지정
CMD ["npm", "start"]

실행 과정 설명:

  1. FROM node:18 → Node.js 18 버전이 포함된 공식 이미지를 사용합니다.
  2. WORKDIR /app → 컨테이너 내부에서 작업 디렉토리를 /app으로 설정합니다.
  3. COPY package.json ./ → package.json을 컨테이너로 복사합니다.
  4. RUN npm install → npm install을 실행하여 의존성을 설치합니다.
  5. COPY . . → 애플리케이션의 모든 소스 코드를 컨테이너 내부로 복사합니다.
  6. EXPOSE 3000 → 컨테이너가 3000번 포트를 사용한다고 명시합니다.
  7. CMD ["npm", "start"] → 컨테이너가 실행될 때 npm start를 실행합니다.

4. Dockerfile을 사용하여 이미지 빌드 및 실행

Dockerfile을 작성한 후, 다음 명령어를 사용하여 이미지를 빌드하고 컨테이너를 실행할 수 있습니다.

1) 이미지 빌드

docker build -t my-node-app .
  • -t my-node-app : 이미지에 my-node-app이라는 태그를 지정
  • . : 현재 디렉토리에 있는 Dockerfile을 사용하여 빌드

2) 컨테이너 실행

docker run -p 3000:3000 my-node-app
  • -p 3000:3000 : 호스트의 3000번 포트를 컨테이너의 3000번 포트와 연결

5. 최적화된 Dockerfile 작성 팁

1) 불필요한 파일 복사를 방지 (.dockerignore 사용)

Dockerfile에서 COPY . .을 사용할 경우, .git, node_modules 등의 불필요한 파일까지 복사될 수 있습니다. 이를 방지하기 위해 .dockerignore 파일을 만들어 필요 없는 파일을 제외해야 합니다.

.dockerignore 파일 예시:

node_modules
.git
.DS_Store
.env

2) 다단계 빌드 (Multi-Stage Build) 활용

하나의 Dockerfile에서 여러 단계를 거쳐 빌드를 진행할 수 있습니다. 이렇게 하면 최종 이미지의 크기를 줄일 수 있으며, 빌드 과정에서 필요한 도구들을 제거할 수 있습니다.

다단계 빌드 예제:

# 1. Build 단계 (빌드에 필요한 도구 포함)
FROM node:18 AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build

# 2. Run 단계 (최종 실행 환경)
FROM node:18
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/index.js"]

💡 이 방식의 장점
✔️ 1단계에서는 빌드에 필요한 파일만 포함
✔️ 2단계에서는 불필요한 파일을 제거하여 경량화


6. 정리

Dockerfile을 작성할 때 기억해야 할 사항

  • FROM: 적절한 베이스 이미지를 선택할 것
  • WORKDIR: 작업 디렉토리를 명확하게 설정
  • COPY / ADD: 필요한 파일만 복사하고 .dockerignore 사용
  • RUN: 패키지 설치 및 빌드 작업 수행
  • CMD / ENTRYPOINT: 컨테이너 실행 시 실행될 기본 명령어 설정
  • 최적화: 다단계 빌드 활용, 불필요한 파일 제외, 경량화 고려

Dockerfile을 잘 설계하면 배포 자동화가 가능하고, 일관된 개발 및 운영 환경을 유지할 수 있습니다! 🚀