Detaillierter Prozess der FastAPI-Bereitstellung auf Docker

Detaillierter Prozess der FastAPI-Bereitstellung auf Docker

Docker-Lernen

https://www.cnblogs.com/poloyy/p/15257059.html

Projektstruktur

.
├── App
│ ├── __init__.py
│ └── main.py
├── Docker-Datei
└── Anforderungen.txt

Main.py-Code der FastAPI-Anwendung

von der Eingabe von import Optional

von fastapi importiere FastAPI

app = FastAPI()

@app.get("/")
auf Grund von read_root():
    return {"Hallo": "Welt"}

@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = Keine):
    zurück {"item_id": item_id, "q": q}

Docker-Datei

# 1. Beginnen Sie mit dem offiziellen Python-Basisimage FROM python:3.9

# 2. Stellen Sie das aktuelle Arbeitsverzeichnis auf /code ein
# Hier legen Sie Ihre Datei requirements.txt und Ihr Anwendungsverzeichnis WORKDIR /code ab.

# 3. Kopieren Sie zuerst die Datei requirements.txt. # Da sich diese Datei nicht oft ändert, erkennt Docker sie und verwendet den Cache in diesem Schritt und aktiviert den Cache auch für den nächsten Schritt. KOPIEREN ./requirements.txt /code/requirements.txt

# 4. Führen Sie den Pip-Befehl aus, um Abhängigkeiten zu installieren. RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt

# 5. Kopieren Sie den FastAPI-Projektcode COPY ./app /code/app

# 6. Führen Sie den Dienst CMD aus ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]

Schritt 4: Führen Sie die Pip-Befehlsanalyse aus

Führen Sie den Befehl „pip install --no-cache-dir --upgrade -r /code/requirements.txt“ aus.

  • Die Option --no-cache-dir weist pip an, die heruntergeladenen Pakete nicht lokal zu speichern, da dies nur erforderlich ist, wenn pip erneut ausgeführt wird, um dasselbe Paket zu installieren. Dies ist jedoch bei der Verwendung von Containern nicht der Fall.
  • --no-cache-dir ist nur für Pip relevant, nicht für Docker oder Container.
  • Die Option --upgrade weist pip an, ein bereits installiertes Paket zu aktualisieren.
  • Da die im vorherigen Schritt kopierten Dateien möglicherweise vom Docker-Cache erkannt werden, wird dieser Schritt auch verwendet, wenn der Docker-Cache verfügbar ist.
  • Die Verwendung eines Caches in diesem Schritt spart viel Zeit, wenn das Image während der Entwicklung immer wieder neu erstellt wird, anstatt jedes Mal alle Abhängigkeiten herunterzuladen und zu installieren.

Docker Cache

Hier gibt es einen wichtigen Trick Dockerfile, kopieren Sie zuerst nur die Dateien der Abhängigkeiten, nicht den FastAPI-Anwendungscode

 ./Anforderungen.txt /code/Anforderungen.txt
  • Docker und andere Tools erstellen diese Container-Images schrittweise, indem sie eine Ebene über der anderen hinzufügen.
  • Beginnend am Anfang des Dockerfiles (der ersten Zeile) erstellt jede Anweisung im Dockerfile eine beliebige Datei
  • Docker und andere Tools verwenden beim Erstellen von Images auch interne Caches.
  • Wenn sich die Datei seit der letzten Erstellung des Container-Images nicht geändert hat, wird dieselbe Ebene wiederverwendet, die beim letzten Mal erstellt wurde, anstatt die Datei erneut zu kopieren und eine neue Ebene von Grund auf neu zu erstellen.
  • Das bloße Vermeiden des Dateikopiervorgangs verbessert die Situation nicht unbedingt wesentlich, aber da in diesem Schritt der Cache verwendet wird, kann er im nächsten Schritt verwendet werden.
  • Beispielsweise kann der Cache für Anweisungen zur Installation von Abhängigkeiten verwendet werden.

