使用docker部署flask接口服务 一

文章目录

  • 一:说明
  • 二:dockerfile 参数说明
    • 1. 一般常用的 参数,以及它的含义
    • 2. 我自己的 dockerfile
  • 三:示例操作
    • 1. Gunicorn + Gevent启动服务的好处
    • 2. 用Gunicorn + Gevent的好处:
    • 3. Gunicorn + Gevent的 使用示例
    • 4. 创建自己的镜像
    • 5. docker-compose
      • 1. docker-compose 的好处
      • 2. docker-compose 的参数以及使用示例
    • 6. 服务器部署:创建容器并且启动服务
    • 7. 调用服务测试

一:说明

  1. 以前没有使用过docker,近期需要使用部署自己的服务,因此需要学习,先从简单的使用起来,后面专门整理一篇 如何部署 模型的方法。
  2. 理论知识就不说了,网上很多,咱直接上步骤
  3. 整理逻辑分为: 基于dockerfile创建镜像 >>>> 使用 docker-compose 创建容器 >>>> 后台启动
    当然这些步骤完全可以都写在 dockerfile中,这里我拆开了。

我的项目文件:

在这里插入图片描述

  1. 系统说明:

Linux系统:
docker的安装 和启动 ,以及 镜像和容器的 增删改查工作,网上有很多教程。
咱们只讨论 实现逻辑流程。

二:dockerfile 参数说明

1. 一般常用的 参数,以及它的含义

在这里插入图片描述

2. 我自己的 dockerfile

在这里插入图片描述
FROM python:3.9.5:该 image 文件继承官方的 python,冒号表示标签,这里标签是3.9.5,即3.9.5版本的 python。
COPY . /app:将当前目录下的所有文件(除了.dockerignore排除的路径,注意:这个文件,根据自己需要创建,也就是项目中有些文件不需要放入镜像中,就将这些文件路径放入.dockerignore文件中就行了 ),都拷贝进入 image 文件的/app目录。
WORKDIR /app:指定接下来的工作路径为/app就是你进入容器后,的目录。(我用了docker-compose方法,因此这里的路径基本上我用不到了,后面在docker-compose中会重新设置。)
RUN pip install:在/app目录下,运行pip install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。
COPY . . :我这里 写重复了,当命令重复了,(懒得 删除了,反正几个文件占不了多大内存)。这里含义就是 将项目中的所有文件复制到 . 路径中。
EXPOSE 50002:将容器 50002端口暴露出来, 允许外部连接这个端口。

三:示例操作

1. Gunicorn + Gevent启动服务的好处

一般我们可以使用命令python start.py运行这个应用,打开浏览器,输入网址127.0.0.1:5000并回车,将会打开我们的网站。
但是:

Gunicorn + Gevent

运行以下命令即可安装这两个利器

安装命令:pip install gunicorn gevent

在根目录下新建文件 /gunicorn.conf.py

workers = 5 # 定义同时开启的处理请求的进程数量,根据网站流量适当调整
worker_class = "gevent" # 采用gevent库,支持异步处理请求,提高吞吐量
bind = "0.0.0.0:80" 可以使用gunicorn命令来测试是否可以正确运行,命令如下,打开网址127.0.0.1:80,将会打开我们的网站。

执行命令:gunicorn start:app -c gunicorn.conf.py

2. 用Gunicorn + Gevent的好处:

Gunicorn是一个用于部署Python Web应用程序的WSGI服务器,它可以处理多个请求并发地。Gunicorn可以通过多进程的方式来实现并发处理,每个进程都可以独立地处理客户端请求。这使得Gunicorn非常适合在高负载情况下使用,因为它可以有效地利用多核CPU资源,提高应用程序的性能和稳定性。
而Gevent是一个基于协程的网络库,它使用一种称为"Greenlet"的轻量级线程来实现并发。与传统的多线程或多进程模型相比,协程模型可以更高效地使用系统资源,并且在编程上更加简单和直观。使用Gevent时,可以将阻塞式的I/O操作转化为非阻塞式,从而提高应用程序的响应速度
结合使用Gunicorn和Gevent可以发挥它们各自的优势。Gunicorn作为Web服务器负责接收和分发请求,而Gevent作为协程库负责处理请求。这样可以充分利用Gunicorn的多进程能力,同时又能享受到Gevent协程模型的优势,提供高性能和高并发的服务

