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 환경 구축
- Airflow 파이프라인
- Ollama LLM 활용
- ChromaDB Vector DB
- 실전 운영
'Data Engineer' 카테고리의 다른 글
| 6. Vector DB와 시맨틱 검색: Chroma DB (0) | 2025.10.11 |
|---|---|
| 5. LLM 활용 RAG 질의응답 구현 (0) | 2025.10.11 |
| 4. Spark로 대용량 데이터 전처리 (0) | 2025.10.10 |
| 3. Airflow로 데이터 파이프라인 자동화 (0) | 2025.10.10 |
| 1. 채용공고 Q&A 시스템 아키텍처 (0) | 2025.10.09 |
댓글