Führen Sie den Befehl „pip install --no-cache-dir --upgrade -r /code/requirements.txt“ aus.

  • requirements.txt ändert sich nicht oft. Durch das Kopieren der Datei kann Docker daher den Cache für diesen Schritt verwenden.
  • Docker kann den Cache verwenden, um diese Abhängigkeiten als nächstes herunterzuladen und zu installieren, und hier wird viel Zeit gespart
  • Das Herunterladen und Installieren der Paketabhängigkeiten kann mehrere Minuten dauern, bei Verwendung des Caches dauert es jedoch nur Sekunden.
  • Da Container-Images während des Entwicklungsprozesses immer wieder neu erstellt werden, um zu prüfen, ob die Code-Änderungen gültig sind, kann viel kumulierte Zeit gespart werden

./App /code/App

  • Kopieren Sie am Ende des Dockerfiles den FastAPI-Anwendungscode
  • Da sich dieser am häufigsten ändert, sollten Sie ihn ans Ende setzen. Alles, was nach diesem Schritt erfolgt, kann den Cache nicht mehr verwenden.

Docker-Image erstellen

Öffnen Sie die Befehlszeile im Dockerfile

docker build -t meinimage.

Spiegel anzeigen

Docker-Bilder

Starten Sie den Docker-Container

docker run -d --name meinContainer -p 80:80 meinImage

Container anzeigen

Docker PS

Besuchen Sie 127.0.0.1/

Besuchen Sie 127.0.0.1/docs

Offizielles Docker-Image mit Gunicorn - Uvicorn

  • Dieses Image enthält einen automatischen Anpassungsmechanismus, um die Anzahl der Arbeitsprozesse basierend auf den verfügbaren CPU-Kernen festzulegen
  • Es verfügt über sinnvolle Standardeinstellungen, aber die gesamte Konfiguration kann weiterhin mithilfe von Umgebungsvariablen oder Konfigurationsdateien aktualisiert werden
  • Die Anzahl der Prozesse auf diesem Image wird automatisch auf Basis der verfügbaren CPU-Kerne berechnet und es wird versucht, so viel Leistung wie möglich aus der CPU herauszuholen.
  • Dies bedeutet aber auch, dass die Anzahl der Prozesse von der CPU abhängt, auf der der Container ausgeführt wird. Daher hängt auch die Menge des verbrauchten Speichers von dieser ab.
  • Wenn Ihre Anwendung also viel Speicher verbraucht (beispielsweise bei der Verwendung eines Modells für maschinelles Lernen) und Ihr Server über viele CPU-Kerne, aber wenig Speicher verfügt, kann es sein, dass der Container am Ende mehr Speicher nutzt als verfügbar ist, was die Leistung erheblich beeinträchtigen (oder sogar zum Absturz führen) kann.

Offizielle Kastanie

VON tiangolo/uvicorn-gunicorn-fastapi:python3.9
KOPIEREN ./requirements.txt /app/requirements.txt
Führen Sie den Befehl „pip install --no-cache-dir --upgrade -r /app/requirements.txt“ aus.
KOPIEREN ./app /app

Anwendungsszenario

  1. Wenn Sie Kubernetes verwenden und eine Replikation auf Clusterebene eingerichtet haben, sollten Sie dieses Image nicht verwenden und das Image besser von Grund auf neu erstellen.
  2. Wenn Ihre Anwendung so einfach ist, dass das Festlegen der Standardanzahl von Prozessen basierend auf der CPU gut funktioniert, Sie sich nicht mit der manuellen Konfiguration der Replikation auf Clusterebene herumschlagen möchten und nicht mehr als einen Container für Ihre Anwendung ausführen möchten
  3. oder bei Bereitstellung mit Docker Compose, Ausführung auf einem einzelnen Server usw.

Verwenden des Docker-Image von Poetry

# Phase 1: Wird nur verwendet, um Poetry zu installieren und requirements.txt mit Projektabhängigkeiten aus der pyproject.toml-Datei von Poetry zu generieren.
VON tiangolo/uvicorn-gunicorn:python3.9 als Anforderungsphase

