MLOps·머신러닝 운영/MLflow를 활용한 머신러닝 실험 관리

Docker Compose로 MLflow + MySQL 환경 구축하기

Data Jun 2025. 10. 22. 22:10

MLflow는 머신러닝 실험(Experiment) 관리 도구로, 모델 학습 실험 기록을 체계적으로 저장하고 추적할 수 있게 해줍니다.
이때 MLflow가 저장하는 메타데이터(모델 이름, 파라미터, 실험 결과 등)를 관리하기 위해 백엔드 저장소(Backend Store)MySQL을 자주 사용합니다.

이 글에서는 Docker Compose를 사용해

  • mlflow 서버
  • mysql 데이터베이스

두 컨테이너를 한 번에 실행하는 환경을 구성합니다.

 

 

docker-compose.yml

services:
  mlflow:
    image: ghcr.io/mlflow/mlflow:v2.20.2
    container_name: mlflow
    ports:
      - "5000:5000"
    volumes:
      - ./mlruns:/mlflow/mlruns
    environment:
      - GIT_PYTHON_REFRESH=quiet
      - MLFLOW_TRACKING_URI=http://0.0.0.0:5000
      - BACKEND_STORE_URI=mysql+pymysql://root:rootpassword@db/mlflow
    command: >
      /bin/sh -c "pip install pymysql cryptography &&
      mlflow server --backend-store-uri mysql+pymysql://root:rootpassword@db/mlflow \
      --default-artifact-root /mlflow/mlruns --host 0.0.0.0 --port 5000"
    depends_on:
      - db

  db:
    image: mysql:8.0
    container_name: mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: mlflow
    ports:
      - "3307:3306"
    volumes:
      - ./db_data:/var/lib/mysql

 

서비스 개요

서비스 역할 주요 포트 데이터 저장 경로
mlflow 실험  추적 및 관리 서버 5000 ./mlruns
db (MySQL) MLflow 메타데이터 저장용 DB 3307 → 3306 ./db_data

 

 

주요 설정

설정 항목 내용 비고
image ghcr.io/mlflow/mlflow:v2.20.2 / mysql:8.0 MLflow와 MySQL 공식 이미지
ports 5000:5000, 3307:3306 로컬 3306 충돌 방지를 위해 MySQL은 3307 사용
volumes ./mlruns, ./db_data 컨테이너 삭제 시에도 데이터 유지
BACKEND_STORE_URI mysql+pymysql://root:rootpassword@db/mlflow MLflow가 MySQL DB와 연결되는 URI
depends_on db MLflow 실행 전에 DB가 먼저 구동되도록 설정

 

 

실행 명령어 해석

명령어 설명
/bin/sh -c 컨테이너 시작 시 쉘 명령어 실행
pip install pymysql cryptography MySQL 연동과 보안 패키지 설치
mlflow server --backend-store-uri ... MLflow 서버 구동 명령
--default-artifact-root /mlflow/mlruns 실험 결과 저장 경로
--host 0.0.0.0 --port 5000 외부 접근 허용 및 포트 설정

 

 

정리하면

 

  • 이번 구성은 MLflow 서버와 MySQL 데이터베이스를 Docker Compose로 함께 실행하는 방법을 다루었습니다.
    MLflow는 머신러닝 실험을 관리하고 추적하는 서버로, 실험 결과를 로컬 디렉터리(./mlruns)에 저장하며,
    실험 메타데이터(파라미터, 성능 지표 등)는 MySQL 데이터베이스(./db_data)에 보관합니다.
  • 로컬 환경에서 이미 MySQL이 3306 포트를 사용 중일 수 있기 때문에,
    이 설정에서는 호스트 포트 3307을 MySQL 컨테이너 내부의 3306 포트로 매핑하여 충돌을 피했습니다.
    MLflow는 5000번 포트로 열리며, 브라우저에서 http://localhost:5000 으로 접근할 수 있습니다.
  • 백엔드 저장소 URI는 mysql+pymysql://root:rootpassword@db/mlflow 형식으로 지정되어,
    MLflow가 내부 네트워크에서 db(MySQL 컨테이너 이름)로 접근하도록 설정되어 있습니다.
    컨테이너 간 통신은 Docker Compose 네트워크를 통해 자동으로 이루어지므로 별도의 네트워크 설정은 필요하지 않습니다.
  • 마지막으로, docker compose up -d 명령으로 컨테이너를 실행하고,
    docker compose down 으로 중지할 수 있으며,
    데이터까지 완전히 초기화하려면 docker compose down -v 명령을 사용합니다.
  • 이 구성을 통해 MLflow 실험 관리 환경을 손쉽게 컨테이너 기반으로 재현할 수 있으며,
    로컬 환경에서도 안정적으로 실험 로그를 저장하고 관리할 수 있습니다.