3. Gunicorn + Gevent的 使用示例

当使用GunicornGevent启动服务时,你可以使用一些参数来配置它们的行为。下面是一些常用的参数和使用示例:

  1. Gunicorn参数:

-w 或 --workers:指定工作进程的数量。例如,gunicorn -w 4 app:app 将启动4个工作进程来处理请求。
-b 或 --bind:指定服务器绑定的地址和端口。例如,gunicorn -b 0.0.0.0:8000 app:app 将在本地的8000端口上监听请求。
-t 或 --timeout:指定超时时间,即请求的最大处理时间。例如,gunicorn -t 30 app:app 将设置请求超时时间为30秒。

  1. Gevent参数:

--worker-class:指定Gevent的工作类。例如,gunicorn --worker-class gevent app:app 将使用Gevent作为工作类来处理请求。
--worker-connections:指定每个工作进程的最大并发连接数。例如,gunicorn --worker-connections 1000 app:app 将设置每个工作进程最大连接数为1000。

使用示例
使用Gunicorn默认配置启动应用程序:gunicorn app:app
启动4个工作进程,并将服务器绑定到本地的8000端口:gunicorn -w 4 -b 0.0.0.0:8000 app:app
设置请求超时时间为30秒:gunicorn -t 30 app:app
使用Gevent作为工作类启动应用程序:gunicorn --worker-class gevent app:app
设置每个工作进程的最大连接数为1000:gunicorn --worker-connections 1000 app:app

4. 创建自己的镜像

我这里使用的是 dockerfile方法进行镜像创建:具体流程如下:

注意:开始之前先cd 进入项目文件夹中

  1. 首先,在项目的根目录下,新建一个文本文件.dockerignore写入下面的内容。
    使用vim .dockerignore 生成文件:
.git # 这个是不写入镜像的文件
  1. 在项目的根目录下,新建一个文本文件 Dockerfile,写入下面的内容
FROM python:3.9.5
COPY . /app
WORKDIR /app
RUN pip install -r requ.txt -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com
EXPOSE 50002
COPY . .
CMD gunicorn GIIKIN_RECOMMEN_WEB_v1:app -c gunicorn.conf.py
  1. 将 创建的文件 放在 项目文件中:
    执行: sudo docker build -t '(这里自己根据需要命名)':(标签也是) .

注意:代码最后的 . 不要忘了,

执行情况如下:

在这里插入图片描述

  1. 查看镜像

命令:sudo docker images

在这里插入图片描述

v1是标签:
IMAGE ID是镜像ID:
如果想要删除的话,可以这么做: docker rmi -f 镜像ID

5. docker-compose

创建容器可以使用这种方法:sudo docker container run -p 50002:50002 -it giikin_recommen_web /bin/bash但是该方法并没有达到我想要的效果,我想在容器启动时候,服务是启动。并且,这种方法有个弊端就是,一旦我的项目有什么变化,可能就需要重新构建镜像。
因此我这里使用 docker-compose方法进行创建容器。

1. docker-compose 的好处

  1. 简化部署:使用Docker Compose可以轻松地定义和配置多个容器,并将它们组合成一个应用程序。这使得部署变得非常简单,只需要一条命令即可启动整个应用。

  2. 可移植性:Docker Compose使用统一的配置文件来定义应用程序的环境、服务和依赖关系。这意味着你可以在不同的环境中轻松地复制和部署应用程序,而不会出现任何问题。

  3. 高效管理:通过Docker Compose,你可以方便地管理多个容器应用程序,包括启动、停止、重新构建和扩展等操作。这使得开发人员可以更加高效地处理应用程序的生命周期。

  4. 灵活性:Docker Compose允许你定义和组织多个容器,并指定它们之间的依赖关系和交互方式。这使得你可以轻松地创建复杂的应用程序架构,同时保持灵活性和可维护性。

2. docker-compose 的参数以及使用示例

up 命令:启动并运行所有定义的服务。
示例:docker-compose up

down 命令:停止并删除所有已经运行的服务。
示例:docker-compose down

build 命令:构建镜像。
示例:docker-compose build

start 命令:启动服务。
示例:docker-compose start

stop 命令:停止服务。
示例:docker-compose stop

restart 命令:重启服务。
示例:docker-compose restart

logs 命令:查看服务的日志输出。
示例:docker-compose logs

