MLOps/Airflow

[Airflow] Docker Compose 파일 해석

monkeykim 2024. 11. 14. 00:16

Docker Compose의 역할과 사용 방법

Docker Compose의 목적

Docker Compose는 다중 컨테이너를 생성하고 관리할 때 효율성을 제공합니다. 예를 들어, 데이터베이스, 웹서버, 백엔드 등 여러 구성 요소를 하나의 애플리케이션으로 묶어야 할 때 유용합니다. Compose 파일 하나에 모든 컨테이너의 설정을 정의하고, 한 번의 명령어로 일괄적으로 컨테이너를 관리할 수 있습니다.

Docker Compose 작성 방법

Docker Compose 설정 파일은 docker-compose.yaml이라는 이름으로 작성합니다. 이 파일에 각 컨테이너의 이미지, 환경 변수, 볼륨, 네트워크, 의존성 등을 YAML 형식으로 정의할 수 있습니다.

Docker Compose 서비스 시작 및 중지

설정 파일이 있는 디렉토리에서 다음 명령어로 모든 서비스를 시작할 수 있습니다.

sudo docker compose up

sudo docker compose down

이 명령어는 Compose 파일에 정의된 모든 컨테이너를 시작합니다. -d 옵션을 추가하면 백그라운드에서 실행할 수 있습니다.


Docker Compose 파일 구조와 해석

Docker Compose 설정 파일은 JSON이나 XML과 마찬가지로 key-value 구조를 따릅니다. YAML 문법을 사용하며, 계층적 구조를 가지므로 들여쓰기를 통해 구성 요소를 정의합니다.

주요 요소

  1. version: YAML 파일의 버전을 정의합니다. 각 버전에 따라 사용 가능한 옵션이 다를 수 있습니다.
  2. x-airflow-common: 공통 설정 항목을 정의하는 Extension 필드로, 여러 서비스에 중복되는 설정을 한 번에 지정할 수 있습니다. &를 붙여 이름을 정의하고, 각 서비스에서 <<: *airflow-common과 같이 참조합니다.
  3. services: Docker Compose의 핵심 구성 요소로, 실행할 각 컨테이너를 정의합니다. 각 서비스는 고유한 이름을 가지며, image, volumes, ports, environment, depends_on 등의 속성을 통해 세부 설정을 지정합니다.
    • depends_on: 컨테이너 실행 순서를 정의하는 항목입니다. 특정 서비스가 시작되기 전에 다른 서비스가 준비되었는지 확인합니다.
  4. volumes: 영구적인 데이터를 저장할 공간을 정의합니다. 예를 들어, 데이터베이스 데이터나 로그 파일을 호스트 시스템에 저장하여 컨테이너가 재시작되더라도 데이터가 유지되도록 합니다.
    • 볼륨 정보 확인 명령어
      • 볼륨 리스트 보기: sudo docker volume ls
      • 볼륨 상세 보기: sudo docker volume inspect {volume_id}
  5. networks: 컨테이너 간 네트워크 연결을 설정합니다. Compose 파일에서 네트워크를 정의하여 같은 네트워크에 연결된 컨테이너들이 서로 통신할 수 있도록 합니다.
    • 네트워크 정보 확인 명령어
      • 네트워크 리스트 보기: sudo docker network ls
      • 네트워크 상세 보기: sudo docker network inspect {network_id}

각 주요 요소 설명

x-airflow-common

x-airflow-common은 각 서비스가 공통적으로 사용하는 환경 변수와 설정을 정의합니다. 이 구성은 Docker Compose YAML Anchor 기능을 사용하여 중복 코드를 줄이고, 설정을 한 곳에서 관리할 수 있도록 합니다.

x-airflow-common:
  image: ${AIRFLOW_IMAGE_NAME:-apache/airflow:2.10.1}
  environment:
    &airflow-common-env
    AIRFLOW__CORE__EXECUTOR: CeleryExecutor
    AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow
    AIRFLOW__CELERY__RESULT_BACKEND: db+postgresql://airflow:airflow@postgres/airflow
    AIRFLOW__CELERY__BROKER_URL: redis://redis:6379/0
  volumes:
    - ${AIRFLOW_PROJ_DIR:-.}/airflow/dags:/opt/airflow/dags
    - ${AIRFLOW_PROJ_DIR:-.}/logs:/opt/airflow/logs
    - ${AIRFLOW_PROJ_DIR:-.}/plugins:/opt/airflow/plugins
  user: "${AIRFLOW_UID:-50000}:0"
  depends_on:
    postgres:
      condition: service_healthy
    redis:
      condition: service_healthy

