Todo Mysql Segmentiert
Die Dateien zur Aufgabe befinden sich im Übungsrepository.
Python Todos mit MySQL-Datenbank und Admin Segmentiert
Eine TodoApp API in Python mit UI in React soll mit docker-compose so gebaut und gestartet werden, dass die Datenbank durch Netzwerksegmentierung von aussen abgeschirmt ist.
Struktur
.
├── nginx/
├──── nginx.conf
├── solution/ <- erst zur Prüfung anschauen!
├── todo-api/
├──── Dockerfile
├── todo-ui/
├──── Dockerfile
└── README.md
Aufgabe:
Erstelle eine Docker Compose Datei, welche die folgenden Netzwerke, Volumen und
fünf Services todo-api, todo-ui, nginx, phpmyadmin sowie db definiert.
Die Applikation soll mit docker compose up -d gestartet und mit
docker compose down wieder gestoppt werden.
Netzwerke
Es existieren folgende Netzwerke, diese müssen im docker-compose.yml definiert
werden:
- extern
- intern
Volumen
Für die Datenbank sollte folgendes Volumen im docker-compose.yml definiert werden:
- dbdaten
nginx
Als Proxy zur todo-api, todo-ui und zum phpmyadmin. Nginx erlaubt es mit
folgenden Pfade via gleicher domain:port auf die einzelnen Services zu gelangen:
- / ->
todo-ui - /todos ->
todo-api - /admin ->
phpmyadmin- es benötigt ein rewrite
Die Konfiguration befindet sich in der Datei ./nginx/nginx.conf und sollte
ohne anpassung funktionieren.
Konfiguration:
- Service name (hostname):
nginx - Image: nginx:1.30.2
- Bind Mount: Konfigurationsdatei
./nginx/nginx.confmuss auf dem Pfad/etc/nginx/nginx.confgemountet werden. - Interner Port: 8080
- Externer Port: 8080
- Als einziger exposed!
- Netzwerk: extern
- Abhängigkeiten: todo-api, todo-ui, phpmyadmin
todo-ui
Eine Single-Page Javascript-Applikation welche im Browser die todo-api
konsumiert und ein User-Interface dazu bereitstellt. Sie verwendet die Library
React.
Konfiguration:
- Service name (hostname):
todo-ui - Image: Dockerfile im Unterordner ./todo-ui/
- Interner Port: 3000
- Netzwerke: extern
- Abhängigkeit:
todo-api
Die App erwartet die API under demselben Domain im Pfad /todos.
todo-api
Die Todo Api definiert eine HTTP-REST-Schnittstelle um in der Datenbank Todos anzulegen und zu modifizieren. Sie ist in Python geschrieben und verwendet das Framework Fast-API.
Konfiguration:
-
Service name (hostname):
todo-api -
Image: Dockerfile im Unterordner ./todo-api/
-
Interner Port: 8000
-
Netzwerke: extern, intern
-
Abhängigkeit:
db, wenn service_healthydepends_on:
db:
condition: service_healthy
restart: true -
Environment
DATABASE_URL=mysql+pymysql://root:password@db:3306/tododb- Optional: Environment Variable in einer Datei
.env.secretdefinieren und mitenv_fileladen.
db
Die Mysql-Datenbank wird von der todo-api verwendet um die todos zu speichern.
Die todo-api erstellt automatisch auf die Tabelle und das Schema.
Konfiguration:
- Service name (hostname):
db - Image: mysql:8.4.0
- Interner Port: 3306
- Netzwerke: intern
- Healthcheck: Dieser ist wichtig, da die Datenbank zwingend vor der
todo-apigestartet werden muss. Es handelt sich um einenpingder sicher stellt dass die Datenbank verfügbar ist.healthcheck:
test:
[
"CMD",
"mysqladmin",
"ping",
"-h",
"localhost",
"-p${MYSQL_ROOT_PASSWORD}",
]
interval: 1s
timeout: 5s
retries: 20 - Volumen:
dbdatennach/var/lib/mysql - Environment:
MYSQL_ROOT_PASSWORD=passwordMYSQL_DATABASE=tododb- Optional: Environment Variable in einer Datei
.env.secretdefinieren und mitenv_fileladen.
phpmyadmin
Administrationsapp für die Datenbank. Generell eine super App mit einem Gui zur Verwaltung einer Mysql-Datenbank.
Achtung: Produktiv sollte diese NIE! Im Internet verfügbar gemacht werden. Diese sollte man nur über das Intranet erreichen können.
Konfiguration:
- Service name (hostname):
phpmyadmin - Image: phpmyadmin:5-apache
- Interner Port: 80
- Netzwerke: intern, extern
- Environment:
PMA_ARBITRARY=1
- Abhängigkeit: db
- Die db muss noch nicht gestartet sein. Es muss also nicht gewartet werden.
Starte dann die Applikation mit docker-compose up und überprüfe sie.