Bootstrap

Flask服务封装+Docker服务部署

Flask总结

Faslk是一个Web框架, 可以用于提供服务

流程

  1. 导入Flask

  2. 实例化Flask对象

  3. 创建路由并返回内容, 页面或具体数据

  4. 在main函数中调用Flask对象.run方法, 可以指定端口号和监听地址等

示例代码

from flask import Flask, request, json, Response
from dm02_model_train_pred import my_model_predict
​
app = Flask(__name__)
app.json.ensure_ascii = False
​
​
@app.route('/email_handle', methods=['POST'])
def email_handler():
    # 获取请求数据
    request_json = request.get_json()   # 接受json数据
    print(request_json)
    data = request_json['content']  # 获取指定内容的数据
    print(data)
    data = my_model_predict(data)
​
    # 定义相应格式
    response_data = {
        'Status': 'success',
        'content': data
    }
    return Response(status=200, response=json.dumps(response_data, sort_keys=False))    # 返回json数据
​
​
if __name__ == '__main__':
    app.run(port=5000)

Docker总结

服务器安装Docker

★安装docker

# 安装依赖工具 
# yum-utils提供yum-config-manager
# device mapper存储驱动程序需要device-mapper-persistent-data和lvm2。
yum install -y yum-utils device-mapper-persistent-data lvm2
​
# 配置镜像源, 我们使用的是阿里云的源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
​
# 安装 Docker
yum install docker-ce docker-ce-cli containerd.io
​
# 卸载Docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd

检验安装结果

docker version

启动docker服务

systemctl status docker     # 查看docker服务
systemctl start docker      # 启动docker服务
systemctl restart docker    # 重启docker服务
systemctl enable

镜像操作

Docker镜像(images)是可以被认为是构建容器的模板(系统镜像ISO文件), 一个镜像可以创建多个容器, 后续部署项目时需要有基础镜像. 用Docker基础镜像构建项目镜像后, 该镜像包含了运行容器所需的所有内容,包括代码、运行时、库、环境变量和配置文件等。

查看镜像

docker images             # 查看所有镜像
docker images -q          # 只查看镜像的ID
docker images --no-trunc  # 显示镜像完整信息

搜索镜像

docker search python
docker search python --no-trunc

★下载镜像

镜像下载命令

docker pull 镜像名:版本      # 不指定版本(TAG), 默认使用latest
docker pull python:3.10

直接拉取镜像可能报错链接超时

Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

需要配置或创建 /etc/docker/daemon.json, 在文件内加入会修改如下内容

{
"registry-mirrors": ["https://docker.registry.cyou",
	"https://docker-cf.registry.cyou",
	"https://dockercf.jsdelivr.fyi",
	"https://docker.jsdelivr.fyi",
	"https://dockertest.jsdelivr.fyi",
	"https://mirror.aliyuncs.com",
	"https://dockerproxy.com",
	"https://mirror.baidubce.com",
	"https://docker.m.daocloud.io",
	"https://docker.nju.edu.cn",
	"https://docker.mirrors.sjtug.sjtu.edu.cn",
	"https://docker.mirrors.ustc.edu.cn",
	"https://mirror.iscas.ac.cn",
	"https://docker.rainbond.cc"]
}

配置后执行下面两条命令进行重新加载

systemctl daemon-reload
systemctl restart docker

再次执行拉取镜像命令即可

docker pull python:3.10

"""
(base) root@node1:/etc/docker# docker pull python:3.10
3.10: Pulling from library/python
b2b31b28ee3c: Pull complete 
c3cc7b6f0473: Pull complete 
2112e5e7c3ff: Pull complete 
af247aac0764: Downloading  149.5MB/211.3MB
920ce5d9169b: Waiting 
b54a94f4cba6: Waiting 
e06c8c5ca725: Waiting 
"""

等待拉取结束即可

运行/创建镜像

docker run -it 镜像名:版本 程序(一般是/bin/bash)  # 交互式运行容器, 会进入容器内部
docker run -it --name=容器名 镜像名:版本 程序     # 指定容器的名字
docker run -itd 镜像名:版本 程序                 # 后台运行容器, 不会进入容器

删除容器

docker rmi -f 镜像名
docker rmi -f 镜像ID
docker rmi -f $(docker images -qa)      # 删除所有镜像

★保存镜像

docker save 镜像名:版本 -o xxx.tar
​
"""
[root@bogon ~]# docker save alpine:latest -o myalpine.tar
[root@bogon ~]# ls
anaconda-ks.cfg  myalpine.tar
"""

加载镜像

docker load -i xxx.tar
"""
[root@bogon ~]# docker load -i myalpine.tar
24302eb7d908: Loading layer [==================================================>]  5.811MB/5.811MB
​
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
alpine       latest    e66264b98777   3 weeks ago    5.53MB
centos       latest    5d0da3dc9764   9 months ago   231MB
"""

容器操作

容器是docker镜像运行的实体(相当于将系统安装电脑上)

# 1. 查看容器
docker ps       # 查看正在运行的容器实例
docker ps -a    # 查看正在运行或者已停止的容器实例
​
# 2. 运行容器
docker start 容器ID     # 启动容器
docker restart 容器ID   # 重启容器
​
# 3. 停止容器
docker stop 容器ID
​
# 4. 删除容器
docker rm -f 容器ID              # 删除指定容器
docker rm -f $(docker ps -qa)   # 删除所有容器
​
# 5. 进入容器
# attach 退出终端会导致容器停止
# exec 不会导致容器停止
docker attach 容器ID
docker exec -it 容器ID /bin/bash
​
# 6. 容器导出
docker export 容器ID > xxx.tar
​
# 7. 容器导入
docker import xxx.tar xxx:tag

具体项目部署

源文件上传

将本地要上传的文件夹上层目录, 在cmd窗口执行如下命令

scp -r 本地文件路径 root@服务器IP:服务器文件路径

编写Dockerfile

文件名称只能是Dockerfile, 放到和项目文件夹路径的同级目录内

项目路径: /temp/app

Dockerfile路径: /temp

# 继承的基础镜像
FROM python:latest
MAINTAINER "wechat:chinesecpp, email:[email protected]"
​
# 安装 app 需要的 Python 包
RUN pip install pandas flask scikit-learn jieba zhconv torch==2.5.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
​
# 设置工作目录
WORKDIR /root/app
​
# COPY 命令使用的是相对路径
COPY app/ /root/app
​
# 显式声明容器服务监听的端口
EXPOSE 5000
​
# 当启动容器时默认执行的命令
CMD ["python", "app.py"]

构建Docker镜像

docker build -t 镜像名(要构建的):1.0(自定义版本) .
最后的 . 表示寻找当前路径下的Dockerfile文件

使用镜像构建容器

docker run -d -p 8000:5000 上一步构建的镜像:1.0
5000: 容器内监听端口
8000: 映射到外部端口(访问时使用)

;