Zugriff auf eine Webanwendung in einem Docker-Container

DockerDockerBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Dieses Tutorial führt Sie durch den Prozess des Zugriffs auf eine Webanwendung, die in einem Docker-Container läuft. Sie lernen die Grundlagen von Docker-Containern kennen, stellen eine einfache Webanwendung bereit und erfahren, wie Sie von Ihrem Host-Rechner aus darauf zugreifen können. Dieses Wissen ist unerlässlich für die Entwicklung und das Testen von Webanwendungen mit Docker.

Docker verstehen und einen Test-Container ausführen

Docker ist eine Plattform, die Containerisierung verwendet, um Anwendungen und ihre Abhängigkeiten zusammenzupacken. Dies ermöglicht es Anwendungen, konsistent in verschiedenen Umgebungen zu laufen.

Überprüfen der Docker-Installation

Zuerst wollen wir prüfen, ob Docker korrekt auf Ihrem System installiert ist:

docker --version

Sie sollten eine Ausgabe ähnlich dieser sehen, die die Docker-Version anzeigt:

Docker version 20.10.21, build baeda1f

Docker Images und Container verstehen

In der Docker-Terminologie:

  • Ein Docker Image ist eine Vorlage, die den Anwendungscode, Bibliotheken und Abhängigkeiten enthält.
  • Ein Docker Container ist eine laufende Instanz eines Images.

Stellen Sie sich ein Docker Image als Bauplan und einen Docker Container als Gebäude vor, das nach diesem Bauplan erstellt wurde.

Ihren ersten Docker Container ausführen

Lassen Sie uns einen einfachen Container ausführen, um zu überprüfen, ob Docker korrekt funktioniert:

docker run hello-world

Sie sollten eine Ausgabe wie diese sehen:

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.
...

Dies bestätigt, dass Docker korrekt auf Ihrem System funktioniert.

Grundlegende Docker-Befehle

Hier sind einige wichtige Docker-Befehle, die Sie kennen sollten:

  1. Um alle laufenden Container aufzulisten:
docker ps
  1. Um alle Container aufzulisten (einschließlich der gestoppten):
docker ps -a
  1. Um alle Docker Images auf Ihrem System aufzulisten:
docker images

Probieren Sie diese Befehle aus und beobachten Sie die Ausgaben. Nach dem Ausführen des hello-world Containers sollten Sie ihn sehen, wenn Sie docker ps -a ausführen (aber nicht in docker ps, da er sofort nach der Anzeige der Nachricht beendet wird).

Erstellen einer einfachen Webanwendung

In diesem Schritt erstellen wir eine einfache Webanwendung mit Python und Flask, die wir in einem Docker-Container bereitstellen können.

Einrichten der Anwendungsdateien

Zuerst erstellen wir ein neues Verzeichnis für unsere Webanwendung:

mkdir -p ~/project/my-web-app
cd ~/project/my-web-app

Nun erstellen wir eine einfache Flask-Anwendung. Erstellen Sie eine Datei namens app.py mit dem Nano-Editor:

nano app.py

Fügen Sie den folgenden Python-Code in die Datei ein:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return "<h1>Hello from Docker!</h1><p>This is a simple web application running in a Docker container.</p>"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Drücken Sie Ctrl+O gefolgt von Enter, um die Datei zu speichern, und dann Ctrl+X, um Nano zu verlassen.

Als Nächstes erstellen Sie eine requirements.txt-Datei, um die Abhängigkeiten unserer Anwendung anzugeben:

nano requirements.txt

Fügen Sie die folgende Zeile in die Datei ein:

flask==2.0.1

Drücken Sie Ctrl+O gefolgt von Enter, um die Datei zu speichern, und dann Ctrl+X, um Nano zu verlassen.

Erstellen eines Dockerfile

Nun erstellen wir ein Dockerfile, um zu definieren, wie unsere Anwendung containerisiert werden soll:

nano Dockerfile

Fügen Sie den folgenden Inhalt in die Datei ein:

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]

Dieses Dockerfile macht Folgendes:

  1. Verwendet ein schlankes Python 3.9 Image als Basis.
  2. Setzt das Arbeitsverzeichnis auf /app.
  3. Kopiert die Requirements-Datei und installiert Abhängigkeiten.
  4. Kopiert den Anwendungscode.
  5. Exponiert Port 5000 für eingehende Verbindungen.
  6. Gibt den Befehl an, der beim Start des Containers ausgeführt werden soll.

Drücken Sie Ctrl+O gefolgt von Enter, um die Datei zu speichern, und dann Ctrl+X, um Nano zu verlassen.

Erstellen des Docker-Images

Nun erstellen wir ein Docker-Image aus unserem Dockerfile:

