안녕하세요. 새내기 개발자입니다. 공부하면서 정리하는 글로 틀린 부분은 언제나 댓글로 환영입니다!
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"]
실행 과정 설명:
- FROM node:18 → Node.js 18 버전이 포함된 공식 이미지를 사용합니다.
- WORKDIR /app → 컨테이너 내부에서 작업 디렉토리를 /app으로 설정합니다.
- COPY package.json ./ → package.json을 컨테이너로 복사합니다.
- RUN npm install → npm install을 실행하여 의존성을 설치합니다.
- COPY . . → 애플리케이션의 모든 소스 코드를 컨테이너 내부로 복사합니다.
- EXPOSE 3000 → 컨테이너가 3000번 포트를 사용한다고 명시합니다.
- 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을 잘 설계하면 배포 자동화가 가능하고, 일관된 개발 및 운영 환경을 유지할 수 있습니다! 🚀
'클라우드' 카테고리의 다른 글
쿠버네티스(Kubernetes) 기본 명령어 정리 (0) | 2025.02.13 |
---|---|
Helm 사용 방법 가이드 (0) | 2025.02.09 |
[클라우드] Docker? Kubernetes? 개념 정리 (1) | 2025.02.04 |