데이터 엔지니어링

[Airflow] airflow 띄워보기 with/without 도커!

magnate96 2025. 1. 30. 22:01

Run Airflow in Python Environment

  • 기본적으로 윈도우 환경에서는 VSC에서 리눅스 커맨드 사용 어려움 => 그래서 WSL 활용함.
    • globalman, globalman
  • 패키지 충돌 방지 및 프로젝트를 가상으로 독립적으로 관리하기 위해 python의 venv를 활용함.
    • 이 가상환경에 들어가려면 source py_env/bin/activate 커맨드로 입장하면 됨.
    • 이 가상환경에서 나가려면 deactivate 커맨드로 퇴장하면 됨.
  • Apache Airflow를 로컬환경에 다운로드받음. 시간이 꽤나 걸림. 대략 5분 소요됨.
pip install 'apache-airflow==2.10.4' \
 --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.10.4/constraints-3.9.txt"

 

  • 우리 프로젝트에 쓰일 DB를 SQLite DB로 초기화하려고 하는데, 환경변수를 절대경로로 바꿔주고 함.
  • 추가로 admin 유저 만들어 줌 (pw: globalman)
export AIRFLOW_HOME=$(pwd)
airflow db init

airflow users create --username admin --firstname firstname --lastname lastname --role Admin --email
 admin@domain.com

 

  • airflow를 웹 상에서 GUI로 띄워보면 아래와 같이 뜸.
airflow webserver -p 8080

 

여기에 아이디 비번치고 들어가면,

이런 첫 화면이 등장한다. DAG를 띄운 적 없기 때문에 아무것도 안 나오는 게 정상이다.

 

재밌는 건, SQLite은 병렬을 지원 안하기 때문에 parallelism을 1로 설정함.

 

 

Docker 핵심 개념

기본적으로 도커는 package를 돕고 소프트웨어를 실행하는 툴임. 컨테이너 기반 가상화 기술.

정확히는, 애플리케이션을 "컨테이너"라는 단위로 패키징하고 배포 및 실행할 수 있게 도와주는 도구.

 

컨테이너: 앱과 그 실행에 필요한 모든 환경을 하나의 독립된 단위로 묶은 것.

로컬 환경, OS와 독립적이고 어디서든 동일하게 실행 가능.

OS를 공유하는 방식이기 때문에 VM보다 더 가볍고 빠름.

 

추가 관련 용어들:

(1) 이미지: 컨테이너 실행 위한 설정과 파일들을 포함한 패키지. 한번 빌드된 이미지는 어디서든 동일하게 실행 가능.

(2) 컨테이너: 이미지를 기반으로 실행 중인 인스턴스. => "이미지"를 다운받아서 실행시키면 "컨테이너".

=> 이미지를 다운 받아서 컨테이너에서 수정하면, 그 수정사항을 기존의 이미지에 저장 못함. 새로운 이미지로 빌드시켜야함. 해당 이미지도, 빌드한 이후에는 수정 역시 못함.

 

(3) docker-compose: 원래는 docker run으로 단일 컨테이너를 실행하는 것이 기본인데, 여러 개의 컨테이너를 한번에 실행하려면 docker-compose up 사용함. 

 

* VM은 뭐가 다르지? => VM은 별도의 OS를 만들어 쓰기 때문에 무겁고 느림. 도커는 호스트 OS 공유.

                                       반대로 VM은 강력한 OS 격리가 가능하고, 도커는 가벼운 프로세스 단에서의 격리만 가능.

 

도커를 활용함으로써 개발환경에서 좋은 점은 몇가지 있지만, 핵심은 개발환경 통일, 그리고 테스트 등 여러 개의 API 및 프로그램을 로컬단에서 다운받지 않고 컨테이너 환경에서 실행 가능하다는 것이 핵심이다.

그리고 컨테이너를 지우거나 실행을 멈췄을 때, 로컬환경에는 아무런 영향을 주지 않는다는 것도 큰 장점이다.

 

컨테이너가 로컬 OS의 커널을 공유하면서 실행되지만, 내부에서는 격리된 파일 시스템을 사용.

컨테이너 내부 OS는 ubuntu지만, 실제 커널은 로컬의 호스트 OS (windows나 linux)를 사용함.

 

 

Docker 환경에서 개발하는 것에 익숙한가? 라는 질문에 대하여

단순히 "Docker를 써본 적 있는가?" 의 질문이 아님. 생각해보면, 아래의 체크리스트들을 자문해보라는 의미.

 

1 Docker를 사용하여 개발 환경을 구축하고 관리할 수 있는가?

(1) Dockerfile을 작성하여 개발 환경을 컨테이너화할 수 있는가?

(2) docker run, build, docker-compose를 활용하여 개발환경을 실행할 수 있는가?

(3) 호스트 OS에 의존하지 않고, 컨테이너 내부에서 필요한 라이브러리/패키지를 설정할 수 있는가?

 

2 멀티 컨테이너 개발 환경을 설정하고 관리할 수 있는가?

(1) docker-compose를 사용하여 여러 개의 컨테이너(DB, API, msg Q 등)를 한번에 실행할 수 있는가?

(2) docker network를 활용하여 컨테이너 간 통신을 설정할 수 있는가?

(3) volume을 사용하여 데이터 영속성을 유지할 수 있는가?

 

3 Docker 컨테이너에서 코드 실행 및 디버깅할 수 있는가?

(1) docker exec을 사용하여 컨테이너 내부에서 디버깅할 수 있는가?

(2) bind mount 또는 volume을 사용하여 로컬 코드 변경 사항을 즉시 반영할 수 있는가?

(3) 컨테이너에서 발생한 오류를 로그 분석하여 해결할 수 있는가?

 

4 Docker 기반으로 앱을 배포할 수 있는가?

(1) docker-compose를 활용해서 서버에서도 쉽게 배포할 수 있는가?

(2) CI/CD에서 Docker를 활용할 수 있는가?

(3) docker push를 사용하여 private registry에 이미지를 업로드할 수 있는가?

 

 

Run Airflow in Docker

간만에 도커를 쓴다. 이때 유의해야 할 점이 있다.

우선 windows에선 docker desktop을 실행해야 docker compose 등의 커맨드가 먹힘.

 

그러고 준비된 docker-compose.yaml 파일을 다운받고, 별도의 .env 파일에 아래와 같은 간단한 설정을 해줌.

참고로 내가 다운받은 docker-compose 파일에 airflow에 관한 설정이 이미 모두 되어 있다.

AIRFLOW_IMAGE_NAME=apache/airflow:2.4.2
AIRFLOW_UID=50000

 

그러고 터미널에서 docker 실행시켜주고, docker 잘 되는지 info로 확인해줌.

docker-compose up -d
docker info