我的项目文件:
Linux系统:
docker的安装 和启动 ,以及 镜像和容器的 增删改查工作,网上有很多教程。
咱们只讨论 实现逻辑流程。
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端口暴露出来, 允许外部连接这个端口。
一般我们可以使用命令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
Gunicorn
是一个用于部署Python Web
应用程序的WSGI
服务器,它可以处理多个请求并发地。Gunicorn可以通过多进程的方式来实现并发处理,每个进程都可以独立地处理客户端请求。这使得Gunicorn非常适合在高负载情况下使用,因为它可以有效地利用多核CPU资源,提高应用程序的性能和稳定性。
而Gevent是一个基于协程的网络库,它使用一种称为"Greenlet"的轻量级线程来实现并发
。与传统的多线程或多进程模型相比,协程模型可以更高效地使用系统资源,并且在编程上更加简单和直观。使用Gevent时,可以将阻塞式的I/O操作转化为非阻塞式,从而提高应用程序的响应速度
。
结合使用Gunicorn和Gevent可以发挥它们各自的优势。Gunicorn作为Web服务器负责接收和分发请求,而Gevent作为协程库负责处理请求。这样可以充分利用Gunicorn的多进程能力,同时又能享受到Gevent协程模型的优势,提供高性能和高并发的服务
。
当使用Gunicorn
和Gevent
启动服务时,你可以使用一些参数来配置它们的行为。下面是一些常用的参数和使用示例:
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秒。
例如: gunicorn -w 进程数量 -b 监听地址:监听端口 运行文件名称:Flask程序实例名
gunicorn -w 4 -b 0.0.0.0:8080 app:app -D
-D
表示将gunicorn
置于后台运行
执行ps -ef | grep gunicorn
可以查看gunicorn
进程信息
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
gunicorn.conf.py
,并生成日志文件import logging
import logging.handlers
import os
import multiprocessing
import gevent.monkey
gevent.monkey.patch_all()
bind = '0.0.0.0:8080' # 绑定的ip已经端口号
chdir = '/home/flaskProject' # gunicorn要切换到的目的工作目录
timeout = 60 # 超时
worker_class = 'gevent' # 使用gevent模式,还可以使用sync 模式,默认的是sync模式
workers = multiprocessing.cpu_count() * 2 + 1 # 启动的进程数
loglevel = "info" # 日志级别,这个日志级别指的是错误日志的级别,而访问日志的级别无法设置
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"' # 设置gunicorn访问日志格式,错误日志无法设置
pidfile = "gunicorn.pid"
accesslog = "access.log"
errorlog = "error.log"
daemon = True # 是否后台运行
执行gunicorn -c gun.py app:app
启动应用程序,启动后项目的目录下会生成access.log
,error.log
和gunicorn.pid
三个文件,gunicorn.pid
中保存了gunicorn
的主进程PID
号,可以通过cat gunicorn.pid
查看,当想要停止gunicorn
时,直接kill
进程号即可杀死所有gunicorn
进程。
我这里使用的是 dockerfile方法进行镜像创建:具体流程如下:
注意:开始之前先cd 进入项目文件夹中
:
vim .dockerignore
生成文件(这个文件作用是添加不需要写入镜像的文件):.git # 这个是不写入镜像的文件(git 里面的 .git文件,写在这里,意味着该文件不需要写入镜像)
vim 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
sudo docker build -t '(这里自己根据需要命名)':(标签也是) .
(注意 :不要忘了 最后的 .
)注意:代码最后的 .
不要忘了,
执行情况如下:
命令:sudo docker images
v1
是标签:
IMAGE ID
是镜像ID:
如果想要删除的话,可以这么做: docker rmi -f 镜像ID
docker save -o giikin_recommen_web_v1.tar giikin_recommen_web:v1
因为我没有root
权限,因此对打包后的镜像文件,没有办法下载,上传。因此可以更改 该包的权限。
操作方法:创建容器(注意:要将项目路径,也就是镜像包的路径映射进入容器中
)–》进入容器–》更改权限。
具体做法如下:
sudo docker images
sudo docker run -it --privileged=true -v /home/(用户名字)/GIIKIN_ITEM_FILE:/home/GIIKIN_ITEM_FILE --name item_web01 9b0c771bafba bash
item_web01
:容器名字
9b0c771bafba
:镜像ID
/home/(用户名字)/GIIKIN_ITEM_FILE
:项目路径
/home/GIIKIN_ITEM_FILE
:映射到容器中的路径
cd
到项目路径ls -l
来查看文件权限chmod 777 giikin_item_to_item_web_v1(要更改的文件名字).tar
,chown 1005 giikin_item_to_item_web_v1.tar
创建容器可以使用这种方法:sudo docker container run -p 50002:50002 -it giikin_recommen_web /bin/bash
但是该方法并没有达到我想要的效果,我想在容器启动时候,服务是启动。并且,这种方法有个弊端就是,一旦我的项目有什么变化,可能就需要重新构建镜像。
因此我这里使用 docker-compose
方法进行创建容器。
简化部署:使用Docker Compose可以轻松地定义和配置多个容器,并将它们组合成一个应用程序。这使得部署变得非常简单,只需要一条命令即可启动整个应用。
可移植性:Docker Compose使用统一的配置文件来定义应用程序的环境、服务和依赖关系。这意味着你可以在不同的环境中轻松地复制和部署应用程序,而不会出现任何问题。
高效管理:通过Docker Compose,你可以方便地管理多个容器应用程序,包括启动、停止、重新构建和扩展等操作。这使得开发人员可以更加高效地处理应用程序的生命周期。
灵活性: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
好镜像创建完后
,来创建我们想要的容器
docker-compose.yml
脚本文件。:代码如下:version: '3.3'
services: # web # 自定
giikin_recommen_web01: # 这些名字自定
image: giikin_recommen_web:v1 # 镜像的名字以及 标签
ports: # 我们的服务端口 进行映射,我这里为避免麻烦,一样
- "50002:50002"
restart: always
container_name: web01 # 容器的名字
privileged: true
volumes:# 这里是将你的项目地址与 容器中的工作地址做一个映射
- ./:/home/giikin_recommen_item # 这里建议使用相对路径进行映射,避免不必要的麻烦
- /etc/localtime:/etc/localtime # 日志中的时间信息
shm_size: 10g
working_dir: /home/giikin_recommen_item # 容器中的工作地址
command: gunicorn -c gunicorn.conf.py GIIKIN_RECOMMEN_WEB_v1:app # 接口服务启动代码
sudo docker-compose up
进行容器创建执行代码如下:
那么想要让服务后台 一直执行可以执行: nohup sudo docker-compose up &
即可:
注意:
停止
容器代码:sudo docker stop
(容器ID)
删除
容器: sudo docker rm
(容器ID)
git clone
项目中的 docker-compose.yml
、giikin_recommen_web_v1.tar
文件
加载docker环境镜像:sudo docker load -i giikin_recommen_web_v1.tar
启动容器并且启动接口服务
sudo docker-compose up
(该方法不具备后台运行)
nohup sudo docker-compose up &
(具备后台运行)
sudo docker-compose down
#关闭容器服务
1.1. 清除不使用的容器:sudo docker rm giikin_recommen_and_item_web_03
1.2. 创建一个容器: sudo docker run -itd --name myweb giikin_recommen_and_item_web:v1 bash
1.3. 查看容器: sudo docker ps
1.4. 进入容器:sudo docker exec -it myweb bash
1.5. 通过pip进行安装:
1.6. 进行镜像更新:sudo docker commit 1ede40b020be(安装新增包的容器) giikin_recommen_and_item_web:v1(需要更新的镜像)
注意:这里更新的是本地的镜像,并没有同步更新云上的镜像.