1. DockerOperator를 사용하는 이유

- 상황에 따라 버전이 다른 라이브러리를 사용하는 경우가 많고, airflow에서 기본적으로 지원하지 않는 라이브러리를 사용하는 경우도 있다.

- 이럴때 운영 줄인 airflow 서버에 라이브러리를 설치해야하는데, 하나의 서버에서 다양한 라이브러리와 버전을 모두 제공할 수 없다.

- 그리고 특정 라이브러리를 설치하는 경우에 심각한 경우 Airflow가 작동하지 않는 경우도 있다.

- 따라서 Airflow와 머신 환경에 종속되지 않고 컨테이너 환경에서 dag를 실행하도록 하면 많은 문제가 해결된다.

 

2. 실습 환경

- airflow 3.1.0 버전에서 실행하였다.

- airflow 2.x.x 버전과 DockerOperator에서 auto_remove를 설정하는 것이 차이가 있다.

- 2버전에서는 true와 false로 자동 삭제를 설정한다.

- 3버전에서는 success, never, force로 설정한다.

- 아래의 링크에서 내용을 확인할 수 있다.

https://airflow.apache.org/docs/apache-airflow-providers-docker/stable/_api/airflow/providers/docker/operators/docker/index.html

 

airflow.providers.docker.operators.docker — apache-airflow-providers-docker Documentation

 

airflow.apache.org

 

3. DockerOperator 실행 실습

- 아래의 dag를 사용하여 실습을 진행한다.

from datetime import timedelta

from airflow import DAG
from airflow.providers.docker.operators.docker import DockerOperator
from airflow.operators.bash import BashOperator

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': '2025-09-20',
    'retries': 1,
    'retry_delay': 30,
}

dag = DAG(
    'docker_test',
    default_args=default_args,
    description='echo "hello, world!"',
    schedule=timedelta(days=1),
)

t1 = BashOperator(
    task_id='echo_host',
    bash_command='whoami',
    dag=dag
)

t2 = DockerOperator(
    task_id='echo_container',
    image='ubuntu:22.04',
    container_name='test_echo_container',
    auto_remove='success',
    command="whoami",
    hostname='docker_test',
    dag=dag
)
t1 >> t2

 

- 아마도 높은 확률로 BashOperator는 작동했지만 DockerOperator에서 문제가 발생할 것이다.

 

- 아래와 같은 에러메세지가 있을텐데 쉽게 말하자면 컨테이너를 생성할 docker와 통신하지 못해서 발생하는 문제이다.

ERROR - Failed to establish connection to Docker host unix://var/run/docker.sock: Error while fetching server API version: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory'))

 

- docker compose로 구축한 airflow의 컨테이너와 docker가 통신할 수 있도록 실습하는 pc에 설치되어있는 docker와 연결할 수 있도록 docker compose yaml에서 아래와 같은 설정을 하자.

x-airflow-common:
  &airflow-common
  ......
  environment:
    ......
  volumes:
    ......
    # 이 경로를 설정하자
    - /var/run/docker.sock:/var/run/docker.sock

 

- airflow를 아래의 명령어로 환경 변수 변경 값을 적용해 다시 실행하자

docker compose down && docker compose up -d

 

- 이제는 DockerOperator의 작업도 정상적으로 실행된 것을 알 수 있다.

- 만약 컨테이너가 제대로 실행됐는지 궁금하다면 dag에서 auro_remove='never'로 바꾸고 실행해서 확인할 수 있다.

- 변경 후 dag를 실행하면 실습하는 pc의 docker에 아래와 같은 종료된 컨테이너가 있는 것을 확인할 수 있다.

CONTAINER ID   IMAGE                  COMMAND                   CREATED          STATUS                      PORTS                                         NAMES
9f573e521d55   ubuntu:22.04           "whoami"                  39 seconds ago   Exited (0) 38 seconds ago

 

1. 문제 상황

- airflow 공식 홈페이지에서 제공하는 docker compose 환경이 3.1.0 버전으로 변경되었다.

- 설치 후 예제 dag 중에 pythonOperator 같은 당연히 실행되어야 하는 dag가 실행되지 않았다.

