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.