# Legen Sie /tmp als aktuelles Arbeitsverzeichnis fest. Hier generieren wir die Datei requirements.txt WORKDIR /tmp

# Poesie installieren
Führen Sie „pip install poetry“ aus.

# KOPIEREN ./pyproject.toml ./poetry.lock* /tmp/

# Anforderungen.txt generieren
Führen Sie den Befehl poetry export -f requirements.txt --output requirements.txt --without-hashes aus.

# Dies ist die letzte Phase. Alles, was danach kommt, bleibt im endgültigen Container-Image von Python:3.9.

# Stellen Sie das aktuelle Arbeitsverzeichnis auf /code ein
ARBEITSVERZEICHNIS /code

# Kopieren Sie requirements.txt. Diese Datei existiert nur in der vorherigen Docker-Phase. Daher wird --from-requirements-stage zum Kopieren verwendet. COPY --from=requirements-stage /tmp/requirements.txt /code/requirements.txt

# Führen Sie den Befehl RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt aus

# KOPIEREN ./app /code/app

# Dienst CMD ausführen ["uvicorn", "app.1_Quick Start:app", "--host", "0.0.0.0", "--port", "80"]
  • Der Docker der ersten Phase ist Teil des Dockerfile. Es handelt sich um ein temporäres Container-Image, das nur zum Generieren einiger Dateien für die Verwendung in den späteren Phasen verwendet wird.
  • Bei der Verwendung von Poetry ist es sinnvoll, Docker-Multistage-Builds zu verwenden
  • Da Sie Poetry und seine Abhängigkeiten im endgültigen Container-Image nicht wirklich installieren müssen, benötigen Sie nur die generierte Datei requirements.txt, um die Projektabhängigkeiten zu installieren.

ausführliches Tutorial zu Poesie

https://www.jb51.net/article/195070.htm

Dies ist das Ende dieses Artikels über FastAPI, das in Docker bereitgestellt wird. Weitere verwandte Inhalte zu FastAPI, das in Docker bereitgestellt wird, finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder durchsuchen Sie die folgenden verwandten Artikel weiter. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Detaillierter Prozess der Installation und Bereitstellung von OnlyOffice in Docker
  • Confluence mit Docker bereitstellen
  • So verwenden Sie Docker zum Bereitstellen von Spring Boot und zum Herstellen einer Verbindung mit Skywalking

<<:  Detaillierte Erklärung zur Verwendung von css-vars-ponyfill in der IE-Umgebung (nextjs-Build)

>>:  Detaillierte Erläuterung der Implementierung des MySQL-Autoinkrements des Primärschlüssels

Artikel empfehlen

Reacts Methode zur Realisierung einer sekundären Verknüpfung

In diesem Artikel wird der spezifische Code von R...

Detaillierte Schritte zum Herunterladen und Installieren von Tomcat unter Linux

Wenn Sie gerade erst mit Linux in Berührung gekom...

JavaScript implementiert kreisförmigen Fortschrittsbalkeneffekt

In diesem Artikelbeispiel wird der spezifische Ja...

So verwenden Sie Lottie-Animationen in React Native-Projekten

Lottie ist eine von Airbnb entwickelte Open-Sourc...

So verwenden Sie Nginx zum Proxy mehrerer Anwendungssites in Docker

Vorwort Was ist die Rolle eines Agenten? - Mehrer...

So erstellen Sie ein Django-Projekt und stellen eine Verbindung zu MySQL her

1: django-admin.py startproject Projektname 2: CD...

Vue3 Vue CLI-Konfiguration für mehrere Umgebungen

Inhaltsverzeichnis 1. Einleitung 2. Umschalten 1....

MySQL-Datenbankterminal – allgemeine Befehlscodes für Vorgänge

Inhaltsverzeichnis 1. Benutzer hinzufügen 2. Ände...

Detaillierte Beschreibung allgemeiner Ereignisse und Methoden von HTML-Text

Veranstaltungsbeschreibung onactivate: Wird ausgel...