Apache Airflow - 설치하기 (Docker Compose)

Airflow란? #
- 워크플로우를 만들고 관리하기 위한 목적의 파이썬 기반 오픈소스 플랫폼
- 워크플로우는 DAG(Directed Acyclic Graph) 구조를 가짐
- Cron 기반으로 작업 스케줄링
- 웹 UI를 통해 작업을 모니터링하고 실패 시 재실행이 가능
Airflow 장점 #
- 파이썬에서 지원되는 다양한 라이브러리를 활용 가능
- 대규모 환경에서 부하 증가 시 수평적 확장이 가능한 Kubenetes 등 아키텍처 지원
- 오픈소스 플랫폼의 이점을 살려 원하는 기능을 커스터마이징 가능
Airflow 단점 #
- 실시간 워크플로우 관리에 적합하지 않음 (최소 분 단위 실행)
- 워크플로우가 많아질수록 모니터링이 어려움
DAG(Directed Acyclic Graph) #
- DAG는 Task 간의 종속성과 순서를 지정
- Task : DAG 내에서 어떠한 행위를 할 수 있는 객체
- DAG는 1개 이상의 Task로 구성
- Task 간에 순한되지 않고 방향성을 가짐
- Task에 대한 종속성은
>>또는<<연산자를 사용해 선언- 예시)
first_task >> second_task
- 예시)

Airflow Workflow #
- Scheduler : 예약된 일정에 워크플로우를 Executor에게 넘겨 Task를 실행
- Executor : Scheduler 내부의 모든 작업을 실행하며, 모든 Task가 순차적으로 실행되게 관리
- Worker : 실제 Task를 실행하는 주체
- Metadata Database : Scheduler, Executor, Webserver가 상태를 저장하는데 사용
- DAG Directory : 파이썬으로 작성한 DAG 파일을 저장하는 공간
- Webserver : User Interface를 통해 Scheduler와 DAG 실행 과정을 시각화해 표시

User Interface #
- DAG와 각각의 작업이 수행되는 내용을 시각적으로 확인
- DAG 실행을 직접 트리거
- DAG 실행 로그를 확인하고 제한적인 디버깅 수행
Architecture Overview — Airflow Documentation
airflow.apache.org
Airflow 설치 환경 #
- macOS Sequoia 15.5
- Docker Desktop 4.41.2
- Airflow 3.0.1
Docker란? #
- 애플리케이션을 독립적인 환경에서 실행시키는 기술
- 가상화 서버(VM)와 비교했을 때, Guest OS를 요구하지 않아 더 효율적인 자원 활용이 가능
docker-compose를 이용해 Airflow를 운영하는데 필요한 여러 서비스(컨테이너)를 실행

Docker Descktop 설치 #
Mac
Install Docker Desktop for Mac to get started. This guide covers system requirements, where to download, and …
Docker Documentation- 운영체제에 맞는 Docker Descktop 파일을 내려받아 설치
- 설치 후 실행하면 아래와 같은 초기 화면을 확인

Airflow 설치하기 #
Running Airflow in Docker — Airflow 3.1.3 Documentation
airflow.apache.org1. docker-compose.yaml #
bash
% curl -LfO 'https://airflow.apache.org/docs/apache-airflow/3.0.1/docker-compose.yaml'
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 12766 100 12766 0 0 38365 0 --:--:-- --:--:-- --:--:-- 38336- Airflow 문서로부터
docker-compose.yaml경로를 복사해 터미널에서 요청 - 내려받은
docker-compose.yaml파일을 보면 아래와 같은 컨테이너가 설치될 것임을 짐작 가능
yaml
services:
postgres:
image: postgres:13
redis:
image: redis:7.2-bookworm
airflow-apiserver: ...
airflow-scheduler: ...
airflow-dag-processor: ...
airflow-worker: ...
airflow-triggerer: ...
airflow-init: ...
airflow-cli: ...
flower: ...2. 환경 설정 #
bash
mkdir -p ./dags ./logs ./plugins ./config
echo -e "AIRFLOW_UID=$(id -u)" > .env- Airflow 문서에 따라 필요한 디렉토리를 생성
- AIRFLOW_UID가 설정되지 않았다는 경고를 피하기 위해
.env파일을 생성
3. Airflow 초기화 #
bash
docker compose up airflow-initexited with code 0가 출력되면 정상적으로 초기화되어 다음 단계로 진행
4. Airflow 실행 #
text
docker compose up- Docker Desktop 상에서 아래 이미지와 같이 모든 컨테이너들이 실행되고 있는지 확인 가능

