본문 바로가기
Data Engineer

2. Docker Compose를 활용한 서비스 통합 실행

by yu901 2025. 10. 9.

Docker Compose를 사용하여 Airflow, PostgreSQL, Ollama, FastAPI를 통합 실행하는 방법을 다룹니다.

Docker 개요

컨테이너 기반 가상화

Docker는 애플리케이션을 컨테이너라는 격리된 환경에서 실행하는 플랫폼입니다.

Docker 사용 이유

  • 환경 일관성: 로컬/스테이징/프로덕션 환경의 완전한 동일성 보장
  • 의존성 격리: 호스트 환경을 오염시키지 않고 프로젝트별 격리
  • 재현 가능한 배포: Dockerfile과 docker-compose.yml로 전체 스택을 코드화

핵심 용어

1. 이미지 (Image) = 설계도

FROM python:3.12-slim  # Python 3.12 환경
COPY my_app.py .       # 내 코드 복사

"Python 3.12가 깔려있고, 내 코드가 들어있는 환경"의 설계도

 

2. 컨테이너 (Container) = 실행 중인 앱

docker run my-image  # 이미지로부터 컨테이너 생성 & 실행

설계도(이미지)를 바탕으로 실제로 돌아가는 프로그램

 

3. Docker Compose = 여러 컨테이너 한번에 관리

services:
  postgres:    # 데이터베이스 컨테이너
  airflow:     # 워크플로우 컨테이너
  app:         # FastAPI 컨테이너
docker compose up --build

여러 서비스를 한번에 켜고 끌 수 있음

 


Dockerfile

이미지를 빌드하기 위한 명령어 스크립트
Airflow + FastAPI 통합 이미지를 빌드하기 위한 명령어 정의

FROM python:3.12-slim

ENV PYTHONUNBUFFERED=1
ENV AIRFLOW_HOME=/opt/airflow
ENV AIRFLOW__CORE__EXECUTOR=LocalExecutor
ENV JAVA_HOME=/usr/lib/jvm/default-java

WORKDIR /opt/airflow

RUN apt-get update && apt-get install -y --no-install-recommends \
    git libpq-dev default-jdk-headless \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

COPY src/ /opt/airflow/src/
COPY dags/ /opt/airflow/dags/

RUN echo '{"admin": "admin"}' > /opt/airflow/simple_auth_manager_passwords.json.generated

EXPOSE 8000 8080 5555

docker-compose.yml

여러 컨테이너의 설정과 의존성을 정의하는 YAML 파일
5개 서비스(PostgreSQL, Airflow, Ollama, FastAPI)의 의존성과 네트워크 설정을 정의

공통 설정

x-airflow-common:
  &airflow-common
  build: .
  environment:
    - AIRFLOW__CORE__EXECUTOR=LocalExecutor
    - AIRFLOW__DATABASE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres/airflow
  volumes:
    - ./src:/opt/airflow/src
    - ./dags:/opt/airflow/dags
    - ./config:/opt/airflow/config
    - ./data:/opt/airflow/data
    - ./chroma:/opt/airflow/chroma
    - ./logs:/opt/airflow/logs
  depends_on:
    postgres:
      condition: service_healthy

서비스 1: PostgreSQL

postgres:
  image: postgres:13
  container_name: career-rag-postgres
  environment:
    - POSTGRES_USER=airflow
    - POSTGRES_PASSWORD=airflow
    - POSTGRES_DB=airflow
  ports:
    - "5433:5432"
  volumes:
    - postgres_data:/var/lib/postgresql/data
  healthcheck:
    test: ["CMD", "pg_isready", "-U", "airflow"]
    interval: 5s
    timeout: 5s
    retries: 5
  restart: unless-stopped

역할: Airflow 메타데이터 저장소

서비스 2: Airflow Init

airflow-init:
  <<: *airflow-common
  container_name: career-rag-airflow-init
  entrypoint: /bin/bash
  command: -c "airflow db migrate"

역할: DB 초기화 (일회성)

서비스 3: Airflow Standalone

airflow-standalone:
  <<: *airflow-common
  container_name: career-rag-airflow-standalone
  command: airflow standalone
  ports:
    - "8080:8080"
  depends_on:
    airflow-init:
      condition: service_completed_successfully
  restart: unless-stopped

역할: 웹 UI + 스케줄러 + 트리거
접속: http://localhost:8080 (admin/admin)

서비스 4: FastAPI

app:
  build: .
  container_name: career-rag-app
  command: uvicorn src.main.python.main:app --host 0.0.0.0 --port 8000
  ports:
    - "8000:8000"
  volumes:
    - ./src:/opt/airflow/src
    - ./config:/opt/airflow/config
    - ./data:/opt/airflow/data
    - ./chroma:/opt/airflow/chroma
  restart: unless-stopped
  depends_on:
    - ollama

역할: QA API 서버
접속: http://localhost:8000/docs

서비스 5: Ollama

ollama:
  image: ollama/ollama
  container_name: ollama
  ports:
    - "11434:11434"
  volumes:
    - ./ollama:/root/.ollama
  restart: unless-stopped

역할: LLM 추론 서버


Docker Compose 실행 예시


시리즈 목차

  1. 프로젝트 개요
  2. Docker 환경 구축 
  3. Airflow 파이프라인
  4. Ollama LLM 활용
  5. ChromaDB Vector DB
  6. 실전 운영

댓글