DockerOperator란?
- Apache Airflow에서 Docker 컨테이너를 실행 및 관리할 수 있는 강력한 도구입니다.
- 데이터 파이프라인, CI/CD 워크플로우, 머신러닝 모델 배포 자동화 등 다양한 작업에 사용됩니다.
왜 원격 Docker Daemon이 필요한가?
- 분산 작업: Docker Daemon이 실행되는 별도의 서버에서 리소스를 활용하여 작업을 분산할 수 있습니다.
- 클러스터 활용: 여러 Docker Daemon과 연결하여 확장 가능한 파이프라인을 구축할 수 있습니다.
환경 준비 및 사전 설정
Airflow 설치:
pip install apache-airflow
pip install apache-airflow-providers-docker
Docker 설치:
[Docker] Ubuntu 22.04 환경에서 도커 설치하기
실행환경Ubuntu 22.041. apt repository set up# Add Docker's official GPG key:sudo apt-get updatesudo apt-get install ca-certificates curlsudo install -m 0755 -d /etc/apt/keyringssudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/ke
only-advance.tistory.com
네트워크 연결 준비:
- Docker Daemon이 실행 중인 서버와 Airflow가 실행 중인 서버가 서로 통신 가능해야 합니다.
Docker Daemon에서 TCP 연결 활성화하기
원격 연결을 허용하려면 Docker Daemon의 TCP 포트를 열어야 합니다.
1) Docker Daemon 설정 변경
- Docker Daemon 설정 파일(/etc/docker/daemon.json)에 다음 내용을 추가합니다:
{
"hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
}
- tcp://0.0.0.0:2375: 모든 네트워크 인터페이스에서 Docker Daemon의 TCP 연결을 허용합니다.
- unix:///var/run/docker.sock: 기존 로컬 소켓 연결도 유지합니다.
2) Docker 재시작
- 변경 사항 적용:
sudo systemctl restart docker
3) 방화벽 설정
- Docker Daemon의 기본 TCP 포트(2375)를 열어야 합니다.
sudo ufw allow 2375/tcp
4) 보안 강화
- TCP 연결은 기본적으로 암호화되지 않으므로 TLS 인증을 설정하는 것이 권장됩니다. (이 글에서는 기본 TCP 연결만 다룹니다.)
Airflow DockerOperator로 TCP 연결 설정하기
Airflow의 DockerOperator를 사용하여 원격 Docker Daemon과 연결합니다.
1) Airflow DAG 코드 작성
- dags/docker_operator_tcp_example.py 파일을 생성하고 다음 코드를 작성합니다:
from airflow import DAG
from airflow.providers.docker.operators.docker import DockerOperator
from datetime import datetime, timedelta
default_args = {
'owner': 'airflow',
'retries': 1,
'retry_delay': timedelta(minutes=5),
}
with DAG(
dag_id='docker_operator_tcp_example',
default_args=default_args,
description='Example DAG for DockerOperator with TCP connection',
schedule_interval=None,
start_date=datetime(2024, 1, 1),
catchup=False,
) as dag:
run_remote_docker = DockerOperator(
task_id='run_remote_container',
image='python:3.8-slim',
command='echo "Hello from remote Docker!"',
docker_url='tcp://192.168.1.100:2375', # 원격 Docker Daemon URL
network_mode='bridge',
)
run_remote_docker
2) DAG 실행
- 작성한 DAG 파일을 Airflow의 dags 디렉토리에 저장합니다.
- Airflow UI에서 해당 DAG를 활성화하고 실행합니다.
실습 결과 및 주요 주의사항
1) 실습 결과
- Airflow UI에서 DAG를 실행하면, DockerOperator가 원격 Docker Daemon에 연결하고 컨테이너를 실행합니다.
- echo "Hello from remote Docker!" 명령의 결과가 로그에 출력됩니다.
2) 주요 주의사항
- 보안 위험:
- TCP 포트 2375는 기본적으로 암호화되지 않으므로 네트워크 노출에 주의해야 합니다.
- TLS를 설정하여 암호화된 통신을 사용하거나, 방화벽 설정을 통해 특정 IP만 허용하세요.
- Docker 권한 문제:
- Airflow 사용자가 Docker Daemon에 접근할 권한이 있어야 합니다.
- 필요 시 Airflow 사용자 또는 프로세스를 docker 그룹에 추가하세요:
sudo usermod -aG docker airflow
3. 포트 변경 가능성:
- 기본 포트(2375)가 아닌 다른 포트를 사용하려면 Docker Daemon 설정에서 해당 포트를 지정하고 방화벽 규칙을 업데이트하세요.
결론
Airflow의 DockerOperator를 사용하여 원격 Docker Daemon을 제어를 활용하면 다음과 같은 작업을 효율적으로 수행할 수 있습니다:
- 데이터 파이프라인 자동화: Docker 컨테이너를 통해 ETL 작업을 실행.
- CI/CD 구축: 컨테이너 기반 애플리케이션 배포 자동화.
- 분산 작업 실행: 리소스 분산을 통해 작업 속도 향상.
Reference
airflow.providers.docker.operators.docker — apache-airflow-providers-docker Documentation
airflow.apache.org