소프트웨어 개발/Docker

🐳 Docker 강의 3강: Dockerfile을 이용한 커스텀 이미지 생성

브라더댄 2025. 1. 27. 01:01
728x90
반응형
SMALL

🚀 강의 목표

  • Dockerfile의 기본 구조와 주요 명령어를 학습합니다.
  • 커스텀 Docker 이미지를 생성하고 실행해 봅니다.
  • 실제 사례를 통해 실무에서 Dockerfile을 활용하는 방법을 이해합니다.
  • Docker 이미지 빌드 과정 중 발생할 수 있는 문제를 해결합니다.

🧐 Dockerfile이란?

1. Dockerfile의 정의

Dockerfile은 Docker 이미지를 생성하기 위한 스크립트 파일입니다.
이미지 빌드 과정에서 실행할 명령어와 설정을 순서대로 기술합니다.

Dockerfile은 레시피 📜, 이미지는 레시피로 만든 요리 🍲입니다.


2. Dockerfile이 필요한 이유

  • 재사용성: 동일한 이미지를 언제든지 동일한 환경에서 재생성할 수 있습니다.
  • 자동화: 명령어를 수동으로 입력하지 않아도 이미지를 생성합니다.
  • 버전 관리: Dockerfile을 Git에 저장하여 빌드 프로세스를 추적할 수 있습니다.

3. Dockerfile의 기본 구조

Dockerfile은 주로 아래 명령어들로 구성됩니다:

명령어 역할

FROM 기반이 되는 이미지 지정
RUN 명령어 실행 (예: 패키지 설치)
COPY/ADD 파일을 이미지에 복사
CMD 컨테이너 시작 시 실행할 명령어 (1개만 작성 가능)
ENTRYPOINT 컨테이너 실행 시 실행할 명령어 (CMD와 함께 사용 가능)
WORKDIR 작업 디렉토리 설정
ENV 환경 변수 설정
EXPOSE 컨테이너에서 노출할 포트

🖥️ Dockerfile 작성 및 커스텀 이미지 생성

1. 간단한 Python 웹 애플리케이션 이미지 생성

1.1 준비물

  • Python과 Flask를 이용한 간단한 웹 애플리케이션 코드:
    app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return "Hello, Docker!"

    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=5000)
    ```

-   **requirements.txt** (Flask 설치)

1.2 Dockerfile 작성

  • Dockerfile (현재 디렉토리에 작성)
# Step 1: Python 3.9 이미지를 기반으로 함
FROM python:3.9-slim

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

# Step 3: 애플리케이션 파일 복사
COPY requirements.txt requirements.txt
COPY app.py app.py

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

# Step 5: 컨테이너 실행 시 Flask 서버 시작
CMD ["python", "app.py"]

1.3 Docker 이미지 빌드

  • 이미지 생성 명령어:
docker build -t flask-app .
-   \-t flask-app: 생성될 이미지 이름과 태그 설정
-   .: 현재 디렉토리에 있는 Dockerfile을 사용

1.4 컨테이너 실행

  • 컨테이너 실행 명령어:
    • -d: 백그라운드 모드로 실행
    • -p 5000:5000: 호스트의 5000번 포트를 컨테이너의 5000번 포트와 매핑
    • --name flask-container: 컨테이너 이름 지정
  • docker run -d -p 5000:5000 --name flask-container flask-app
  • 브라우저에서 **http://localhost:5000**으로 접속하여 "Hello, Docker!" 메시지가 출력되면 성공! 🎉

2. Docker 이미지 최적화

2.1 멀티스테이지 빌드

Docker 이미지를 최적화하기 위해 멀티스테이지 빌드를 활용할 수 있습니다.

  • 최적화된 Dockerfile:
# Step 1: Build 단계

FROM python:3.9-slim AS builder  
WORKDIR /app  
COPY requirements.txt requirements.txt  
RUN pip install --no-cache-dir -r requirements.txt

# Step 2: 최종 이미지

FROM python:3.9-slim  
WORKDIR /app  
COPY --from=builder /app /app  
COPY app.py app.py  
CMD \["python", "app.py"\]
  • 효과: 불필요한 빌드 아티팩트 제거, 이미지 크기 감소.

3. Dockerfile 활용 사례

3.1 Node.js 애플리케이션 Dockerfile

Node.js를 기반으로 간단한 애플리케이션을 Docker에 배포하는 사례:


FROM node:14  
WORKDIR /usr/src/app  
COPY package\*.json ./  
RUN npm install  
COPY . .  
EXPOSE 3000  
CMD \["npm", "start"\]
  • 사용 사례: React/Vue 등 SPA 프로젝트, API 서버.

3.2 MySQL 컨테이너 구성

MySQL 컨테이너를 데이터 볼륨과 함께 실행:


docker run --name mysql-container -e MYSQL\_ROOT\_PASSWORD=root -d -p 3306:3306 mysql:5.7
  • MySQL 환경 설정을 Dockerfile로 관리할 수도 있습니다.

❗ 실습 중 발생할 수 있는 오류와 해결 방법

1. 이미지 빌드 실패

  • 문제: docker build 실행 시 "file not found" 오류 발생.
  • 해결: Dockerfile과 필요한 파일(app.py, requirements.txt)이 동일 디렉토리에 있는지 확인하세요.

2. 컨테이너 실행 후 종료

  • 문제: 컨테이너 실행 직후 종료됨.
  • 원인: CMD 또는 ENTRYPOINT에 잘못된 명령어 설정.
  • 해결: Dockerfile의 CMD 명령어를 확인하고, docker logs로 로그를 점검하세요.

3. 포트 충돌

  • 문제: "port is already in use" 오류 발생.
  • 해결: 다른 포트를 사용하거나, 기존 컨테이너를 중지:
docker stop <컨테이너_ID>

📝 정리 및 다음 강의 예고

1. 정리

  • Dockerfile은 커스텀 이미지를 생성하기 위한 강력한 도구입니다.
  • 기본 명령어(FROM, RUN, CMD, COPY, WORKDIR)를 통해 이미지를 손쉽게 빌드할 수 있습니다.
  • 멀티스테이지 빌드를 활용하면 최적화된 이미지를 생성할 수 있습니다.

2. 다음 강의 예고

다음 강의에서는 Docker 네트워킹을 다룹니다.

  • Docker 컨테이너 간 통신
  • 사용자 정의 네트워크 생성
  • 포트 포워딩과 외부 접속 설정

네트워크를 활용해 더 강력한 Docker 환경을 구성해 보세요! 😊


더 알아보기: Docker 공식 문서

 

728x90
반응형
LIST