[Docker] Dockerfile 작성법

2024. 11. 18. 21:30· Docker
목차
  1. 1. 🛠️ Dockerfile이란?
  2. 🧩 주요 특징
  3. 2. 🧩 Dockerfile 명령어: 기본부터 심화까지
  4. 2.1. 🖼️ FROM: 베이스 이미지 설정
  5. 2.2. 🔨 RUN: 명령 실행
  6. 2.3. 📂 COPY와 ADD: 파일 복사
  7. 2.4. 🗂️ WORKDIR: 작업 디렉토리 설정
  8. 2.5. 🌱 ENV: 환경 변수 설정
  9. 2.6. 🌐 EXPOSE: 포트 공개
  10. 2.7. 🛠️ CMD와 ENTRYPOINT: 컨테이너 실행 명령 설정
  11. 2.8. 🧹 Multi-stage Build: 이미지 최적화
  12. 3. 🚀 종합 Dockerfile 예제
  13. Python Flask 프로젝트 예제
  14. Node.js 프로젝트 예제
  15. 4. 🔑 Dockerfile 작성 시 주의사항 및 체크리스트
  16. 5. ✨ 최종 요약
  17. Dockerfile 작성 프로세스
  18. 실전 팁
반응형

이전 포스팅에서 다뤘던 [Docker란 무엇인가?] 내용을 참고하시면, 이번 주제에 대한 배경 지식이나 기초 정보를 확인하실 수 있습니다!

 

[Docker] Docker란 무엇인가?

🐳 1. Docker란 무엇인가요?Docker는 애플리케이션을 컨테이너라는 독립된 환경에 격리시켜 실행할 수 있게 도와주는 오픈 소스 플랫폼입니다. 애플리케이션과 그에 필요한 모든 라이브러리, 종속

tae-hui.tistory.com

 


1. 🛠️ Dockerfile이란?

Dockerfile은 컨테이너 이미지를 정의하는 스크립트 파일로, 이미지 빌드에 필요한 설정과 명령을 담고 있습니다.

🧩 주요 특징

  • Dockerfile은 단계별로 이미지를 정의합니다.
  • 빌드 시 각 단계가 레이어(layer)로 저장됩니다.
  • Docker는 레이어를 캐싱해 빌드 속도를 최적화합니다.

2. 🧩 Dockerfile 명령어: 기본부터 심화까지

Dockerfile은 다양한 명령어로 구성됩니다. 명령어와 역할을 하나씩 살펴보겠습니다.


2.1. 🖼️ FROM: 베이스 이미지 설정

Docker 이미지는 항상 베이스 이미지에서 시작합니다. 공식 이미지를 사용하는 것이 일반적입니다.

# Python 3.9 슬림 버전 사용
FROM python:3.9-slim

슬림(slim) 이미지는 경량화된 베이스 이미지로, 불필요한 라이브러리가 포함되지 않아 최적화에 유리합니다.


2.2. 🔨 RUN: 명령 실행

이미지 빌드 과정에서 실행할 명령어를 정의합니다. 주로 패키지 설치, 환경 구성에 사용됩니다.

# 패키지 업데이트 및 설치
RUN apt-get update && apt-get install -y curl git

