一:說(shuō)明
- 以前沒(méi)有使用過(guò)docker,近期需要使用部署自己的服務(wù),因此需要學(xué)習(xí),先從簡(jiǎn)單的使用起來(lái),后面專(zhuān)門(mén)整理一篇 如何部署 模型的方法。
- 理論知識(shí)就不說(shuō)了,網(wǎng)上很多,咱直接上步驟
- 整理邏輯分為: 基于dockerfile創(chuàng)建鏡像 >>>> 使用 docker-compose 創(chuàng)建容器 >>>> 后臺(tái)啟動(dòng)
當(dāng)然這些步驟完全可以都寫(xiě)在 dockerfile中,這里我拆開(kāi)了。
我的項(xiàng)目文件:
- 系統(tǒng)說(shuō)明:
Linux系統(tǒng):
docker的安裝 和啟動(dòng) ,以及 鏡像和容器的 增刪改查工作,網(wǎng)上有很多教程。
咱們只討論 實(shí)現(xiàn)邏輯流程。
二:dockerfile 參數(shù)說(shuō)明
1. 一般常用的 參數(shù),以及它的含義
2. 我自己的 dockerfile
FROM python:3.9.5
:該 image 文件繼承官方的 python,冒號(hào)表示標(biāo)簽,這里標(biāo)簽是3.9.5,即3.9.5版本的 python。COPY . /app
:將當(dāng)前目錄下的所有文件(除了.dockerignore
排除的路徑,注意:這個(gè)文件,根據(jù)自己需要?jiǎng)?chuàng)建,也就是項(xiàng)目中有些文件不需要放入鏡像中,就將這些文件路徑放入.dockerignore
文件中就行了 ),都拷貝進(jìn)入 image
文件的/app
目錄。WORKDIR /app
:指定接下來(lái)的工作路徑為/app
就是你進(jìn)入容器后,的目錄。(我用了docker-compose
方法,因此這里的路徑基本上我用不到了,后面在docker-compose
中會(huì)重新設(shè)置。)RUN pip install
:在/app
目錄下,運(yùn)行pip install
命令安裝依賴(lài)。注意,安裝后所有的依賴(lài),都將打包進(jìn)入 image 文件。COPY . .
:我這里 寫(xiě)重復(fù)了,當(dāng)命令重復(fù)了,(懶得 刪除了,反正幾個(gè)文件占不了多大內(nèi)存)。這里含義就是 將項(xiàng)目中的所有文件復(fù)制到 .
路徑中。EXPOSE 50002
:將容器 50002端口暴露出來(lái), 允許外部連接這個(gè)端口。
三:示例操作
1.1 開(kāi)始前先認(rèn)識(shí)一下Gunicorn + Gevent啟動(dòng)服務(wù)
一般我們可以使用命令python start.py
運(yùn)行這個(gè)應(yīng)用,打開(kāi)瀏覽器,輸入網(wǎng)址127.0.0.1:5000
并回車(chē),將會(huì)打開(kāi)我們的網(wǎng)站。
但是:
Gunicorn + Gevent
運(yùn)行以下命令即可安裝這兩個(gè)利器
安裝命令:pip install gunicorn gevent
在根目錄下新建文件 /gunicorn.conf.py
workers = 5
# 定義同時(shí)開(kāi)啟的處理請(qǐng)求的進(jìn)程數(shù)量,根據(jù)網(wǎng)站流量適當(dāng)調(diào)整worker_class = "gevent"
# 采用gevent庫(kù),支持異步處理請(qǐng)求,提高吞吐量bind = "0.0.0.0:80"
可以使用gunicorn命令來(lái)測(cè)試是否可以正確運(yùn)行,命令如下,打開(kāi)網(wǎng)址127.0.0.1:80,將會(huì)打開(kāi)我們的網(wǎng)站。
執(zhí)行命令:gunicorn start:app -c gunicorn.conf.py
1. 用Gunicorn + Gevent的好處:
Gunicorn
是一個(gè)用于部署Python Web
應(yīng)用程序的WSGI
服務(wù)器,它可以處理多個(gè)請(qǐng)求并發(fā)地。Gunicorn可以通過(guò)多進(jìn)程的方式來(lái)實(shí)現(xiàn)并發(fā)處理,每個(gè)進(jìn)程都可以獨(dú)立地處理客戶(hù)端請(qǐng)求。這使得Gunicorn非常適合在高負(fù)載情況下使用,因?yàn)樗梢杂行У乩枚嗪薈PU資源,提高應(yīng)用程序的性能和穩(wěn)定性。
而Gevent是一個(gè)基于協(xié)程的網(wǎng)絡(luò)庫(kù),它使用一種稱(chēng)為"Greenlet"的輕量級(jí)線(xiàn)程來(lái)實(shí)現(xiàn)并發(fā)
。與傳統(tǒng)的多線(xiàn)程或多進(jìn)程模型相比,協(xié)程模型可以更高效地使用系統(tǒng)資源,并且在編程上更加簡(jiǎn)單和直觀。使用Gevent時(shí),可以將阻塞式的I/O操作轉(zhuǎn)化為非阻塞式,從而提高應(yīng)用程序的響應(yīng)速度
。
結(jié)合使用Gunicorn和Gevent可以發(fā)揮它們各自的優(yōu)勢(shì)。Gunicorn作為Web服務(wù)器負(fù)責(zé)接收和分發(fā)請(qǐng)求,而Gevent作為協(xié)程庫(kù)負(fù)責(zé)處理請(qǐng)求。這樣可以充分利用Gunicorn的多進(jìn)程能力,同時(shí)又能享受到Gevent協(xié)程模型的優(yōu)勢(shì),提供高性能和高并發(fā)的服務(wù)
。
2. Gunicorn + Gevent的 使用示例
當(dāng)使用Gunicorn
和Gevent
啟動(dòng)服務(wù)時(shí),你可以使用一些參數(shù)來(lái)配置它們的行為。下面是一些常用的參數(shù)和使用示例:
-
Gunicorn
參數(shù):
-w 或 --workers
:指定工作進(jìn)程的數(shù)量。例如,gunicorn -w 4 app:app 將啟動(dòng)4個(gè)工作進(jìn)程來(lái)處理請(qǐng)求。-b 或 --bind
:指定服務(wù)器綁定的地址和端口。例如,gunicorn -b 0.0.0.0:8000 app:app 將在本地的8000端口上監(jiān)聽(tīng)請(qǐng)求。-t 或 --timeout
:指定超時(shí)時(shí)間,即請(qǐng)求的最大處理時(shí)間。例如,gunicorn -t 30 app:app 將設(shè)置請(qǐng)求超時(shí)時(shí)間為30秒。
例如: gunicorn -w 進(jìn)程數(shù)量 -b 監(jiān)聽(tīng)地址:監(jiān)聽(tīng)端口 運(yùn)行文件名稱(chēng):Flask程序?qū)嵗?/code>
gunicorn -w 4 -b 0.0.0.0:8080 app:app -D
-D
表示將gunicorn
置于后臺(tái)運(yùn)行
執(zhí)行ps -ef | grep gunicorn
可以查看gunicorn
進(jìn)程信息
-
Gevent
參數(shù):
--worker-class
:指定Gevent的工作類(lèi)。例如,gunicorn --worker-class gevent app:app 將使用Gevent作為工作類(lèi)來(lái)處理請(qǐng)求。--worker-connections
:指定每個(gè)工作進(jìn)程的最大并發(fā)連接數(shù)。例如,gunicorn --worker-connections 1000 app:app
將設(shè)置每個(gè)工作進(jìn)程最大連接數(shù)為1000。
使用示例
:
使用Gunicorn默認(rèn)配置啟動(dòng)應(yīng)用程序:gunicorn app:app
啟動(dòng)4個(gè)工作進(jìn)程,并將服務(wù)器綁定到本地的8000端口:gunicorn -w 4 -b 0.0.0.0:8000 app:app
設(shè)置請(qǐng)求超時(shí)時(shí)間為30秒:gunicorn -t 30 app:app
使用Gevent作為工作類(lèi)啟動(dòng)應(yīng)用程序:gunicorn --worker-class gevent app:app
設(shè)置每個(gè)工作進(jìn)程的最大連接數(shù)為1000:gunicorn --worker-connections 1000 app:app
1.2. 我自己的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已經(jīng)端口號(hào)
chdir = '/home/flaskProject' # gunicorn要切換到的目的工作目錄
timeout = 60 # 超時(shí)
worker_class = 'gevent' # 使用gevent模式,還可以使用sync 模式,默認(rèn)的是sync模式
workers = multiprocessing.cpu_count() * 2 + 1 # 啟動(dòng)的進(jìn)程數(shù)
loglevel = "info" # 日志級(jí)別,這個(gè)日志級(jí)別指的是錯(cuò)誤日志的級(jí)別,而訪(fǎng)問(wèn)日志的級(jí)別無(wú)法設(shè)置
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"' # 設(shè)置gunicorn訪(fǎng)問(wèn)日志格式,錯(cuò)誤日志無(wú)法設(shè)置
pidfile = "gunicorn.pid"
accesslog = "access.log"
errorlog = "error.log"
daemon = True # 是否后臺(tái)運(yùn)行
執(zhí)行gunicorn -c gun.py app:app
啟動(dòng)應(yīng)用程序,啟動(dòng)后項(xiàng)目的目錄下會(huì)生成access.log
,error.log
和gunicorn.pid
三個(gè)文件,gunicorn.pid
中保存了gunicorn
的主進(jìn)程PID
號(hào),可以通過(guò)cat gunicorn.pid
查看,當(dāng)想要停止gunicorn
時(shí),直接kill
進(jìn)程號(hào)即可殺死所有gunicorn
進(jìn)程。
2. 創(chuàng)建自己的鏡像 (基于dockerfile創(chuàng)建鏡像 >>>> )
我這里使用的是 dockerfile方法進(jìn)行鏡像創(chuàng)建:具體流程如下:
注意:開(kāi)始之前先cd 進(jìn)入項(xiàng)目文件夾中
:
- 首先,在項(xiàng)目的根目錄下,新建一個(gè)文本文件.dockerignore寫(xiě)入下面的內(nèi)容。
使用vim .dockerignore
生成文件(這個(gè)文件作用是添加不需要寫(xiě)入鏡像的文件):
.git # 這個(gè)是不寫(xiě)入鏡像的文件(git 里面的 .git文件,寫(xiě)在這里,意味著該文件不需要寫(xiě)入鏡像)
- 在項(xiàng)目的根目錄下,新建一個(gè)文本文件
vim Dockerfile
,寫(xiě)入下面的內(nèi)容
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
- 將 創(chuàng)建的文件 放在 項(xiàng)目文件中(注意Dockerfile 中的文件路徑不要錯(cuò)誤):
執(zhí)行:sudo docker build -t '(這里自己根據(jù)需要命名)':(標(biāo)簽也是) .
(注意 :不要忘了 最后的 .
)
(還有就是:我這使用了 sudo 是因?yàn)椋业馁~戶(hù)權(quán)限不夠)
注意:代碼最后的 .
不要忘了,
執(zhí)行情況如下:
- 查看鏡像
命令:sudo docker images
v1
是標(biāo)簽:IMAGE ID
是鏡像ID:
如果想要?jiǎng)h除的話(huà),可以這么做: docker rmi -f 鏡像ID
- 當(dāng)我們部署的時(shí)候,就可以將鏡像文件,打包下來(lái)上傳git,另外將容器的創(chuàng)建文件寫(xiě)好,以及執(zhí)行命令,寫(xiě)好給使用者。
打包命令可以使用:docker save -o giikin_recommen_web_v1.tar giikin_recommen_web:v1
3. 解決用戶(hù)沒(méi)有 root 權(quán)限,不能操作 鏡像后包文件
因?yàn)槲覜](méi)有root
權(quán)限,因此對(duì)打包后的鏡像文件,沒(méi)有辦法下載,上傳。因此可以更改 該包的權(quán)限。
操作方法:創(chuàng)建容器(注意:要將項(xiàng)目路徑,也就是鏡像包的路徑映射進(jìn)入容器中
)–》進(jìn)入容器–》更改權(quán)限。
具體做法如下:
- 查看鏡像文件:
sudo docker images
- 創(chuàng)建容器并且映射路徑:
sudo docker run -it --privileged=true -v /home/(用戶(hù)名字)/GIIKIN_ITEM_FILE:/home/GIIKIN_ITEM_FILE --name item_web01 9b0c771bafba bash
item_web01
:容器名字9b0c771bafba
:鏡像ID/home/(用戶(hù)名字)/GIIKIN_ITEM_FILE
:項(xiàng)目路徑/home/GIIKIN_ITEM_FILE
:映射到容器中的路徑
-
cd
到項(xiàng)目路徑 - 鍵入:
ls -l
來(lái)查看文件權(quán)限
- 依次鍵入:
chmod 777 giikin_item_to_item_web_v1(要更改的文件名字).tar
,chown 1005 giikin_item_to_item_web_v1.tar
- 再次查看權(quán)限。
4. 創(chuàng)建容器之前,先來(lái)認(rèn)識(shí)一下:docker-compose
創(chuàng)建容器可以使用這種方法:sudo docker container run -p 50002:50002 -it giikin_recommen_web /bin/bash
但是該方法并沒(méi)有達(dá)到我想要的效果,我想在容器啟動(dòng)時(shí)候,服務(wù)是啟動(dòng)。并且,這種方法有個(gè)弊端就是,一旦我的項(xiàng)目有什么變化,可能就需要重新構(gòu)建鏡像。
因此我這里使用 docker-compose
方法進(jìn)行創(chuàng)建容器。
1. docker-compose 的好處
-
簡(jiǎn)化部署:使用Docker Compose可以輕松地定義和配置多個(gè)容器,并將它們組合成一個(gè)應(yīng)用程序。這使得部署變得非常簡(jiǎn)單,只需要一條命令即可啟動(dòng)整個(gè)應(yīng)用。
-
可移植性:Docker Compose使用統(tǒng)一的配置文件來(lái)定義應(yīng)用程序的環(huán)境、服務(wù)和依賴(lài)關(guān)系。這意味著你可以在不同的環(huán)境中輕松地復(fù)制和部署應(yīng)用程序,而不會(huì)出現(xiàn)任何問(wèn)題。
-
高效管理:通過(guò)Docker Compose,你可以方便地管理多個(gè)容器應(yīng)用程序,包括啟動(dòng)、停止、重新構(gòu)建和擴(kuò)展等操作。這使得開(kāi)發(fā)人員可以更加高效地處理應(yīng)用程序的生命周期。
-
靈活性:Docker Compose允許你定義和組織多個(gè)容器,并指定它們之間的依賴(lài)關(guān)系和交互方式。這使得你可以輕松地創(chuàng)建復(fù)雜的應(yīng)用程序架構(gòu),同時(shí)保持靈活性和可維護(hù)性。
2. docker-compose 的參數(shù)以及使用示例
up 命令
:?jiǎn)?dòng)并運(yùn)行所有定義的服務(wù)。
示例:docker-compose up
down 命令
:停止并刪除所有已經(jīng)運(yùn)行的服務(wù)。
示例:docker-compose down
build 命令
:構(gòu)建鏡像。
示例:docker-compose build
start 命令
:?jiǎn)?dòng)服務(wù)。
示例:docker-compose start
stop 命令
:停止服務(wù)。
示例:docker-compose stop
restart 命令
:重啟服務(wù)。
示例:docker-compose restart
logs 命令
:查看服務(wù)的日志輸出。
示例:docker-compose logs
ps 命令
:列出當(dāng)前正在運(yùn)行的服務(wù)。
示例:docker-compose ps
5. 服務(wù)器部署:創(chuàng)建容器并且啟動(dòng)服務(wù)( docker-compose 創(chuàng)建容器 >>>> 后臺(tái)啟動(dòng)服務(wù))
好鏡像創(chuàng)建完后
,來(lái)創(chuàng)建我們想要的容器
- 先構(gòu)建
docker-compose.yml
腳本文件。:代碼如下:
version: '3.3'
services: # web # 自定
giikin_recommen_web01: # 這些名字自定
image: giikin_recommen_web:v1 # 鏡像的名字以及 標(biāo)簽
ports: # 我們的服務(wù)端口 進(jìn)行映射,我這里為避免麻煩,一樣
- "50002:50002"
restart: always
container_name: web01 # 容器的名字
privileged: true
volumes:# 這里是將你的項(xiàng)目地址與 容器中的工作地址做一個(gè)映射
- ./:/home/giikin_recommen_item # 這里建議使用相對(duì)路徑進(jìn)行映射,避免不必要的麻煩
- /etc/localtime:/etc/localtime # 日志中的時(shí)間信息
shm_size: 10g
working_dir: /home/giikin_recommen_item # 容器中的工作地址
command: gunicorn -c gunicorn.conf.py GIIKIN_RECOMMEN_WEB_v1:app # 接口服務(wù)啟動(dòng)代碼
- 將該腳本文件放在項(xiàng)目中 如下:(就是放入項(xiàng)目文件中)
- 執(zhí)行 代碼 :
sudo docker-compose up
進(jìn)行容器創(chuàng)建
執(zhí)行代碼如下:
- 如此就完成容器創(chuàng)建
那么想要讓服務(wù)后臺(tái) 一直執(zhí)行可以執(zhí)行: nohup sudo docker-compose up &
即可:
注意:停止
容器代碼:sudo docker stop
(容器ID)刪除
容器: sudo docker rm
(容器ID)
6. 調(diào)用服務(wù)測(cè)試
-
git clone
項(xiàng)目中的docker-compose.yml
、giikin_recommen_web_v1.tar
文件 -
加載docker環(huán)境鏡像:
sudo docker load -i giikin_recommen_web_v1.tar
-
啟動(dòng)容器并且啟動(dòng)接口服務(wù)
sudo docker-compose up
(該方法不具備后臺(tái)運(yùn)行)nohup sudo docker-compose up &
(具備后臺(tái)運(yùn)行) -
sudo docker-compose down
#關(guān)閉容器服務(wù)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-798591.html
四:不刪除鏡像情況下,給鏡像新增Python包
1. 操作步驟
1.1. 清除不使用的容器:sudo docker rm giikin_recommen_and_item_web_03
1.2. 創(chuàng)建一個(gè)容器: sudo docker run -itd --name myweb giikin_recommen_and_item_web:v1 bash
1.3. 查看容器: sudo docker ps
1.4. 進(jìn)入容器:sudo docker exec -it myweb bash
1.5. 通過(guò)pip進(jìn)行安裝:
1.6. 進(jìn)行鏡像更新:sudo docker commit 1ede40b020be(安裝新增包的容器) giikin_recommen_and_item_web:v1(需要更新的鏡像)
注意:這里更新的是本地的鏡像,并沒(méi)有同步更新云上的鏡像.文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-798591.html
到了這里,關(guān)于使用 docker 快速部署 flask接口服務(wù) 一的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!