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 문법을 사용하며, 계층적 구조를 가지므로 들여쓰기를 통해 구성 요소를 정의합니다.
주요 요소
- version: YAML 파일의 버전을 정의합니다. 각 버전에 따라 사용 가능한 옵션이 다를 수 있습니다.
- x-airflow-common: 공통 설정 항목을 정의하는 Extension 필드로, 여러 서비스에 중복되는 설정을 한 번에 지정할 수 있습니다. &를 붙여 이름을 정의하고, 각 서비스에서 <<: *airflow-common과 같이 참조합니다.
- services: Docker Compose의 핵심 구성 요소로, 실행할 각 컨테이너를 정의합니다. 각 서비스는 고유한 이름을 가지며, image, volumes, ports, environment, depends_on 등의 속성을 통해 세부 설정을 지정합니다.
- depends_on: 컨테이너 실행 순서를 정의하는 항목입니다. 특정 서비스가 시작되기 전에 다른 서비스가 준비되었는지 확인합니다.
- volumes: 영구적인 데이터를 저장할 공간을 정의합니다. 예를 들어, 데이터베이스 데이터나 로그 파일을 호스트 시스템에 저장하여 컨테이너가 재시작되더라도 데이터가 유지되도록 합니다.
- 볼륨 정보 확인 명령어
- 볼륨 리스트 보기: sudo docker volume ls
- 볼륨 상세 보기: sudo docker volume inspect {volume_id}
- 볼륨 정보 확인 명령어
- 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 환경에서 필수적인 설정입니다.
'MLOps > Airflow' 카테고리의 다른 글
[Airflow] Provider 패키지 설치 (2) | 2024.11.17 |
---|---|
[Airflow] PostgreSQL 연동 - Docker Compose를 활용한 설정과 Custom Hook 사용 (0) | 2024.11.16 |
[Airflow] DAG 실행과 스케줄링 (2) | 2024.11.13 |
[Airflow] Custom Operator 만들기 (0) | 2024.11.11 |
[Airflow] SimpleHttpOperator에 대해 알아보기 (1) | 2024.11.10 |