시스템 개발 및 관리/MLOps 핵심 기술: 머신러닝 자동화

Docker를 활용한 MLflow 및 Airflow 컨테이너 실행

Data Jun 2025. 3. 4. 11:43

이번 포스트에서는 MLflow와 Airflow를 포함한 Docker 이미지를 빌드하고 컨테이너를 실행하는 과정을 소개합니다. 이를 통해 MLflow를 활용한 모델 버전 관리와 Airflow를 통한 워크플로우 자동화를 보다 효율적으로 운영할 수 있습니다.

 

환경 설정 및 Dockerfile 구성

Dockerfile 작성

MLflow 및 Airflow 환경을 포함한 Dockerfile을 작성하여 컨테이너 환경을 구축합니다.

# Dockerfile
FROM python:3.10-slim

# 환경 변수 설정
ENV AIRFLOW_HOME=/usr/local/airflow 

RUN apt-get update && apt-get install -y \
    gcc libc-dev vim libffi-dev \
    libpq-dev default-libmysqlclient-dev \
    libmariadb-dev pkg-config \
    && rm -rf /var/lib/apt/lists/*

# 최신 pip, setuptools, wheel 설치 (패키지 충돌 방지)
RUN pip install --upgrade pip setuptools wheel

# Airflow 설치
RUN pip install 'apache-airflow==2.8.1' \
 --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.8.1/constraints-3.10.txt" \
 && pip install "mlflow[extras]" \
 && pip install xgboost seaborn \
 && pip install mysqlclient
 
# Airflow 환경 설정
RUN mkdir -p $AIRFLOW_HOME/   
RUN airflow db init

RUN mkdir -p AIRFLOW_HOME/models 

# Airflow DAGs 폴더에 DAG 파일 복사
COPY scripts/ml_workflow_function.py $AIRFLOW_HOME/dags/
COPY src $AIRFLOW_HOME/src/
 
# entrypoint.sh 복사 및 실행 권한 부여
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# Airflow 웹 서버 포트 노출
EXPOSE 5000 8080

# Airflow 웹 서버 및 스케줄러 실행
# CMD airflow webserver -p 8080 & airflow scheduler & mlflow ui
CMD ["/entrypoint.sh"]
  • 기본 이미지: python:3.10-slim
  • 필요 패키지 설치: gcc, libpq-dev, mariadb-client 등 설치
  • MLflow 및 Airflow 설치: mlflow[extras], apache-airflow==2.8.1 등의 패키지를 설치
  • DAG 및 소스 코드 복사: scripts/ml_workflow_function.py 및 src 디렉터리를 컨테이너 내부로 복사
  • 포트 노출: 5000 (MLflow), 8080 (Airflow UI)

 

entrypoint.sh 작성

MLflow 서버, Airflow 웹 서버 및 스케줄러를 실행하는 entrypoint.sh를 구성합니다.

entrypoint.sh는 컨테이너가 시작될 때 실행되는 스크립트로, MLflow 서버와 Airflow 웹 서버 및 스케줄러를 백그라운드에서 실행하는 역할을 합니다.

  1. MLflow 서버 실행: 머신러닝 모델의 실험 및 버전 관리를 위한 MLflow 서버를 5000번 포트에서 실행합니다.
  2. Airflow 웹 서버 실행: Airflow의 UI 대시보드를 8080번 포트에서 실행하여 DAG 관리가 가능하도록 합니다.
  3. Airflow 스케줄러 실행: Airflow의 스케줄러를 실행하여 DAG가 주기적으로 실행될 수 있도록 합니다.
    • MLflow 서버와 Airflow 웹 서버는 백그라운드(& 기호 사용)에서 실행되지만, 스케줄러는 포그라운드에서 실행하여 컨테이너가 종료되지 않도록 유지합니다.

 

Docker 이미지 빌드 및 컨테이너 실행

Dockerfile을 기반으로 MLflow와 Airflow가 포함된 이미지를 빌드합니다. Docker 컨테이너 실행 시 호스트와 컨테이너 간의 네트워크 포트를 연결하는 것이 중요합니다. 이를 위해 docker run 명령어에서 -p 옵션을 사용하여 포트를 매핑합니다.

생성된 이미지를 활용하여 컨테이너를 실행합니다.

포트 매핑 상세 설명

  • -p 8080:8080 → 호스트의 8080 포트를 컨테이너 내부의 8080 포트와 연결하여 Airflow 웹 서버에 접근할 수 있도록 합니다.
  • -p 5000:5000 → MLflow 서버가 실행되는 5000 포트를 호스트의 동일한 포트로 매핑하여 외부에서 접근 가능하도록 합니다.
  • --name airflow-mlflow → 실행되는 컨테이너에 airflow-mlflow라는 이름을 부여하여 관리가 용이하도록 합니다.

127.0.0.1과 0.0.0.0의 차이

빌드할 때 호스트를 127.0.0.1(localhost)로 설정하면,
해당 서비스는 컨테이너 내부에서만 접근할 수 있습니다.

즉, 컨테이너 외부(호스트 PC 또는 다른 컨테이너)에서는 접근할 수 없습니다! ❌

 

127.0.0.1(localhost) 사용 시 문제

  1. 컨테이너 내부에서는 MLflow에 접근 가능 (curl http://127.0.0.1:5000 OK ✅)
  2. 컨테이너 외부(호스트 PC)에서는 접근 불가 (http://localhost:5000 안됨 ❌)

➡ 이유: 127.0.0.1은 컨테이너 내부의 로컬 주소이기 때문.

 

0.0.0.0 사용 시 해결

  1. 컨테이너 내부에서 접근 가능 (curl http://0.0.0.0:5000 OK ✅)
  2. 컨테이너 외부(호스트 PC)에서도 접근 가능 (http://localhost:5000 OK ✅)
  3. 다른 컨테이너에서도 접근 가능 (docker network 내 다른 컨테이너가 접속 가능)

➡ 이유: 0.0.0.0은 모든 네트워크 인터페이스에서 접속 가능하도록 설정.

 

본 포스트에서는 MLflow와 Airflow를 포함한 Docker 컨테이너를 빌드하고 실행하는 과정을 설명하였습니다. 이를 활용하면 머신러닝 모델의 실험 관리 및 워크플로우 자동화를 손쉽게 운영할 수 있습니다. 향후 CI/CD 연동 및 클라우드 배포까지 확장할 수 있도록 개선할 계획입니다.