docker build -t my-flask-app .

Das Flag -t taggt unser Image mit dem Namen my-flask-app. Der . am Ende gibt an, dass sich das Dockerfile im aktuellen Verzeichnis befindet.

Sie sollten eine Ausgabe ähnlich dieser sehen:

Sending build context to Docker daemon  x.xxxkB
Step 1/6 : FROM python:3.9-slim
 ---> xxxxxxxxxx
Step 2/6 : WORKDIR /app
 ---> Using cache
 ---> xxxxxxxxxx
...
Successfully built xxxxxxxxxx
Successfully tagged my-flask-app:latest

Überprüfen Sie nun, ob Ihr Image erstellt wurde:

docker images | grep my-flask-app

Sie sollten Ihr neu erstelltes Image in der Liste sehen.

Ausführen der Webanwendung in einem Docker-Container

Nachdem wir unser Docker-Image erstellt haben, lassen Sie es uns als Container ausführen und auf die Webanwendung zugreifen.

Ausführen des Containers

Um den Container auszuführen und den Port zuzuordnen, damit wir auf die Webanwendung zugreifen können, verwenden Sie den folgenden Befehl:

docker run -d -p 5000:5000 --name my-web-container my-flask-app

Dieser Befehl bewirkt Folgendes:

  • -d: Führt den Container im Detached-Modus (im Hintergrund) aus.
  • -p 5000:5000: Ordnet Port 5000 vom Container Port 5000 auf dem Host zu.
  • --name my-web-container: Weist dem Container einen Namen zu.
  • my-flask-app: Gibt das zu verwendende Image an.

Überprüfen, ob der Container ausgeführt wird

Überprüfen wir, ob unser Container läuft:

docker ps

Sie sollten eine Ausgabe ähnlich dieser sehen:

CONTAINER ID   IMAGE          COMMAND           CREATED          STATUS          PORTS                    NAMES
xxxxxxxxxxxx   my-flask-app   "python app.py"   xx seconds ago   Up xx seconds   0.0.0.0:5000->5000/tcp   my-web-container

Zugriff auf die Webanwendung

Nun können Sie auf die Webanwendung auf zwei Arten zugreifen:

  1. Verwenden von curl über die Befehlszeile:
curl http://localhost:5000

Sie sollten die HTML-Antwort sehen:

<h1>Hello from Docker!</h1><p>This is a simple web application running in a Docker container.</p>
  1. Verwenden eines Webbrowsers:
    • Klicken Sie auf das Webbrowser-Symbol in der Desktop-Umgebung.
    • Geben Sie http://localhost:5000 in die Adressleiste ein.
    • Sie sollten "Hello from Docker!" gefolgt vom Beschreibungstext sehen.

Port-Mapping verstehen

Wenn wir einen Container mit -p 5000:5000 ausführen, erstellen wir eine Zuordnung zwischen:

  • Dem Host-Port (erste Zahl): 5000
  • Dem Container-Port (zweite Zahl): 5000

Dies bedeutet, dass jeglicher Datenverkehr, der an Port 5000 auf dem Host-Rechner gesendet wird, an Port 5000 innerhalb des Containers weitergeleitet wird.

Wir könnten auch verschiedene Portnummern verwenden. Zum Beispiel würde -p 8080:5000 den Host-Port 8080 dem Container-Port 5000 zuordnen, sodass Sie auf die Anwendung unter http://localhost:8080 zugreifen können.

Container-Logs untersuchen

Wenn Sie die Logs vom Container sehen müssen (was beim Debuggen hilfreich sein kann), verwenden Sie:

docker logs my-web-container

Sie sollten die Startmeldungen der Flask-Anwendung sehen.

Stoppen und Entfernen des Containers

Um den Container zu stoppen, verwenden Sie:

docker stop my-web-container

Um den gestoppten Container zu entfernen, verwenden Sie:

docker rm my-web-container

Sie können einen Container auch mit einem einzigen Befehl stoppen und entfernen:

docker rm -f my-web-container

Dies ist nützlich während der Entwicklung, wenn Sie Ihren Container schnell neu erstellen und erneut ausführen möchten.

Erweitertes Docker-Container-Management

Nachdem Sie Ihre Webanwendung erfolgreich in einem Docker-Container ausgeführt haben, wollen wir einige zusätzliche Funktionen und Techniken zur Verwaltung von Docker-Containern untersuchen.

Ausführen mehrerer Instanzen

Sie können mehrere Instanzen Ihrer Webanwendung auf verschiedenen Ports ausführen. Dies ist nützlich zum Testen oder zum gleichzeitigen Ausführen verschiedener Versionen Ihrer App.

