도커 컴포즈란?
- 여러 개의 컨테이너를 하나의 스크립트에 정의하고, 한번에 모든 컨테이너를 관리할 수 있도록 해주는 도구
- docker-compose.yaml 파일에 시스템을 구동하기 위해 필요한 컨테이너들의 설정을 입력
- docker compose up 명령을 입력하면, docker-compose.yaml 파일에 기재된 모든 컨테이너들이 실행됨
docker-compose.yaml 해석
- yaml 파일이란? json, xml과 같이 key, value로 구성되고 계층적 구조를 가짐, 들여쓰기 문법을 사용
- airflow의 docker-compose.yaml은 다음과 같은 주 항목을 가짐
version: '3.8' <- docker compose 파일 버전
x-ariflow-common: <- Extention Fields(각 컨테이너에 공통으로 적용할 항목)
services: <- 컨테이너로 실행할 서비스 관련 정보
volumes: <- 컨테이너에 할당할 볼륨 관련 정보
networks: <- 컨테이너에 연결할 네트워크 관련 정보
x-airflow-common
- 공통으로 지정할 항목으로 여러 컨테이너에서 동일하게 설정할 내용이 기재되어 있음
- & 연산자로 공통 항목을 블록 단위로 지정하고, * 연산자로 참조하여 사용할 수 있음
- 예를 들어서 &airflow-common에 image, environment, volumes, user, depends_on의 설정 값을 미리 정의해두고, airflow-webserver 컨테이너에 <<: *airflow-common을 입력하면 해당 설정값들을 직접 입력하지 않고 지정할 수 있음
- 즉, 컨테이너에 공통적으로 사용되는 설정들을 컨테이너마다 입력할 필요가 없음
- depends_on처럼 같은 항목이 반복되면, 가장 마지막 항목이 적용됨
services
services에서 airflow 서비스를 위한 여러 개의 컨테이너 서비스가 정의됨
services:
postgres:
...
redis:
...
airflow-webserver:
...
airflow-scheduler:
...
airflow-worker:
...
airflow-triggerer:
...
airflow-init:
...
airflow-cli:
...
flower:
...
- postgres: Airflow의 메타데이터 데이터베이스를 제공하는 서비스
- DAG, 태스크, 로그 등의 메타데이터가 저장됨
- redis: 메시지 브로커로서, CeleryExecutor에서 태스크의 대기열을 관리하기 위해 사용
- airflow-webserver: Airflow의 웹 UI를 제공하는 서비스로 사용자가 DAG을 관리하고 모니터링할 수 있음
- airflow- scheduler: DAG의 트리거와 태스크 실행을 스케줄링하는 역할
- airflow-worker: 실제로 태스크를 실행하는 서비스
- airflow-trigger: Triggerer 컴포넌트를 실행하기 위한 서비스로 Airflow 2.2.0부터 도입됨
- airflow-init: Airflow 설치를 처음 설정하거나 초기화할 때 사용하는 서비스
- 데이터베이스 초기화, Admin 사용자 생성, 기타 초기 설정 등의 작업을 수행
- airflow-cli: Airflow의 command line 인터페이스(CLI)를 실행하기 위한 서비스
- flower: CeleryExecutor를 사용하는 경우, 작업자의 상태를 모니터링하는 웹 기반 툴
postgres 자세히 보기
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
ports:
- 5432:5432
restart: always
- postgres: 서비스의 이름을 정의
- image: 사용할 이미지
- Docker Hub에서 PostgreSQL의 13 버전 이미지를 가져옴
- environment: 컨테이너에서 사용되는 환경 변수를 정의
- volumes: 볼륨을 PostgreSQL의 데이터 저장소 경로와 마운트
- healthcheck: 컨테이너의 상태를 모니터링하기 위한 설정
- test: 컨테이너가 정상적으로 동작하는지 확인하기 위해 실행할 명령어
- 여기서는 "pg_isready -U airflow" 명령을 사용
- interval: health check 실행 간격
- timeout: health check 응답을 기다리는 최대 시간
- retries: health check에 실패할 때 재시도하는 횟수
- start_period: 컨테이너가 시작된 후 health check를 시작하기 전까지 대기하는 시간
- 컨테이너가 초기화될 시간을 충분히 주기 위해 설정
- test: 컨테이너가 정상적으로 동작하는지 확인하기 위해 실행할 명령어
- ports: 호스트 시스템의 포트를 컨테이너 내부의 포트와 매핑
- "5432:5432"은 호스트의 5432번 포트를 컨테이너의 5432번 포트에 연결하는 것을 의미
- restart: always: 컨테이너가 종료되거나 충돌할 경우 자동으로 다시 시작되도록 설정
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: 서비스의 이름을 정의
- expose: 컨테이너 내부적으로 사용 가능한 포트
- 포트를 컨테이너 간에만 노출하고, 호스트 시스템에는 노출하지 않음
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-webserver: 서비스의 이름을 정의
- <<: *airflow-common: airflow-common이라는 앵커를 참조 해당 설정 포함시킴
- command: 컨테이너가 시작될 때 실행할 명령을 지정, 여기서는 'webserver'
- depends-on: 컨테이너의 실행 순서를 정해줌
- redis, postgres, airflow-init 컨테이너가 먼저 실행되고 나서 해당 컨테이너를 올림
- condition: 서비스가 특정 조건이 될때 종속된 서비스를 시작
- 여기서는 airflow-init이 'service_completed_successfully'가 될때까지 airflow-webserver를 시작하지 않도록 함
volumes
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
ports:
- 5432:5432
restart: always
...
volumes:
postgres-db-volume:
- 데이터를 저장하고 컨테이너 간에 공유하기 위한 볼륨을 정의
- 컨테이너는 종료되거나 삭제되면 그 안의 데이터도 함께 사라지기 때문에, volume을 컨테이너의 파일 시스템 내의 특정 디렉토리와 마운트해서 사용
- 예를 들어서 postgres-db-volume이라는 볼륨을 정의하고, 이를 PostgreSQL 컨테이너의 /var/lib/postgresql/data 디렉토리와 마운트
'Data Engineering > Airflow' 카테고리의 다른 글
[Airflow] log file 관리하기 (0) | 2024.03.21 |
---|---|
[Airflow] Trigger Rule 설정 (0) | 2024.03.12 |
[Airflow] BaseBranch Operator로 분기처리 (0) | 2024.02.21 |
[Airflow] @task.branch로 분기처리 (0) | 2024.02.21 |
[Airflow] BranchPython Operator로 분기처리 (0) | 2024.02.21 |