当EAS提供的官方镜像无法满足特定业务或环境需求时,可通过自定义镜像来封装完整的运行环境,实现灵活、可靠的模型服务部署。
镜像仓库规划
EAS部署服务时需要从镜像仓库拉取镜像,推荐使用阿里云容器镜像服务ACR存储镜像。拉取镜像时使用VPC地址,以获得更好的性能和安全性。
公网拉取镜像存在安全风险,且速度会特别慢,不建议使用。
ACR个人版
免费提供,但只能在一个地域内开通使用,跨地域拉取镜像只能通过公网地址。
建议仅在测试场景使用ACR个人版,并确保与EAS服务同地域。
ACR企业版
提供更强的安全、性能和全球同步能力,可实现EAS服务在同一地域或跨地域通过内网安全、高速地拉取镜像。
推荐在生产环境中使用。
自建镜像仓库
如果在阿里云VPC中使用Harbor等自建镜像仓库,地址仅支持在VPC中访问,与ACR企业版类似,需要为EAS服务配置VPC,让镜像仓库与EAS服务处于同一VPC中。
镜像仓库身份认证
使用需要认证的私有镜像仓库,需在服务部署时提供用户名密码信息。
在JSON配置文件中通过dockerAuth参数指定认证信息,值为username:password的Base64编码形式。
例如,对于abcd:abcde12345,执行命令echo -n "abcd:abcde12345" | base64得到YWJjZDphYmNkZTEy****,即为dockerAuth的取值。
{"dockerAuth": "YWJjZDphYmNkZTEy****"}使用同一阿里云账号下同地域的ACR镜像仓库时,EAS可免密拉取镜像,无需填写用户名密码。
快速开始:制作并部署自定义镜像
本节将在阿里云ECS实例上构建一个基于Gunicorn和Flask的生产级Web服务镜像,将其推送至ACR镜像仓库,并最终部署为EAS在线服务。
步骤一:环境准备
在开始之前,请确保您已准备好以下环境和资源:
专有网络 (VPC):EAS服务、ECS实例与ACR镜像仓库之间需要通过VPC进行网络通信,以确保镜像推送拉取的稳定性和安全性。
容器镜像仓库 (ACR):用于存储和管理您的自定义镜像。参见使用企业版实例推送和拉取镜像准备一个ACR企业版实例,并创建好所需的命名空间和镜像仓库。
开发环境:创建一个配置如下的ECS实例来制作镜像。
实例规格:ecs.u1-c1m2.large
镜像:Alibaba Cloud Linux 3.2104 LTS 64位
扩展程序:Docker社区版
网络:选择的VPC需在ACR企业版实例的“访问控制”中添加,否则将无法推送镜像到ACR镜像仓库。详情请参见为ACR配置专有网络的访问控制。
步骤二:准备应用文件
创建一个项目文件夹(例如 my-app),并包含以下三个文件:
requirements.txt(应用依赖)flask gunicornapp.py(Web应用代码)from flask import Flask app = Flask(__name__) @app.route('/hello/model') def hello_world(): # 此处可以集成您的模型推理或其他业务逻辑 return 'Hello World from Gunicorn!' # 注意:无需 app.run(),应用将由 Gunicorn 启动
Dockerfile(镜像构建指令)# 1. 使用轻量级的官方Python镜像作为基础 FROM python:3.9-slim # 2. 设置工作目录 WORKDIR /app # 3. 复制依赖文件并安装,利用Docker缓存机制加速后续构建 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ # 4. 复制应用代码 COPY app.py . # 5. 声明服务端口 EXPOSE 8000 # 6. 定义容器默认启动命令(可被EAS控制台的“运行命令”覆盖) CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8000", "app:app"]
步骤三:构建并推送镜像
打开终端,进入项目文件夹(
my-app)。登录到您的ACR实例。请将命令中的占位符替换为您的实际信息。
# 示例: docker login --username=your_user my-registry.cn-hangzhou.aliyuncs.com docker login --username=<用户名> <ACR仓库域名>构建Docker镜像并为其打上完整的标签。
# 示例: docker build -t my-registry.cn-hangzhou.aliyuncs.com/my-namespace/flask-app:v1 . docker build -t <ACR仓库域名>/<命名空间>/<镜像仓库名>:<版本号> .将构建好的镜像推送到ACR。
# 示例: docker push registry.cn-hangzhou.aliyuncs.com/my-namespace/flask-app:v1 docker push <ACR仓库域名>/<命名空间>/<镜像仓库名>:<版本号>
步骤四:部署服务
登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入EAS。
单击部署服务,选择。
配置以下关键参数:
部署方式:选择镜像部署。
镜像配置:选择镜像地址,填写上一步中推送的完整镜像地址。
由于本示例使用同一阿里云账号下的ACR,EAS可免密拉取镜像,无需提供用户名和密码。
运行命令:
gunicorn -w 4 -b 0.0.0.0:8000 app:app逻辑说明:EAS控制台填写的
运行命令会覆盖 Dockerfile中的CMD指令。建议将启动命令填写在此处,便于后续调试和修改。端口号:8000。
部署资源:本示例使用CPU资源即可。如选择公共资源下的
ecs.c6.large。专有网络配置:选择一个VPC、交换机和安全组。
请确保此处选择的VPC已在ACR实例的“访问控制”中添加,否则将因网络不通导致镜像拉取失败(常见错误为
ImagePullBackOff)。
单击部署,当服务状态变为运行中,表示部署成功。
步骤五:服务测试
服务部署成功后,获取访问地址和Token,使用以下命令测试Flask服务:
# <endpoint>和<token>替换为服务的实际调用地址和Token
curl <endpoint>/hello/model -H "Authorization: <token>"如果返回 Hello World from Gunicorn!,则表示服务已成功部署并可正常访问。
关于服务调用的更多信息,请参见服务调用方式。
核心概念与限制
网络限制:EAS 服务通过VPC地址访问内网资源,通常需要为其配置VPC。如果需要访问公网资源(例如,使用
pip从公共源安装依赖、调用外部 API 或通过公网拉取镜像),还需为VPC配置NAT网关。详情请参见EAS访问公网或内网资源。成本提示:NAT网关是付费服务,会产生额外费用。
端口限制:EAS服务引擎会占用
8080和9090端口。您的应用程序监听的端口必须避开这两个端口,否则服务将因端口冲突而启动失败。Sidecar注入:为实现认证、鉴权和监控,EAS会以Sidecar模式在您的服务实例中注入一个代理容器。这个代理是透明的,但会占用少量资源,并负责将外部请求安全地转发到您配置的服务端口。
API协议支持:镜像部署支持在镜像中以HTTP、WebSocket、gRPC(HTTP2)三种协议提供API服务。
生产应用建议
镜像与模型分离:始终将代码和模型文件分离。代码打包进镜像,模型存放在对象存储 OSS或文件存储NAS上,在EAS部署页面,通过存储挂载功能将模型挂载到容器内使用。这能极大缩短服务更新和扩容时的镜像拉取时间。
使用内网拉取镜像:为了安全和性能,务必为服务配置专有网络,使其能通过 VPC 地址从 ACR 拉取镜像。
注册镜像为AI资产:如果您的自定义的镜像可在其他多种场景下应用,可使用PAI AI资产的镜像功能,将其沉淀为对应的AI资产进行统一管理。
配置健康检查:为您的服务配置健康检查,EAS 会据此自动重启不健康的实例,保障服务稳定性。详情请参见健康检查。
启用自动扩缩容:当业务负载有明显波动时,开启水平自动扩缩容功能,以弹性、经济的方式应对流量变化。
常见问题
Q:镜像拉取失败(ImagePullBackOff)
原因1:网络不通。最常见的原因。请检查EAS服务配置的VPC是否已添加到ACR实例的访问控制白名单中。如跨地域,需通过CEN打通VPC,参见跨地域或从IDC访问ACR企业版实例。如通过公网地址拉取镜像,请确认已为EAS配置能访问公网的VPC专有网络,且为ACR开通公网访问。
原因2:认证失败。如果使用需要认证的私有镜像仓库(非本账号下ACR),请检查在镜像配置中填写的认证信息是否正确。
原因3:镜像不存在。请检查镜像地址、命名空间和版本号(Tag)是否完全正确,且镜像已成功推送到仓库。
原因4:系统盘空间不足。请扩容系统盘。
更多问题,请参见EAS常见问题。