ps 命令:列出当前正在运行的服务。
示例:docker-compose ps

6. 服务器部署:创建容器并且启动服务

好镜像创建完后,来创建我们想要的容器

  1. 先构建docker-compose.yml 脚本文件。:代码如下:
version: '3.3'
services: # web # 自定giikin_recommen_web01:  # 这些名字自定image: giikin_recommen_web:v1  # 镜像的名字以及 标签ports: # 我们的服务端口 进行映射,我这里为避免麻烦,一样- "50002:50002"  restart: alwayscontainer_name: web01 # 容器的名字privileged: truevolumes:# 这里是将你的项目地址与 容器中的工作地址做一个映射- /home/zhangsan/GIIKIN_ITEM_FILE/giikin_recommen_item:/home/giikin_recommen_item- /etc/localtime:/etc/localtime   # 日志中的时间信息shm_size: 10gworking_dir: /home/giikin_recommen_item #  容器中的工作地址command: gunicorn -c gunicorn.conf.py GIIKIN_RECOMMEN_WEB_v1:app # 接口服务启动代码
  1. 将该脚本文件放在项目中 如下:

在这里插入图片描述

  1. 执行 代码 :sudo docker-compose up

执行代码如下:

在这里插入图片描述

  1. 如此就完成容器创建,
    当我们部署的时候,就可以将镜像文件,打包下来上传git,另外将容器的创建文件写好,以及执行命令,写好给使用者。

那么想要让服务后台 一直执行可以执行: nohup sudo docker-compose up & 即可:
注意:
停止容器代码:sudo docker stop (容易ID)
删除容器: sudo docker rm (容器ID)

7. 调用服务测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/119767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT 与 Python Echarts 完成热力图实例

热力图是一种数据可视化方式,它通过颜色的变化来表示数据的差异和分布。以下是使用热力图的一些作用和好处: 数据可视化:热力图可以将复杂的数据集转化为更直观、更易理解的形式。这对于很多人来说,尤其是那些没有深入统计学或数…

Golang Struct 继承的深入讨论和细节

