이번 포스트에서는 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 웹 서버 및 스케줄러를 백그라운드에서 실행하는 역할을 합니다.
- MLflow 서버 실행: 머신러닝 모델의 실험 및 버전 관리를 위한 MLflow 서버를 5000번 포트에서 실행합니다.
- Airflow 웹 서버 실행: Airflow의 UI 대시보드를 8080번 포트에서 실행하여 DAG 관리가 가능하도록 합니다.
- 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) 사용 시 문제
- 컨테이너 내부에서는 MLflow에 접근 가능 (curl http://127.0.0.1:5000 OK ✅)
- 컨테이너 외부(호스트 PC)에서는 접근 불가 (http://localhost:5000 안됨 ❌)
➡ 이유: 127.0.0.1은 컨테이너 내부의 로컬 주소이기 때문.
0.0.0.0 사용 시 해결
- 컨테이너 내부에서 접근 가능 (curl http://0.0.0.0:5000 OK ✅)
- 컨테이너 외부(호스트 PC)에서도 접근 가능 (http://localhost:5000 OK ✅)
- 다른 컨테이너에서도 접근 가능 (docker network 내 다른 컨테이너가 접속 가능)
➡ 이유: 0.0.0.0은 모든 네트워크 인터페이스에서 접속 가능하도록 설정.
본 포스트에서는 MLflow와 Airflow를 포함한 Docker 컨테이너를 빌드하고 실행하는 과정을 설명하였습니다. 이를 활용하면 머신러닝 모델의 실험 관리 및 워크플로우 자동화를 손쉽게 운영할 수 있습니다. 향후 CI/CD 연동 및 클라우드 배포까지 확장할 수 있도록 개선할 계획입니다.
'시스템 개발 및 관리 > MLOps 핵심 기술: 머신러닝 자동화' 카테고리의 다른 글
데이터 파이프라인 자동화 (0) | 2025.03.05 |
---|---|
자동화된 데이터 필터링과 스케줄링 구축 (0) | 2025.03.05 |
Airflow를 활용한 자동화 실행 및 MLflow 기반 모델 관리 (0) | 2025.03.04 |
MLflow와 Airflow를 활용한 모델 관리 및 자동화 파이프라인 구축 (1) | 2025.03.04 |
데이터 자동 적재 및 학습 파이프라인 구축 (0) | 2025.03.04 |