2025-06-30
INTRO
최근 회사에서 Azure 기반 MLOps 프로젝트를 진행하며 Azure ML, ACR, Blob Storage에 대한 이해가 필수라는 것을 느꼈다. 이와 함께 Docker를 제대로 활용해야 실제 실무에서 유연하고 안정적인 ML 파이프라인을 구성할 수 있다는 판단이 들었다.
이 글에서는 Azure에서 Docker를 활용한 학습 및 서빙 구조를 실무 중심으로 정리해본다.
Azure에서 Docker가 필요한 이유
Docker는 MLOps의 핵심 기술이다. Azure 환경에서는 다음과 같은 이유로 Docker를 실무에서 필수로 사용하게 된다.
- 모델 학습 환경의 일관성 보장
- 다양한 Azure 리소스 (Azure ML, AKS 등)에서 실행 가능
- 이미지 기반 버전 관리와 배포 추적 가능
- DevOps 파이프라인과의 통합이 용이
Azure 내에서 주요 구성 요소는 다음과 같이 역할을 분담한다.
구성 요소 역할:
| Docker | 코드, 설정, 실행 환경을 이미지화 |
| Azure ML | 모델 학습 및 서빙 플랫폼 |
| Azure Container Registry (ACR) | 이미지 저장소 |
| Azure Blob Storage | 데이터 및 모델 파일 저장소 |
Docker 기본 개념 (Azure 관점)
Docker란?
Docker는 실행 환경(코드 + 설정 + 라이브러리)을 하나의 컨테이너로 패키징하는 도구이다. 이 컨테이너는 사전에 정의된 Docker 이미지로부터 생성되며, 한 번 이미지로 빌드된 환경은 어디서든지 동일하게 실행 가능하다.
Dockerfile → Docker Image → Docker Container 순으로 생성된다.
Azure에서 컨테이너 실행 위치
서비스 목적:
| Azure ML Compute Cluster | 학습 및 추론 |
| Azure Kubernetes Service | 프로덕션 서빙 |
| Azure Container Instances | 단기 서버리스 실행 |
| Azure DevOps Pipelines | 빌드 및 테스트 자동화 |
Docker 구성 요소 요약
구성 요소 설명:
| Dockerfile | 이미지 생성 규칙을 정의한 스크립트 |
| Docker Image | Dockerfile로 빌드한 실행 환경 템플릿 |
| Docker Container | 실제 실행 인스턴스 |
| ACR | Azure 전용 이미지 저장소 |
| Blob Storage | 학습 데이터 및 모델 저장소 |
Docker 이미지 빌드 및 ACR 업로드
Dockerfile 예시 (FastAPI 기반 서빙)
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8080
CMD ["uvicorn", "app:main", "--host", "0.0.0.0", "--port", "8080"]
ACR Push 과정
# ACR 생성
az acr create --resource-group ml-rg --name myacr --sku Basic
# 이미지 빌드 및 태깅
docker build -t mlapp:1.0 .
docker tag mlapp:1.0 myacr.azurecr.io/mlapp:1.0
# ACR 로그인 및 Push
az acr login --name myacr
docker push myacr.azurecr.io/mlapp:1.0
Azure ML에서 Docker 이미지로 모델 배포
from azure.ai.ml import MLClient
from azure.identity import DefaultAzureCredential
from azure.ai.ml.entities import ManagedOnlineEndpoint, ManagedOnlineDeployment
ml_client = MLClient(DefaultAzureCredential(), "sub-id", "rg", "workspace")
endpoint = ManagedOnlineEndpoint(name="ml-endpoint")
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
deployment = ManagedOnlineDeployment(
name="ml-deploy",
endpoint_name="ml-endpoint",
environment_image="myacr.azurecr.io/mlapp:1.0",
instance_type="Standard_DS3_v2",
scale_settings={"type": "default", "instance_count": 1}
)
ml_client.online_deployments.begin_create_or_update(deployment).result()
ACR에 업로드한 이미지를 기반으로 Azure ML에서 서빙이 이루어진다.
Docker 컨테이너에서 Blob Storage 연동
컨테이너 내부에 모델 파일을 포함시키지 않고, 실행 시점에 Blob에서 동적으로 다운로드하여 로딩하는 방식이 일반적이다.
from azure.storage.blob import BlobClient
import os
conn_str = os.environ["AZURE_STORAGE_CONNECTION_STRING"]
blob = BlobClient.from_connection_string(conn_str, container_name="models", blob_name="latest_model.pkl")
with open("model.pkl", "wb") as f:
f.write(blob.download_blob().readall())
적용 시점
- 최신 모델을 서빙 시점에 동적으로 로딩
- 예측 결과 파일을 Blob에 저장
- 배치 예측용 입력 데이터를 Blob에서 읽기
전체 MLOps 파이프라인 예시
1. GitHub Actions or Azure DevOps
└ Docker 이미지 빌드 및 ACR Push
2. Azure ML Job 실행
├ Docker 컨테이너 기반 학습
├ Blob에서 데이터 로드
└ 모델 결과를 다시 Blob에 저장
3. 모델 서빙
└ ACR에서 이미지 pull → 컨테이너 실행
4. 추론
└ 컨테이너에서 Blob 접근 후 추론 처리
실무 체크리스트
- Dockerfile은 가능한 한 경량화 및 캐시 최적화를 고려하여 작성
- ACR에 저장되는 이미지는 태그를 통해 버전 관리 필수
- 컨테이너 내부에서는 Blob Storage를 통해 모델/데이터를 로딩
- 민감 정보는 .env 파일이나 Key Vault에 분리하여 관리
- 인증은 가능한 한 Managed Identity 방식 사용
- 모든 구성은 YAML 또는 SDK 기반으로 코드화 (Infrastructure-as-Code)
참고 명령어 정리
명령어 설명:
| docker build -t app:1.0 . | Docker 이미지 빌드 |
| docker tag app:1.0 myacr.azurecr.io/app:1.0 | ACR용 태깅 |
| docker push myacr.azurecr.io/app:1.0 | 이미지 Push |
| az acr login --name myacr | ACR 로그인 |
| az identity create | 사용자 관리 ID 생성 |
| az ml compute update | Azure ML 클러스터에 MSI 할당 |
마무리
MLOps를 진행하다 보면 Docker는 결국 반드시 만나게 되는 기술이다. Azure ML 환경에서는 거의 모든 학습 및 서빙 과정이 Docker 이미지 기반으로 구성된다.
Azure에서는 이 이미지가 ACR에 저장되고, 모델 파일이나 데이터는 Blob Storage에서 읽어오는 구조가 일반적이다. 중요한 점은, 이러한 구성은 단순한 편의성보다 보안적 이유에서 더 큰 의미를 갖는다.
기업에서는 데이터 접근이 중요한 보안 이슈이기 때문에, 모델 결과를 Blob에 기록하는 방식이 선호된다.
Blob Storage는 권한 기반 접근 제어가 가능하기 때문에, 인증을 통과한 컨테이너만 데이터를 읽고 쓸 수 있다.
실무에서는 간단히 "docker pull 하면 돼요"라고 말하기 어려운 것이 사실이다.
배포 전에는 테스트 시나리오 작성, 코드 리뷰, 보안 검토, 운영 승인 등 여러 절차를 거쳐야 한다.
그렇기에 초기 설계 단계에서 Docker와 Azure 리소스를 올바르게 구성해두면, 이후에는 누구나 재현 가능하고 안전하며 안정적으로 유지되는 MLOps 파이프라인을 구축할 수 있다.
MLOps를 준비하는 입장이라면, 이 흐름을 완전히 체득하는 것이 가장 중요한 것 같다.
'MLOps' 카테고리의 다른 글
| [MLOps] AI Gateway란? 토큰·비용·모델·거버넌스를 통제하는 AI Core 아키텍처 (0) | 2026.09.04 |
|---|---|
| [Azure MLOps] Online & Batch Endpoint (0) | 2025.06.30 |