- 또는 터미널에서
docker ps명령어를 입력해 컨테이너 실행 상태를 조회 가능
bash
% docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0431bfa0d1f apache/airflow:3.0.1 "/usr/bin/dumb-init …" 1 minutes ago Up 1 minutes (healthy) 8080/tcp airflow-airflow-worker-1
4d32f0c45d4a apache/airflow:3.0.1 "/usr/bin/dumb-init …" 1 minutes ago Up 1 minutes (healthy) 8080/tcp airflow-airflow-triggerer-1
f4cd1b0887de apache/airflow:3.0.1 "/usr/bin/dumb-init …" 1 minutes ago Up 1 minutes (healthy) 8080/tcp airflow-airflow-dag-processor-1
3213192935b6 apache/airflow:3.0.1 "/usr/bin/dumb-init …" 1 minutes ago Up 1 minutes (healthy) 8080/tcp airflow-airflow-scheduler-1
e933dc415a73 apache/airflow:3.0.1 "/usr/bin/dumb-init …" 1 minutes ago Up 1 minutes (healthy) 0.0.0.0:8080->8080/tcp airflow-airflow-apiserver-1
94f88f2e5507 postgres:13 "docker-entrypoint.s…" 6 minutes ago Up 6 minutes (healthy) 5432/tcp airflow-postgres-1
3f82ba15433e redis:7.2-bookworm "docker-entrypoint.s…" 6 minutes ago Up 6 minutes (healthy) 6379/tcp airflow-redis-1Airflow 둘러보기 #
Airflow 로그인 #
- 컨테이너가 정상적으로 실행 중인 경우 브라우저에서
localhost:8080주소로 접속하면 Airflow UI에 접근 가능 - 초기 계정은 Username 과 Password 모두
airflow입력

- 정상적으로 로그인 시 아래와 같은 홈페이지로 이동

Example DAG 실행 #
- 사이드바에서 Dags 메뉴를 클릭하면 DAG 목록이 있는 페이지로 이동
- 첫 번째에 있는
tutorial_taskflow_templatesDAG를 클릭하여 상세 페이지 조회

- 상단의 DAG 제목 옆에 토글 스위치를 클릭하면 DAG 활성화
- 좌측에서 DAG 내 Task 간 종속성을 그래프로 확인 (해당 DAG는 단일 Task로 구성)

- 내비게이션 메뉴 중에서 Runs 메뉴를 클릭하면 실행 이력을 조회

- 실행된 결과를 하나 클릭하면 하위 Task 목록을 조회 가능
- State 항목을 통해 처리 상태를 알 수 있는데,
success상태는 Task가 성공적으로 처리됨을 의미

- Task 하나를 클릭해서 Logs 메뉴에 들어가면 아래와 같이
context라는 객체를 출력하는 구문이 확인됨 - 앞서 DAG 페이지의 내비게이션 메뉴 중 Code 메뉴에서 이미 코드를 확인했는데,
get_current_context()라는 함수를 통해context라는 딕셔너리 객체를 가져와 출력하는 작업으로 추측
text
[2025-05-27, 23:31:26] INFO - context: {'dag': <DAG: tutorial_taskflow_templates>, ...}: chan="stdout": source="task"
Airflow 중지 #
bash
% docker compose stop
[+] Stopping 8/8
✔ Container airflow-airflow-dag-processor-1 Stopped 1.1s
✔ Container airflow-airflow-triggerer-1 Stopped 0.9s
✔ Container airflow-airflow-worker-1 Stopped 2.8s
✔ Container airflow-airflow-scheduler-1 Stopped 0.8s
✔ Container airflow-airflow-apiserver-1 Stopped 0.6s
✔ Container airflow-airflow-init-1 Stopped 0.0s
✔ Container airflow-postgres-1 Stopped 0.1s
✔ Container airflow-redis-1 Stopped 0.2s docker-compose.yaml파일이 있는 경로에서 서비스를 명시하지 않고 명령어를 실행하면 모든 Airflow 컨테이너를 중지
Airflow 컨테이너 삭제 #
bash
% docker compose down --volumes --rmi all
[+] Running 13/13
✔ Container airflow-airflow-dag-processor-1 Removed 1.5s
✔ Container airflow-airflow-triggerer-1 Removed 1.2s
✔ Container airflow-airflow-worker-1 Removed 3.4s
✔ Container airflow-airflow-scheduler-1 Removed 1.0s
✔ Container airflow-airflow-apiserver-1 Removed 0.9s
✔ Container airflow-airflow-init-1 Removed 0.1s
✔ Container airflow-postgres-1 Removed 0.2s
✔ Container airflow-redis-1 Removed 0.2s
✔ Image apache/airflow:3.0.1 Removed 0.9s
✔ Image postgres:13 Removed 0.9s
✔ Image redis:7.2-bookworm Removed 0.9s
✔ Volume airflow_postgres-db-volume Removed 0.0s
✔ Network airflow_default Removed 0.5s docker-compose.yaml파일이 있는 경로에서 서비스를 명시하지 않고 명령어를 실행하면 모든 Airflow 컨테이너를 삭제--rmi옵션을 추가하여 관련 이미지까지 모두 삭제