当前位置: 首页 > news >正文

使用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. 调用服务测试

相关文章:

使用docker部署flask接口服务 一

文章目录 一:说明二:dockerfile 参数说明1. 一般常用的 参数,以及它的含义2. 我自己的 dockerfile 三:示例操作1. Gunicorn Gevent启动服务的好处2. 用Gunicorn Gevent的好处:3. Gunicorn Gevent的 使用示例4. 创建…...

超实用的跟圈和一键转发好友朋友圈功能

一键转发朋友圈/跟圈 想转发别人的朋友圈内容,通常需要手动复制粘贴,一个个复制保存实在是太麻烦耗费时间。 有时候咱也不可能随时都看朋友圈嘛,那又想及时转发朋友的圈的,有什么办法可以轻松实现呢? 操作步骤 单击…...

口袋参谋:如何一键获取竞品数据?这招实用!

​在淘宝天猫上开店,市场竞争日益激烈,想要做好店铺,我们就不得不去分析竞品的数据了。 很多卖家开店后,一上来就直接卡在类目前10,折腾了一两个月才发现自己对标错了对象,最终竹篮打水一场空。 所以&…...

python 生成html文件并端口展示

1.生成相关的html文件 import json import os import calc import requests import numpy as npwith open(picture, r,encodingutf-8) as f:lines f.readlines() html <html>\n<html lang"zh">\n<head>\n<meta charset"UTF-8">…...

二进制部署 Kubernetes(master和node)

二进制搭建 Kubernetes v1.20 k8s集群master01&#xff1a;20.0.0.101 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群master02&#xff1a;20.0.0.106 k8s集群node01&#xff1a;20.0.0.102 kubelet kube-proxy docker k8s集群node02&#xff1a;20.0…...

【计算机网络】IP协议的相关特性

IP协议&#xff1a;互联网的核心组件 在当今高度数字化的世界中&#xff0c;互联网已成为人们生活、工作不可或缺的一部分。而在这个庞大的网络中&#xff0c;IP协议&#xff08;Internet Protocol&#xff09;作为核心的通信协议&#xff0c;发挥着至关重要的作用。本文将详细…...

如何在Potplayer中使用公网访问群晖WebDav?

文章目录 1 使用环境要求&#xff1a;2 配置webdav3 测试局域网使用potplayer访问webdav4 内网穿透&#xff0c;映射至公网5 使用固定地址在potplayer访问webdav ​ 国内流媒体平台的内容让人一言难尽&#xff0c;就算是购买了国外的优秀作品&#xff0c;也总是在关键剧情上删删…...

如果你有一台服务器,你最想做那些事?

如果有一台服务器&#xff0c;可以做很多有趣的事情。本文将介绍服务器的基本知识&#xff0c;假设你拥有一台服务器后该如何使用它&#xff0c;以及管理服务器的最佳实践。 首先&#xff0c;让我们了解一下什么是服务器。服务器是指在网络上提供各种服务的计算机&#xff0c;如…...

Unity中Shader的Fallback

文章目录 前言一、解决 Pass 复用的方案方案一&#xff1a;使用之前的UsePass方案&#xff0c;把ShadowCaster的Pass提出来到一个单独的Shader中&#xff0c;在使用的时候直接使用 UsePass方案二&#xff1a;使用Fallback功能 前言 Unity中Shader的Fallback&#xff0c;我们在…...

“菜鸟”程序员逆袭:独立开发iOS音乐应用,年底参加Amazon DeepRacer 全球锦标赛

“致一年前的小木土&#xff1a;任务完成。” 6月30日&#xff0c;在获得2023 Amazon DeepRacer自动驾驶赛车企业总决赛中国区冠军三天后的深夜&#xff0c;杜键文发了这条朋友圈&#xff0c;并配上比赛现场的9张图。 “小木土”是杜键文的网名&#xff0c;取其姓氏&#xff…...

