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

 

+ Recent posts