FastAPI 部署在Docker的詳細過程
Docker 學習
https://www.cnblogs.com/poloyy/p/15257059.html
項目結(jié)構(gòu)
. ├── app │ ├── __init__.py │ └── main.py ├── Dockerfile └── requirements.txt
FastAPI 應用程序 main.py 代碼
from typing import Optional from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Optional[str] = None): return {"item_id": item_id, "q": q}
Dockerfile
# 1、從官方 Python 基礎(chǔ)鏡像開始 FROM python:3.9 # 2、將當前工作目錄設(shè)置為 /code # 這是放置 requirements.txt 文件和應用程序目錄的地方 WORKDIR /code # 3、先復制 requirements.txt 文件 # 由于這個文件不經(jīng)常更改,Docker 會檢測它并在這一步使用緩存,也為下一步啟用緩存 COPY ./requirements.txt /code/requirements.txt # 4、運行 pip 命令安裝依賴項 RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt # 5、復制 FastAPI 項目代碼 COPY ./app /code/app # 6、運行服務 CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
第四步:運行 pip 命令解析
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
- --no-cache-dir 選項告訴pip不要將下載的包保存在本地,因為只有當pip 將再次運行以安裝相同的包時才會這樣,但在使用容器時情況并非如此
- --no-cache-dir只與pip有關(guān),與 Docker或容器無關(guān)
- --upgrade選項告訴 pip升級已經(jīng)安裝的軟件包
- 因為上一步復制文件可能會被Docker 緩存檢測到,所以這一步也會在Docker 緩存可用時使用
- 在這一步中使用緩存會在開發(fā)過程中一次又一次地構(gòu)建鏡像時節(jié)省大量時間,而不是每次都下載并安裝所有依賴項
Docker 緩存
這里有一個重要的技巧Dockerfile,首先只復制依賴項的文件,而不是 FastAPI 應用程序代碼
./requirements.txt /code/requirements.txt
- Docker 和其他工具以增量方式構(gòu)建這些容器映像,在另一層之上添加一層
- 從 Dockerfile 的頂部(首行)開始,由 Dockerfile 的每個指令來創(chuàng)建任何文件
- Docker 和其他工具在構(gòu)建鏡像時也是用內(nèi)部緩存
- 如果文件自上次構(gòu)建容器鏡像后沒有更改,則它將重用上次創(chuàng)建的同一層,而不是再次復制文件并從頭開始創(chuàng)建一個新的層
- 僅僅避免文件副本并不一定會改善太多,但是因為它在該步驟中使用了緩存,所以它可以在下一步中使用緩存
- 例如,它可以將緩存用于安裝依賴項的指令
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
- requirements.txt 不會經(jīng)常改變,所以通過復制該文件,Docker 可以在該步驟中使用緩存
- Docker 將能夠使用緩存進行下一步下載和安裝這些依賴項,這就是節(jié)省大量時間的地方
- 下載并安裝該軟件包的依賴關(guān)系可能需要幾分鐘,但使用的緩存將只需要幾秒
- 由于在開發(fā)過程中一次又一次地構(gòu)建容器鏡像以檢查代碼更改是否有效,因此可以節(jié)省大量累積時間
./app /code/app
- 在 Dockerfile 尾部,復制 FastAPI 應用程序代碼
- 由于這是最常更改的內(nèi)容,因此將其放在最后,在此步驟之后的任何內(nèi)容都將無法使用緩存
構(gòu)建 Docker Image
在 Dockerfile 打開命令行
docker build -t myimage .
查看鏡像
docker images
啟動 docker 容器
docker run -d --name mycontainer -p 80:80 myimage
查看容器
docker ps
訪問 127.0.0.1/
訪問 127.0.0.1/docs
帶有 Gunicorn 的官方 Docker 鏡像 - Uvicorn
- 此鏡像包含一個自動調(diào)整機制,可根據(jù)可用的 CPU 內(nèi)核設(shè)置工作進程的數(shù)量
- 它具有合理的默認值,但仍然可以使用環(huán)境變量或配置文件更新所有配置
- 此鏡像上的進程數(shù)是根據(jù)可用的 CPU 內(nèi)核自動計算的,它將嘗試從 CPU 中榨取盡可能多的性能
- 但這也意味著,由于進程數(shù)取決于容器運行的 CPU,消耗的內(nèi)存量也將取決于此
- 因此,如果應用程序消耗大量內(nèi)存(例如使用機器學習模型),并且服務器有很多 CPU 內(nèi)核但內(nèi)存很少,容器最終可能會使用比可用內(nèi)存更多的內(nèi)存,這會大大降低性能(甚至崩潰)
官方栗子
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9 COPY ./requirements.txt /app/requirements.txt RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt COPY ./app /app
應用場景
- 如果正在使用Kubernetes,并且已經(jīng)設(shè)置了集群級別的復制,就不應該使用此鏡像,最好從頭開始構(gòu)建鏡像
- 如果應用程序足夠簡單,以至于根據(jù) CPU 設(shè)置默認進程數(shù)效果很好,不想費心在集群級別手動配置復制,并且運行的容器不會超過一個應用程序
- 或者如果使用Docker Compose進行部署,在單個服務器上運行等
使用 poetry 的 docker image
# 第一階段:將僅用于安裝 Poetry 并從 Poetry 的 pyproject.toml 文件生成帶有項目依賴項的 requirements.txt。 FROM tiangolo/uvicorn-gunicorn:python3.9 as requirements-stage # 將 /tmp 設(shè)置為當前工作目錄;這是我們將生成文件requirements.txt的地方 WORKDIR /tmp # 安裝 poetry RUN pip install poetry # 復制 COPY ./pyproject.toml ./poetry.lock* /tmp/ # 生成 requirements.txt RUN poetry export -f requirements.txt --output requirements.txt --without-hashes # 這是最后階段,在這往后的任何內(nèi)容都將保留在最終容器映像中 FROM python:3.9 # 將當前工作目錄設(shè)置為 /code WORKDIR /code # 復制 requirements.txt;這個文件只存在于前一個 Docker 階段,這就是使用 --from-requirements-stage 復制它的原因 COPY --from=requirements-stage /tmp/requirements.txt /code/requirements.txt # 運行命令 RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt # 復制 COPY ./app /code/app # 運行服務 CMD ["uvicorn", "app.1_快速入門:app", "--host", "0.0.0.0", "--port", "80"]
- 第一階段 Docker 是 Dockerfile 的一部分,它作為一個臨時容器的鏡像是僅用于生成一些文件供后面階段使用
- 使用 Poetry 時,使用Docker 多階段構(gòu)建是有意義的
- 因為實際上并不需要在最終容器鏡像中安裝 Poetry 及其依賴項,只需要生成的requirements.txt 文件來安裝項目依賴項
poetry 詳細教程
https://www.jb51.net/article/195070.htm
到此這篇關(guān)于FastAPI 部署在 Docker的文章就介紹到這了,更多相關(guān)FastAPI 部署在 Docker 內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。