🧑‍🔬 최적화 팁

  1. 명령어 병합: 여러 RUN 명령을 하나로 합쳐 레이어를 줄이세요.
  2. RUN apt-get update && \ apt-get install -y curl git && \ apt-get clean && rm -rf /var/lib/apt/lists/*
  3. 캐싱 활용: 빈번히 변경되는 파일(코드)보다 의존성 설치 명령을 먼저 작성하세요.

2.3. 📂 COPY와 ADD: 파일 복사

컨테이너로 파일을 복사합니다.

  • COPY: 단순 파일 복사.
  • ADD: URL 다운로드, 압축 해제 기능 지원.
# 현재 디렉토리의 모든 파일을 컨테이너의 /app 디렉토리로 복사
COPY . /app

COPY 추천: 대부분의 경우 COPY가 더 효율적입니다. ADD는 URL이나 압축 파일 처리 시에만 사용하세요.


2.4. 🗂️ WORKDIR: 작업 디렉토리 설정

명령어 실행의 기본 경로를 설정합니다. 이후 명령(RUN, CMD, COPY)은 이 디렉토리를 기준으로 실행됩니다.

WORKDIR /app

2.5. 🌱 ENV: 환경 변수 설정

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

ENV APP_ENV=production
ENV DEBUG=false

환경 변수는 모든 명령어와 애플리케이션에서 참조 가능합니다.


2.6. 🌐 EXPOSE: 포트 공개

컨테이너가 외부와 통신할 포트 번호를 지정합니다.

EXPOSE 8080

주의: EXPOSE는 포트를 명시적으로 지정하는 역할만 합니다. 컨테이너 실행 시 실제로 열려면 docker run -p 옵션이 필요합니다.


2.7. 🛠️ CMD와 ENTRYPOINT: 컨테이너 실행 명령 설정

컨테이너가 실행될 때 명령어를 정의합니다.

  • CMD: 컨테이너 시작 시 기본 실행 명령.
  • ENTRYPOINT: 고정 실행 명령.

CMD 예제

CMD ["python", "app.py"]

ENTRYPOINT 예제

ENTRYPOINT ["python"]
CMD ["app.py"]

동시 사용: ENTRYPOINT는 고정된 실행 파일, CMD는 옵션으로 함께 사용할 수 있습니다.


2.8. 🧹 Multi-stage Build: 이미지 최적화

Multi-stage Build는 빌드와 런타임 환경을 분리해 이미지 크기를 최소화합니다.

# 1단계: 빌드
FROM node:16 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build

# 2단계: 런타임
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

이점: 빌드에 필요한 도구와 의존성을 최종 이미지에 포함하지 않아 더 작은 이미지를 생성합니다.


3. 🚀 종합 Dockerfile 예제

Python Flask 프로젝트 예제

# 베이스 이미지 설정
FROM python:3.9-slim

# 환경 변수 설정
ENV PYTHONUNBUFFERED=1 APP_ENV=production

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

# 의존성 설치
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

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

# 포트 공개
EXPOSE 5000

# 실행 명령 설정
CMD ["python", "app.py"]

Node.js 프로젝트 예제

# 1단계: 빌드
FROM node:16 AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build

# 2단계: 런타임
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

4. 🔑 Dockerfile 작성 시 주의사항 및 체크리스트

  1. 최소한의 베이스 이미지 사용: slim 또는 alpine 추천.
  2. 불필요한 파일 제외: .dockerignore 파일로 빌드에 포함되지 않을 파일 정의.
  3. 캐싱 최적화: 변경 빈도가 높은 명령은 아래쪽에 배치.
  4. 명령어 병합: RUN 명령을 한 줄로 합쳐 레이어 수 줄이기.
  5. 환경 변수 활용: 설정값을 코드에서 분리.
  6. Multi-stage Build 사용: 빌드와 런타임 환경 분리.

5. ✨ 최종 요약

Dockerfile 작성 프로세스

  1. FROM: 베이스 이미지 선택.
  2. WORKDIR: 작업 디렉토리 설정.
  3. COPY / ADD: 파일 복사.
  4. RUN: 의존성 설치 및 환경 구성.
  5. ENV: 환경 변수 설정.
  6. EXPOSE: 외부 통신 포트 정의.
  7. CMD / ENTRYPOINT: 컨테이너 실행 명령 설정.

실전 팁

  • Multi-stage Build로 이미지 크기 최소화.
  • 불필요한 레이어 줄이기.
  • .dockerignore로 빌드 최적화.
반응형
저작자표시 비영리 변경금지 (새창열림)

'Docker' 카테고리의 다른 글

[Docker] SSH 연결 문제와 Docker 설정: 원인부터 해결까지  (0) 2024.11.20
[Docker] 리눅스에서 Docker 설치 및 실행 방법  (0) 2024.11.19
[Docker] Docker란 무엇인가?  (5) 2024.11.10
[Docker] 네트워크 변경(네트워크 중복으로 인한 접속 불가능), HTTP 허용, Root 경로 수정 daemon.json 설정  (0) 2023.12.04
[Docker] MariaDB 실행 방법  (0) 2023.05.02
  1. 1. 🛠️ Dockerfile이란?
  2. 🧩 주요 특징
  3. 2. 🧩 Dockerfile 명령어: 기본부터 심화까지
  4. 2.1. 🖼️ FROM: 베이스 이미지 설정
  5. 2.2. 🔨 RUN: 명령 실행
  6. 2.3. 📂 COPY와 ADD: 파일 복사
  7. 2.4. 🗂️ WORKDIR: 작업 디렉토리 설정
  8. 2.5. 🌱 ENV: 환경 변수 설정
  9. 2.6. 🌐 EXPOSE: 포트 공개
  10. 2.7. 🛠️ CMD와 ENTRYPOINT: 컨테이너 실행 명령 설정
  11. 2.8. 🧹 Multi-stage Build: 이미지 최적화
  12. 3. 🚀 종합 Dockerfile 예제
  13. Python Flask 프로젝트 예제
  14. Node.js 프로젝트 예제
  15. 4. 🔑 Dockerfile 작성 시 주의사항 및 체크리스트
  16. 5. ✨ 최종 요약
  17. Dockerfile 작성 프로세스
  18. 실전 팁
'Docker' 카테고리의 다른 글
  • [Docker] SSH 연결 문제와 Docker 설정: 원인부터 해결까지
  • [Docker] 리눅스에서 Docker 설치 및 실행 방법
  • [Docker] Docker란 무엇인가?
  • [Docker] 네트워크 변경(네트워크 중복으로 인한 접속 불가능), HTTP 허용, Root 경로 수정 daemon.json 설정
TaeHuiLee
TaeHuiLee
창업, 사업, 자기개발, 운동, Web, App, Java, python, 이슈, 개발자, JavaScript, amazon, cloud server, 취업, 스펙, Android Studio, Spring, React, Node.js, 구독하면 댓글 남겨주세요.
TaeHuiLee
Developer_TaeHui
TaeHuiLee
  • 분류 전체보기 (228)
    • WEB (71)
    • Java (38)
    • APP (17)
    • 딥러닝 (2)
    • DB (5)
    • 알고리즘 (17)
    • Python (10)
    • AWS (5)
    • Git (8)
    • Docker (13)
    • 창업 (2)
    • Java Script (5)
    • 군집드론 (3)
    • C언어 (1)
    • IT 지식 (16)
    • Rust (1)
    • Tomcat (1)
    • Nginx (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Java
  • javascript
  • 정렬
  • spring boot
  • 어플
  • 수원역 맛집
  • 선택정렬
  • WSL
  • Spring
  • 자바
  • python
  • GIT
  • github
  • axios
  • Nuxt
  • 수원 맛집
  • 강릉 맛집
  • DB
  • docker
  • 관상 어플
  • ubuntu
  • Queue
  • 도커
  • 티스토리챌린지
  • 알고리즘
  • 파이썬
  • mariadb
  • 오블완
  • 서울 맛집
  • VUE

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
TaeHuiLee
[Docker] Dockerfile 작성법
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.