nginx测试rewrite

nginx测试rewrite last :相当于 Apache 里的(L)标记&#xff0c;表示完成rewrite 匹配; break: 本条规则匹配完成后&#xff0c;终止匹配&#xff0c;不再匹配后面的规则。 # 其中last 和 break 用来实现 URL 重写时&#xff0c;浏览器地址栏URL 地址不变 redirect: 返回 302 …...

qt 多语言版本 QLinguist使用方法

在使用qt开发一款软件时&#xff0c;可能需要考虑显示文本中英文等多语言版本。可以使用qt语言家的方式实现。 步骤&#xff1a; 1、代码中给控件设置文本时&#xff0c;记得带上QObject::tr() 2、工程pro文件中加入 TRANSLATIONS demo2_en.ts 3、Qt creator点击“工具”—“外…...

postgresql14-用户与角色(二)

介绍 查看 SELECT rolname FROM pg_roles;postgres是系统初始化时默认创建的角色&#xff0c;为超级管理员。 \duList of rolesRole name | Attributes | Member of ------------------------------------------------------…...

Django结合Celery进行异步调用

目录 Celery介绍 相关环境 相关配置 1、在proj/proj/目录下创建一个新的celery.py模块 定义 Celery 实例&#xff1a; 2、在proj/proj/__init__.py 模块中导入这个应用程序。 3、在各自模块中定义任务文件tasks.py 4、settings.py配置 服务启动 异步调用 Celery介绍 C…...

职场经验|项目管理发展方向有哪些?

很多人都知道项目管理行业发展前景比较好&#xff0c;但都不知道从哪下手&#xff1f;今天胖圆给大家分享一下&#xff0c;想要从事项目管理行业&#xff0c;有哪几种职业方向~ 1. 项目经理&#xff08;Project Manager&#xff09;&#xff1a;负责项目的规划、执行和控制&am…...

Linux的shell(极其粗糙版)

Shell脚本&#xff1a; 脚本主要是为了业务&#xff0c;辅助人工&#xff0c;实现自动化运维 Shell:介于用户和内核之间&#xff0c;充当翻译官的作用&#xff0c;当用户执行相关的命令&#xff0c;shell会把指令二进制传给内核&#xff0c;内核处理完毕以后通过shell把内核的…...

没有英语要求的中国人大女王金融硕士有多香你可能还不知道

在当今全球化的世界中&#xff0c;英语已经成为了一种国际通用语言。对于许多学生来说&#xff0c;掌握英语是实现个人发展和职业成功的关键。尤其是在读研阶段&#xff0c;英语水平的要求更是不容忽视。但现实问题是我们没有相应的语言环境&#xff0c;直接导致的是大学的英语…...

低代码平台如何实现快速开发应用?

目录 一、低代码“快”在哪里&#xff1f; 下面分享低代码低代码平台实现快速开发的一些主要方式&#xff1a; 1.图形化编程&#xff1a; 2.预构建组件&#xff1a; 3.模板和插件&#xff1a; 4.自动化流程&#xff1a; 5.集成和扩展&#xff1a; 6.多端适配&#xff1a; 7.快速…...

iOS原生、Android 原生, flutter 三种方式给照片流添加文字(水印)

效果图:三中代码实现的效果差不多 Swift:代码 import UIKitclass ImageWatermarking: NSObject {static func textToImage(drawText text: String, inImage initImage: UIImage, atPoint point: CGPoint) -> UIImage {let textColor = UIColor.whitelet textFont = UIFon…...

数据结构: 红黑树

目录 1.红黑树概念 2.红黑树性质 3.调整 1.如果p和u都是红色&#xff0c;将其都改为黑色即可,然后向上调整 2.如果p红&#xff08;u黑/u不在&#xff09;&#xff0c;这时候左子树两红&#xff0c;于是给右子树一个红&#xff08;旋转变色&#xff09; 2.1右单旋 变色- …...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...