容器化部署算法服务技术文档
容器化部署算法服务技术文档
1. 引言
本文档旨在指导如何使用 Docker 将一个基于 Python Flask 的算法服务容器化,并通过 Docker 容器部署在 Ubuntu 服务器上。通过容器映射端口,确保服务能够在局域网内通过 curl
或浏览器访问。
2. 技术栈
- Flask:Python 微框架,用于实现简单的 RESTful API 服务。
- Docker:容器化工具,确保算法服务在隔离的环境中运行,易于部署和管理。
- Ubuntu:操作系统,容器运行环境。
3. 服务功能
本服务实现了一个计算平方的 API,接收一个数字并返回其平方值。接口采用 POST
请求方式,数据格式为 JSON。
示例请求:
{
"number": 4
}
示例响应:
{
"result": 16
}
4. 步骤
4.1 准备flask应用
首先,编写一个简单的 Flask 应用,用于实现计算平方的功能。假设该服务会监听 8080 端口。
# app.py 文件内容:
from flask import Flask, request, jsonify
app = Flask(__name__)
# 计算平方的 API,使用 GET 方法
@app.route('/square', methods=['GET'])
def square():
# 从 URL 参数中获取 number 值
number = request.args.get('number')
# 如果 number 不存在,返回错误信息
if number is None:
return jsonify({"error": "No number provided"}), 400
try:
# 将 number 转换为整数
number = float(number)
except ValueError:
return jsonify({"error": "Invalid number provided"}), 400
# 计算平方并返回结果
result = number ** 2
return jsonify({"result": result})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
4.2 创建 Dockerfile
为了将该 Flask 应用容器化,需要编写一个 Dockerfile,定义容器的构建过程。
# 使用官方的 Python 3 镜像作为基础镜像
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 复制当前目录内容到容器内的 /app 目录
COPY . /app
# 安装 Flask 依赖
RUN pip install --no-cache-dir flask
# 暴露 8080 端口
EXPOSE 8080
# 运行 Flask 应用
CMD ["python", "app.py"]
4.3 构建 Docker 镜像
在包含 Dockerfile 和 app.py 文件的目录下执行以下命令来构建 Docker 镜像:
docker build -t my_flask_app .
该命令会创建一个名为 my_flask_app 的 Docker 镜像。
4.4 启动容器并映射端口
使用 Docker 启动容器并将宿主机端口映射到容器内的端口。假设宿主机上 8080 端口没有被占用,可以使用以下命令:
docker run -d -p 8080:8080 my_flask_app
此命令会:
- 将容器的 8080 端口映射到宿主机的 8080 端口。
- -d 参数表示以后台模式运行容器。
4.5 检查映射的端口
使用以下命令查看宿主机上当前的端口使用情况,确保 8080 端口没有被占用:
sudo netstat -tuln
如果 8080 端口未被占用,你可以继续进行映射;如果已占用,可以选择其他未被占用的端口进行映射。例如:
docker run -d -p 5000:8080 my_flask_app
在上述命令中,容器的 8080 端口被映射到宿主机的 5000 端口。
4.6 测试服务
服务启动后,你可以使用 curl 命令或浏览器来测试 API 服务是否正常工作。
使用url测试
curl "http://localhost:8080/square?number=4"
如果一切正常,则返回
{
"result": 16
}
4.7 配置防火墙
如果你希望其他机器可以通过网络访问该服务,需要确保宿主机的端口开放。
首先检查防火墙状态:
sudo ufw status
如果防火墙已启用,可以使用以下命令开放 8080(或其他映射的端口):
sudo ufw allow 8080
关闭指定端口: 假设你想关闭端口 8080,可以使用以下命令
sudo ufw deny 8080
5. 总结
通过以上步骤,我们成功地将一个基于 Flask 的简单算法服务容器化,并使用 Docker 部署在 Ubuntu 系统上。通过端口映射,宿主机可以通过特定端口访问容器内的服务。同时,防火墙配置确保该服务在局域网内可访问。
可选扩展:
- 可以将该服务进一步部署到 Kubernetes 集群中,确保高可用性和扩展性。
- 可以为服务添加日志记录、错误处理、输入校验等功能。