Zuerst stoppen und entfernen wir unseren vorherigen Container:

docker rm -f my-web-container

Nun lassen Sie uns zwei Instanzen unserer Webanwendung auf verschiedenen Ports ausführen:

docker run -d -p 5000:5000 --name web-app-1 my-flask-app
docker run -d -p 5001:5000 --name web-app-2 my-flask-app

Überprüfen Sie, ob beide Container ausgeführt werden:

docker ps

Sie sollten zwei laufende Container sehen:

CONTAINER ID   IMAGE          COMMAND           CREATED          STATUS          PORTS                    NAMES
xxxxxxxxxxxx   my-flask-app   "python app.py"   xx seconds ago   Up xx seconds   0.0.0.0:5001->5000/tcp   web-app-2
xxxxxxxxxxxx   my-flask-app   "python app.py"   xx seconds ago   Up xx seconds   0.0.0.0:5000->5000/tcp   web-app-1

Jetzt können Sie auf dieselbe Anwendung über zwei verschiedene Ports zugreifen:

  • http://localhost:5000
  • http://localhost:5001

Container-Ressourcenbeschränkungen

Docker ermöglicht es Ihnen, Ressourcenbeschränkungen für Ihre Container festzulegen. Dies ist nützlich, um zu verhindern, dass ein Container zu viele Systemressourcen verbraucht.

Lassen Sie uns unsere vorherigen Container stoppen und entfernen:

docker rm -f web-app-1 web-app-2

Nun lassen Sie uns einen Container mit Speicher- und CPU-Beschränkungen ausführen:

docker run -d -p 5000:5000 --name limited-container --memory=512m --cpus=0.5 my-flask-app

Dieser Befehl erstellt einen Container mit:

  • Maximal 512 MB Speicher
  • Maximal 0,5 CPU-Kerne

Überprüfen Sie, ob der Container ausgeführt wird:

docker ps

Container-Umgebungsvariablen

Umgebungsvariablen sind eine gängige Methode, um Anwendungen in Docker-Containern zu konfigurieren. Ändern wir unsere Flask-Anwendung, um eine Umgebungsvariable zu verwenden:

docker rm -f limited-container

Erstellen Sie eine neue Version der Datei app.py:

cd ~/project/my-web-app
nano app_env.py

Fügen Sie den folgenden Code hinzu:

import os
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    app_name = os.environ.get('APP_NAME', 'Default App')
    return f"<h1>Hello from {app_name}!</h1><p>This is a simple web application running in a Docker container.</p>"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

Drücken Sie Ctrl+O gefolgt von Enter, um die Datei zu speichern, und dann Ctrl+X, um Nano zu verlassen.

Erstellen Sie ein neues Dockerfile:

nano Dockerfile-env

Fügen Sie den folgenden Inhalt hinzu:

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app_env.py ./app.py
EXPOSE 5000
CMD ["python", "app.py"]

Drücken Sie Ctrl+O gefolgt von Enter, um die Datei zu speichern, und dann Ctrl+X, um Nano zu verlassen.

Erstellen Sie ein neues Image:

docker build -t my-flask-app-env -f Dockerfile-env .

Führen Sie nun den Container mit einer Umgebungsvariablen aus:

docker run -d -p 5000:5000 --name env-container -e APP_NAME="Customized App" my-flask-app-env

Greifen Sie auf die Webanwendung zu:

curl http://localhost:5000

Sie sollten sehen:

<h1>Hello from Customized App!</h1><p>This is a simple web application running in a Docker container.</p>

Dies zeigt, wie Sie Konfigurationen mithilfe von Umgebungsvariablen an Ihre containerisierten Anwendungen übergeben können.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie auf eine Webanwendung zugreifen, die in einem Docker-Container ausgeführt wird. Sie haben eine einfache Flask-Webanwendung erstellt, diese mit Docker containerisiert und über Port-Mapping von Ihrem Host-Rechner aus darauf zugegriffen.

Wichtige behandelte Konzepte:

  • Verständnis von Docker-Images und -Containern
  • Erstellen einer einfachen Webanwendung mit Flask
  • Erstellen eines Docker-Images mit einem Dockerfile
  • Ausführen und Zugreifen auf eine containerisierte Webanwendung
  • Verwalten von Docker-Containern mit verschiedenen Befehlen
  • Ausführen mehrerer Container-Instanzen auf verschiedenen Ports
  • Festlegen von Ressourcenbeschränkungen für Container
  • Verwenden von Umgebungsvariablen für die Container-Konfiguration

Diese Fähigkeiten bieten eine solide Grundlage für die Arbeit mit containerisierten Anwendungen und helfen Ihnen, Webanwendungen effizient mit Docker bereitzustellen und zu testen.