- airflow에서 확인한 에러로그는 다음과 같았다.

Executor CeleryExecutor(parallelism=32) reported that the task instance 
<TaskInstance: docker_test.echo_host scheduled__2025-09-28T13:10:24.732903+00:00 [queued]> 
finished with state failed, but the task instance's state attribute is queued. 
Learn more: https://airflow.apache.org/docs/apache-airflow/stable/troubleshooting.html#task-state-changed-externally

- 공식 홈페이지에서 딱히 도움이 될만한 내용은 없었다.

 

2. 문제 해결 방법

- aiflow에서 fernet key가 불일치하면 발생하는 문제로 확인되었다.

- fernet key가 일치해야 워커에서 실행할 태스크가 올바른 것이라고 스케쥴러가 관리를 할 수 있는데, 이게 불일치하는 문제가 생기는 것이다.

- 이전에 사용하던 2.x.x 버전의 에어플로우에서는 명시적으로 설정하지 않던 값을 설정해서 문제를 해결할 수 있다.

- docker compose 파일이 있는 경로에 .env를 생성하고 UID와 fernet key 값을 고정 값으로 넣어준다,

- 여기서 fernet key는 파이썬 라이브러리로 간단하게 만들 수 있고, 예제 코드는 아래와 같다.

from cryptography.fernet import Fernet
print(Fernet.generate_key().decode())

 

- .env 파일은 아래와 같이 만들자

FERNET_KEY=생성한 fernet key
AIRFLOW_UID=50000

 

- 만약에 이미 airflow를 한번 docker compose up으로 올렸었다면 다음과 같은 명령어로 볼륨과 생성됐던 컨테이너를 깨끗하게 삭제하고 다시 실행하자

docker-compose down --volumes --remove-orphans

 

- 다시 airflow를 실행하면 문제없이 dag가 실행되는 것을 알 수 있다.

 

3. 다음 게시물 내용

- DockerOperator로 dag를 실행하는 예제를 실습한다.

'데이터 시스템 구축 정보 공유 > airflow' 카테고리의 다른 글

4. DockerOperator로 dag 실행하기  (0) 2025.09.29
2. docker를 사용한 airflow 설치  (0) 2024.01.11
1. Airflow란?  (0) 2022.07.31

1. 실습내용

- 구성한 node에 k3s를 설치한다.

 

2. k3s 마스터노드 설치

- 마스터 노드를 먼저 세팅하자.

- k3s의 퀵스타트 가이드의 주소는 아래와 같다.

https://docs.k3s.io/quick-start

 

- 마스터 노드의 설치 커맨드를 우분투 가상머신에 입력해서 설치하자.

curl -sfL https://get.k3s.io | sh -

 

- 설치가 완료되면 kubectl로 노드가 정상적으로 잡혀있는지 확인하자

sudo kubectl get nodes

 

3. k3s 워커노드 설치

- 아래의 명령어로 K3S_TOKEN 값을 알아낼 수 있다.

sudo cat /var/lib/rancher/k3s/server/node-token

 

- K3S_URL은 가상 머신의 ip주소를 사용하면 된다.

- 아래 명령어에서 K3S_URL과 K3S_TOKEN 값을 넣고 k3s-worker1과 k3s-worker2에 아래 명령어로 설치한다.

# myserver : master의 ip
# mynodetoken : master의 토큰 값

curl -sfL https://get.k3s.io | K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -

 

- 설치가 모두 완료되면 master에서 아래의 명령어로 워커노드가 연결된 것을 확인할 수 있다.

sudo kubectl get nodes


# 출력 결과 예시
NAME          STATUS   ROLES                  AGE     VERSION
k3s-master    Ready    control-plane,master   3m42s   v1.33.4+k3s1
k3s-worker1   Ready    <none>                 81s     v1.33.4+k3s1
k3s-worker2   Ready    <none>                 55s     v1.33.4+k3s1

 

 

4. 다음 게시물 내용

- 구축한 쿠버네티스 환경에서 배포를 직접 해보자.

+ Recent posts