1)结构体可以使用嵌套匿名结构体所有的字段和方法,即:首字母大写或者小写的字段、方法,都可以使用。 package mainimport "fmt"type A struct {Name stringage int }func (a *A) SayName() {fmt.Println("A say …

【软件测试】了解JUnit单元测试框架常用注解

目录 1、认识JUnit 2、Junit中常见的注解 1、Test 2、Disabled 3、BeforeAll和AfterAll 4、BeforeEach和AfterEach 5、 ParameterizedTest:参数化 6、order 3、断言 1、断言相等【Assertions.assertEquals(预期,比较值)】;相等测试通…

SpringBoot日志+SpringMVC+UUID重命名文件+Idea热部署

目录 【SpringBoot日志】 什么是日志,日志的作用 关于日志的基本信息,又有哪些呢? 关于日志的级别 Springboot内置SLF4J【门面模式】 和 logback【日志框架】 在配置文件中可以设置日志级别【以.yml为例】 SpringBoot 持久化的保存日…

Echarts 实现 设备运行状态图(甘特图) 工业大数据展示

let option{tooltip: {formatter: function (params) {let startTime new Date(params.value[1])let endTime new Date(params.value[2]);//北京时间/时间戳转成日常时间function convert(date){var y date.getFullYear();var m date.getMonth() 1;m m < 10 ? "0…

DBOW概要理解与记录

前言 DBOW作为一种视觉回环技术被广泛应用在各类VSLAM框架中&#xff0c;之前的经验主要集中在使用和抽象理解层面&#xff0c;近期花了一些时间仔细阅读了相关论文和源码&#xff0c;这里做一些记录。 两个关键概念 Vocabulary 通过预先训练得到的词汇库&#xff0c;以树状…

LeetCode217——存在重复元素

LeetCode217——存在重复元素 1.题目描述&#xff1a; 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 &#xff0c;返回 true &#xff1b;如果数组中每个元素互不相同&#xff0c;返回 false 。 2.Result01(暴力解) public static boolean containsDuplicate(in…

在Go项目中封装AES加解密客户端接口

1.摘要 在一个中型以上的项目中, 我们一般会在项目工程中开辟一个pkg文件夹用来存放一些基础工具接口,比如:数据库、中间件、加解密算法、基础协议等等。在这篇文章中, 我主要分享一下在基于Go语言的项目中, 加解密算法中如何封装一个通用的加解密接口, 并以使用比较广泛的AES…

机器学习2(Numpy)

1、numpy ndarray 案例演示 可以在创建的时候就指定元素类型 生成0/1数组 从现有数组中生成 生成固定数组 生成随机数组

如何将 huggingface上的模型文件下载到本地

写在前面 缘由&#xff1a;国内的GPU服务器直接调取 huggingface 上模型经常会失败&#xff0c;因此下载到本地就能免去许多麻烦。 方法三基于知乎上一位博主所提出方法的基础上进行改进&#xff0c;可以将huggingface上模型由 Colab 存进 谷歌云盘 或者 百度云盘。特别是有些…

项目管理之如何有效定义项目目标

项目目标管理是项目管理中非常重要的一个环节&#xff0c;它可以帮助项目团队明确目标&#xff0c;制定合理可行的计划&#xff0c;确保项目顺利实施并取得成功。在定义项目目标时&#xff0c;需要遵循SMART原则&#xff0c;确保目标具体、明确、可衡量、可实现、相关且有时间和…

基于ssm的宠物医院管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

简单8位CPU设计verilog微处理器,源码/视频

名称&#xff1a;8位CPU设计微处理器 软件&#xff1a;QuartusII 语言&#xff1a;Verilog 代码功能&#xff1a; 设计一个简单的处理器&#xff0c;可以实现加减法以及简单的逻辑运算。 设计包括程序计数器电路&#xff0c;指令存储器电路&#xff0c;指令译码器电路(控制器…

nginx浏览器缓存和上流缓存expires指令_nginx配置HTTPS

1.nginx控制浏览器缓存是针对于静态资源[js,css,图片等] 1.1 expires指令 location /static {alias/home/imooc;#设置浏览器缓存10s过期expires 10s;#设置浏览器缓存时间晚上22:30分过期expires @22h30m;#设置浏览器缓存1小时候过期expires -1h;#设置浏览器不缓存expires …

NSSCTF做题第9页(2)

[SWPUCTF 2022 新生赛]ez_1zpop <?php error_reporting(0); class dxg { function fmm() { return "nonono"; } } class lt { public $impohi; public $md51weclome; public $md52to NSS; function __construct() { $this-&…

springboot + redis实现签到与统计功能

在很多项目中都会有签到与统计功能&#xff0c;最容易想到的方案是创建一个签到表来记录每个用户的签到记录&#xff0c;比如设计一个mysql数据库表&#xff1a; CREATE TABLE tb_sign id bigint(20) unsigned NOT NULL AUTOINCREMENT COMMENT 主键, user_id bigint(20) unsig…

【Java技术专题】「入门到精通系列教程」深入探索Java特性中并发编程体系的原理和实战开发指南( 实现可伸缩IO专题)— 上

深入探索Java特性中并发编程体系的原理和实战开发指南&#xff08; 实现可伸缩IO专题&#xff09; 总体内容概览可扩展的网络服务分布式对象传统的阻塞式网络服务每个请求或连接可以在独立的线程中进行处理Server服务处理请求类Handler处理逻辑类优点缺点 可扩展性目标平稳降级…

MySQL Join 类型

文章目录 1 Join 类型有哪些2 Inner Join3 Left Join4 Right Join5 Full Join 1 Join 类型有哪些 SQL Join 类型的区别 Inner Join: 左,右表都有的数据Left Join: 左表返回所有的行, 右表没有的补充为 NULLRight Loin: 右表返回所有的行, 左表没有的补充为 NULLFull Outer J…

Excel多线程导入数据库

文章目录 Excel多线程导入数据库1. CountDownLatch2.多线程导入数据库 Excel多线程导入数据库 书接上文 Excel20w数据5s导入 1. CountDownLatch CountDownLatch 维护了一个计数器&#xff0c;初始值为指定的数量。当一个或多个线程调用 await() 方法时&#xff0c;它们会被阻…

redis 配置主从复制,哨兵模式案例

哨兵(Sentinel)模式 1 . 什么是哨兵模式&#xff1f; 反客为主的自动版&#xff0c;能够自动监控master是否发生故障&#xff0c;如果故障了会根据投票数从slave中挑选一个 作为master&#xff0c;其他的slave会自动转向同步新的master&#xff0c;实现故障自动转义 2 . 原理…