From 208f15ae91f0900da35d5ee211ec5451cde1309f Mon Sep 17 00:00:00 2001
From: Jan Lauber
Date: Fri, 9 Feb 2024 14:56:29 +0100
Subject: [PATCH] docs: add python connect
Signed-off-by: Jan Lauber
---
assets/08/app/Dockerfile | 6 ++
assets/08/app/app.py | 24 +++++++
assets/08/app/requirements.txt | 2 +
docs/02_images.md | 1 -
docs/04_container_loeschen.md | 2 +-
docs/08_connect_mariadb.md | 123 +++++++++++++++++++++++++++++++++
6 files changed, 156 insertions(+), 2 deletions(-)
create mode 100644 assets/08/app/Dockerfile
create mode 100644 assets/08/app/app.py
create mode 100644 assets/08/app/requirements.txt
create mode 100644 docs/08_connect_mariadb.md
diff --git a/assets/08/app/Dockerfile b/assets/08/app/Dockerfile
new file mode 100644
index 0000000..5581680
--- /dev/null
+++ b/assets/08/app/Dockerfile
@@ -0,0 +1,6 @@
+FROM python:3.12-slim
+WORKDIR /app
+COPY requirements.txt requirements.txt
+RUN pip install -r requirements.txt
+COPY . .
+CMD ["python", "app.py"]
\ No newline at end of file
diff --git a/assets/08/app/app.py b/assets/08/app/app.py
new file mode 100644
index 0000000..97d3191
--- /dev/null
+++ b/assets/08/app/app.py
@@ -0,0 +1,24 @@
+from flask import Flask, jsonify
+import pymysql.cursors
+
+app = Flask(__name__)
+
+def get_db_connection():
+ connection = pymysql.connect(host='mariadb-container',
+ user='root',
+ password='my-secret-pw',
+ database='flaskapp',
+ cursorclass=pymysql.cursors.DictCursor)
+ return connection
+
+@app.route('/')
+def users():
+ connection = get_db_connection()
+ with connection.cursor() as cursor:
+ cursor.execute("SELECT * FROM users")
+ users = cursor.fetchall()
+ connection.close()
+ return jsonify(users)
+
+if __name__ == '__main__':
+ app.run(debug=True, host='0.0.0.0', port=5000)
\ No newline at end of file
diff --git a/assets/08/app/requirements.txt b/assets/08/app/requirements.txt
new file mode 100644
index 0000000..8a4c210
--- /dev/null
+++ b/assets/08/app/requirements.txt
@@ -0,0 +1,2 @@
+Flask==3.0.2
+PyMySQL==1.1.0
\ No newline at end of file
diff --git a/docs/02_images.md b/docs/02_images.md
index e9c19f4..be6e582 100644
--- a/docs/02_images.md
+++ b/docs/02_images.md
@@ -132,7 +132,6 @@ Denke an ein Image wie an einen **Bauplan**, der verwendet wird, um Container zu
Wenn du ein Image ausführst, wird es zu einem Container.
- Ein Image ist ein schreibgeschütztes Dateisystem
- Ein Container ist ein eingekapselter Satz von Prozessen, der in einer schreibbaren Kopie dieses Dateisystems läuft
-- Um die Startzeit des Containers zu optimieren, wird statt einer regulären Kopie die Technik des "Copy-on-Write" verwendet
- `docker run` startet einen Container aus einem gegebenen Image
diff --git a/docs/04_container_loeschen.md b/docs/04_container_loeschen.md
index b6356c1..8c1bf80 100644
--- a/docs/04_container_loeschen.md
+++ b/docs/04_container_loeschen.md
@@ -39,7 +39,7 @@ CONTAINER ID IMAGE COMMAND CREATED STATUS
26f164a65285 mariadb "docker-entrypoint.s…" 9 minutes ago Exited (0) 2 minutes ago focused_noether
```
-Wir haben somit den conteiner "gracefully" gestoppt, aber es gibt auch die Möglichkeit, einen Container "forcefully" zu stoppen. Dazu gibst du den folgenden Befehl ein:
+Wir haben somit den container "gracefully" gestoppt, aber es gibt auch die Möglichkeit, einen Container "forcefully" zu stoppen. Dazu gibst du den folgenden Befehl ein:
```bash
docker kill focused_noether
diff --git a/docs/08_connect_mariadb.md b/docs/08_connect_mariadb.md
new file mode 100644
index 0000000..7af3609
--- /dev/null
+++ b/docs/08_connect_mariadb.md
@@ -0,0 +1,123 @@
+---
+title: 8. MariaDB-Container verbinden
+sidebar_position: 9
+---
+
+In diesem Lab erweitern wir unsere Python-Webanwendung, sodass sie auf eine MariaDB-Instanz zugreifen und Daten lesen kann. Dies ermöglicht es uns, dynamische Inhalte in unserer Flask-App anzuzeigen, die aus der Datenbank abgerufen werden.
+
+## Vorbereitung der MariaDB-Instanz
+
+Bevor wir unsere Flask-Anwendung erweitern, müssen wir sicherstellen, dass unser MariaDB-Container läuft und mit Daten gefüllt ist, die wir abfragen können.
+
+### Überprüfung, ob der MariaDB-Container läuft
+
+Lösche den alten MariaDB-Container, falls er noch läuft:
+
+```bash
+docker ps
+docker stop
+docker rm
+```
+
+Starte ihn erneut:
+
+```bash
+docker run --name mariadb-container \
+ -v volume-mariadb:/var/lib/mysql \
+ -e MARIADB_ROOT_PASSWORD=my-secret-pw \
+ -d mariadb
+```
+
+### Befüllen der MariaDB mit Mock-Daten
+
+Verbinde dich mit der MariaDB-Instanz:
+
+```bash
+docker exec -it mariadb-container mariadb -uroot -pmy-secret-pw
+```
+
+Erstelle eine einfache Tabelle und füge einige Mock-Daten ein:
+
+```sql
+CREATE DATABASE flaskapp;
+USE flaskapp;
+CREATE TABLE users (
+ id INT AUTO_INCREMENT PRIMARY KEY,
+ name VARCHAR(255) NOT NULL,
+ email VARCHAR(255) NOT NULL
+);
+INSERT INTO users (name, email) VALUES ('John Doe', 'john.doe@example.com'), ('Jane Doe', 'jane.doe@example.com');
+```
+
+Verlasse die MariaDB-Shell mit:
+
+```bash
+exit;
+```
+
+## Erweiterung der Flask-Anwendung
+
+Um die Flask-Anwendung zu erweitern, damit sie auf die MariaDB-Instanz zugreifen kann, benötigen wir einen MySQL-Treiber für Python. Wir werden `PyMySQL` verwenden.
+
+### Aktualisierung der `requirements.txt`
+
+Füge `PyMySQL` zur `requirements.txt` hinzu:
+
+```
+Flask==3.0.2
+PyMySQL==1.1.0
+```
+
+### Aktualisierung der Flask-Anwendung
+
+Aktualisiere die `app.py`, um eine Verbindung zur MariaDB herzustellen und Daten aus der `users`-Tabelle zu lesen:
+
+```python
+from flask import Flask, jsonify
+import pymysql.cursors
+
+app = Flask(__name__)
+
+def get_db_connection():
+ connection = pymysql.connect(host='mariadb-container',
+ user='root',
+ password='my-secret-pw',
+ database='flaskapp',
+ cursorclass=pymysql.cursors.DictCursor)
+ return connection
+
+@app.route('/')
+def users():
+ connection = get_db_connection()
+ with connection.cursor() as cursor:
+ cursor.execute("SELECT * FROM users")
+ users = cursor.fetchall()
+ connection.close()
+ return jsonify(users)
+
+if __name__ == '__main__':
+ app.run(debug=True, host='0.0.0.0', port=5000)
+```
+
+### Neubau und Neustart des Flask-Containers
+
+Baue das Docker-Image für die Anwendung erneut, um die Änderungen zu übernehmen:
+
+```bash
+docker build -t python-flask-app .
+```
+
+Stoppe und entferne den alten Flask-Container, falls er noch läuft:
+
+```bash
+docker stop python-webapp
+docker rm python-webapp
+```
+
+Starte den Flask-Container erneut:
+
+```bash
+docker run -d -p 5000:5000 --name python-webapp --link mariadb-container:mariadb-container python-flask-app
+```
+
+Nun kannst du auf zugreifen, um die Daten aus der MariaDB-Instanz in deiner Flask-Anwendung angezeigt zu bekommen.