如何在Azure中部署Streamlit+MLFlow双容器应用?
Azure双容器(MLFlow+Streamlit)部署问题解决方案
问题场景
- 架构目标:部署两个独立容器,MLFlow容器用于存储模型,Streamlit容器调用模型提供预测服务
- 本地Docker Compose运行正常,但Azure部署后无法实现Streamlit与MLFlow的连接
- 已将镜像推送至Azure容器注册表,尝试过Web App多容器部署、独立容器实例两种方式,均未成功
一、Azure Web App多容器部署(推荐方案)
Web App的多容器环境中,同一Compose定义的服务默认处于同一私有网络,可直接通过服务名访问,无需使用公网URL。你的核心问题是错误使用了公网地址作为MLFlow连接目标,以下是正确配置:
修正后的Docker Compose配置
version: '3.8' services: mlflow: image: crispdm.azurecr.io/crispdm-mlflow:v1 ports: - "5000:5000" command: mlflow server --host 0.0.0.0 --port 5000 streamlit: image: crispdm.azurecr.io/crispdm-streamlit:v1 ports: - "8501:8501" depends_on: - mlflow environment: - MLFLOW_SERVER_URL=http://mlflow:5000 # 可选:添加健康检查,确保MLFlow服务就绪后再发起连接 healthcheck: test: ["CMD", "curl", "-f", "http://mlflow:5000/health"] interval: 10s timeout: 5s retries: 5
部署关键注意事项
- Web App容器配置:
- 在Web App「容器设置」中选择「多容器」,上传上述Compose文件
- 确保已配置容器注册表的访问凭证,让Web App有权拉取镜像
- 若需对外暴露MLFlow访问,可在「配置」→「路径映射」中添加路由规则:将
/mlflow/*转发到http://mlflow:5000/*
- 服务就绪依赖:
depends_on仅保证容器启动顺序,不确保服务就绪。建议在Streamlit代码中添加连接重试逻辑,避免MLFlow未完全启动时连接失败。
二、Azure容器实例(ACI)部署方案
若选择两个独立容器实例,需将它们放入同一虚拟网络,通过私有IP或内部DNS访问:
- 创建虚拟网络和子网:在Azure中创建VNet和子网,确保两个容器实例都部署在该子网内
- 部署MLFlow实例:指定虚拟网络和子网,记录MLFlow的私有IP地址,或设置自定义内部DNS名称
- 部署Streamlit实例:同样部署到同一VNet子网,设置环境变量
MLFLOW_SERVER_URL=http://<MLFlow私有IP>:5000
注意事项
- 若需对外访问Streamlit,可为其开启公网IP;MLFlow仅需内部访问,无需公网IP
- 确保虚拟网络安全组允许5000端口的内部通信
排查要点
- 查看容器日志:在Azure门户查看Streamlit容器的日志,确认连接失败的具体错误(如超时、拒绝连接)
- 验证MLFlow服务状态:单独部署MLFlow后,访问
/health端点确认服务正常运行 - 检查环境变量:在Streamlit容器中执行
echo $MLFLOW_SERVER_URL,确认环境变量已正确设置
内容的提问来源于stack exchange,提问作者gurezende
相关产品推荐
相关产品推荐