주요 환경 변수 설명

  • AIRFLOW__CORE__EXECUTOR: CeleryExecutor를 설정하여 병렬 처리가 가능하게 합니다.
  • AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: Airflow가 사용할 PostgreSQL 데이터베이스 연결 URL입니다.
  • AIRFLOW__CELERY__RESULT_BACKEND: 작업의 결과를 저장하는 데이터베이스 URL입니다.
  • AIRFLOW__CELERY__BROKER_URL: CeleryExecutor에서 사용할 Redis 브로커 URL입니다.

Services 구성

PostgreSQL

services:
  postgres:
    image: postgres:13
    environment:
      POSTGRES_USER: airflow
      POSTGRES_PASSWORD: airflow
      POSTGRES_DB: airflow
    volumes:
      - postgres-db-volume:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "airflow"]
      interval: 10s
      retries: 5
      start_period: 5s
    restart: always

Airflow는 기본적으로 PostgreSQL을 메타데이터 데이터베이스로 사용합니다. 이 설정은 postgres라는 이름의 PostgreSQL 컨테이너를 생성하고, 데이터베이스 이름과 사용자 정보는 POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD로 설정합니다. pg_isready 명령어를 이용한 Health Check는 데이터베이스가 준비 상태인지 확인하고, 일정 시간 간격으로 상태를 확인하여 문제 발생 시 재시작합니다.

Redis

  redis:
    image: redis:7.2-bookworm
    expose:
      - 6379
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 30s
      retries: 50
      start_period: 30s
    restart: always

Redis는 Celery Executor에서 작업의 큐(queue)를 관리하기 위한 브로커로 사용됩니다. 여기서는 redis:7.2-bookworm 이미지를 사용하며, 포트 6379를 사용하여 외부와 통신합니다. Redis의 상태를 redis-cli ping 명령어로 확인하고, 연결에 문제가 있으면 자동으로 재시작합니다.

Airflow Webserver

  airflow-webserver:
    <<: *airflow-common
    command: webserver
    ports:
      - "8080:8080"
    healthcheck:
      test: ["CMD", "curl", "--fail", "http://localhost:8080/health"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 30s
    restart: always
    depends_on:
      <<: *airflow-common-depends-on
      airflow-init:
        condition: service_completed_successfully

Airflow의 웹 인터페이스를 제공하는 웹서버 서비스입니다. 이 서비스는 airflow webserver 명령어를 실행하여 웹 인터페이스를 열어 사용자가 DAG을 관리하고 모니터링할 수 있도록 합니다. 포트 8080을 개방하여 웹 브라우저에서 접근할 수 있도록 설정하고 있으며, curl 명령어를 이용한 Health Check로 웹서버의 상태를 확인합니다. 또한, airflow-init가 성공적으로 완료된 후에 실행됩니다.

Airflow Scheduler

  airflow-scheduler:
    <<: *airflow-common
    command: scheduler
    healthcheck:
      test: ["CMD", "curl", "--fail", "http://localhost:8974/health"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 30s
    restart: always
    depends_on:
      <<: *airflow-common-depends-on
      airflow-init:
        condition: service_completed_successfully

Scheduler는 DAG의 실행을 관리하는 핵심 서비스입니다. DAG을 주기적으로 체크하고 각 작업을 큐에 넣어 실행합니다. 이 설정에서는 curl 명령어로 스케줄러의 상태를 확인하며, airflow-init가 성공적으로 완료된 후에 실행됩니다.

Volumes

volumes:
  postgres-db-volume:

Volumes는 데이터를 영구적으로 보관하기 위한 공간을 제공합니다. postgres-db-volume는 PostgreSQL의 데이터베이스 데이터를 저장하는 볼륨으로, PostgreSQL 컨테이너가 종료되어도 데이터가 손실되지 않도록 합니다. 이는 데이터베이스가 유지되어야 하는 Airflow 환경에서 필수적인 설정입니다.