标题基于django框架的模型能力封装:将模型部署在docker中提供WebAPI的服务
近刚刚入职,公司要我将做好的能力部署在docker中,之前从来没有接触过,在网上也没有教程,在这里我分享并记录一下我的学习成果,希望对有需求的人有所帮助。
展示API的使用方法
首先,我们需要知道这是什么东西,我先演示一下最后的效果。假设现在已经部署好了我们的模型在docker中,我们只需要知道docker所在主机的ip和docker的端口(这个后续步骤就知道怎么知道了,可以自己设置),将两部分组成一个链接,在将输入给到这个链接我们就可以拿到结果了。下面就是使用模型的代码。
import requests
import json
data = json.dumps({
'x':'-1', #模型输入为两个值
'y':'4'
})
res = requests.post( url='http://192.168.65.128:8000/api/',data= data )
print(res.text)
部署的主要过程
我是在windows上开了linux的虚拟机,来练手,和和服务其是一样的,部署主要分为如下几部分:
- 写webAPI的服务
- 安装VMware虚拟机
- 在虚拟机的linux系统中安装docker
- 开一个docker容器
- 将api的项目放到开启的docker容器中
- 使用api
写webAPI的服务
django的项目文件很多,你最好先安装一个pycharm。我们通过pycharm构建一个新的django项目,项目结构如下图,不重要的地方没有展开:
./mysite/mysite/sittings.py:
#以下两个部分需要修改
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'login',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
./mysite/mysite/urls.py:
from django.contrib import admin
from django.urls import path
from login import views
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', views.api),
]
./mysite/login/predict.py:
#我们的模型,我就写了一个很简单的
def model(x,y):
z = x + y
k = x*y + z
return k
./mysite/login/views.py:
from django.http.response import HttpResponse
import json
from . import predict
from django.shortcuts import render
# Create your views here.
def api(request):
dic = {
'resultCode' : '',
'resultDetail' : '',
'resultDesc' : {
'msg': '',
'z' : ''
}
}
if request.method == 'POST':
data = str(request.body)
data = eval(data[2:-1])
try:
x = int(data['x'])
y = int(data['y'])
except:
dic['resultCode'] = '1'
dic['resultDetail'] = 'input data exception'
dic['resultDesc']['msg'] = 'predict failure'
dic = json.dumps(dic)
return HttpResponse(dic)
try:
z = predict.model(x,y)
dic['resultCode'] = '0'
dic['resultDesc']['msg'] = 'successful'
dic['resultDesc']['z'] = z
dic = json.dumps(dic)
return HttpResponse(dic)
except:
dic['resultCode'] = '2'
dic['resultDetail'] = 'Failed to call model'
dic['resultDesc']['msg'] = 'predict failure'
dic = json.dumps(dic)
return HttpResponse(dic)
else:
dic['resultCode'] = '3'
dic['resultDetail'] = 'Failed to call API'
dic['resultDesc']['msg'] = 'predict failure'
dic = json.dumps(dic)
return HttpResponse(dic)
这样我们的api就完成了,你可以运行这个项目,然后post给 http://127.0.0.1:8000/api/ 两个值就可以了,如果有以下结果出现就说明你成功了第一步。
安装VMware
安装只要自己去官网下载就可以了,接下来就需要下载Linux的iso文件,然后解决传送文件的问题。
在ubuntu中安装docker、开启docker容器并将api放入容器中
首先安装docker,教程有很多,这里就不说了。然后你要下载镜像,但是国内下载镜像很慢,所以需要加速镜像,阿里云有教程,很简单。
然后你就需要开一个容器,但是一定要有端口映射,不然外面是用不了你部署的服务的。
docker run -itd -p 8000:80 ubuntu /bin/bash
#80是你开服务时候的端口 , 8000是你外面访问这个api时的端口,别弄反了
# ubuntu就是镜像,也就是给docker装一个ubuntu的系统
开启之后,同时把你写好的项目cp到容器里
sudo docker cp 文件 容器的ID:目的路径
接下来就需要给我们的容器的ubuntu系统安装python和pip,安装python3时会出现问题,这是解决方法。
使用api
在使用时,我们只需要cd到我们的项目的manager.py所在目录中,运行以下命令即可:
nohup python3 manager.py runserver 0.0.0.0:80 &>log.log &
#挂起执行,运行的log写入 log.log文件,最后挂起这个容器即可
最后,通过第一部分API的使用方法即可使用我们的api来拿到结果了。post时,ip就是虚拟机的ip,端口是8000。