In diesem Abschnitt unseres Blogs widmen wir uns den Pods. Ein Pod kann einen oder mehrere Container umfassen. Die Container innerhalb eines Pods teilen sich gemeinsame Ressourcen wie Netzwerk, Dateisystem und mehr, was die Kommunikation zwischen ihnen erleichtert. Dies ist besonders nützlich für die Entwicklung, da das Zusammenspiel mehrerer Komponenten auf diese Weise einfach getestet werden kann.
Pods für Kubernetes vs. Pods zur Entwicklung
Pods in Podman haben eine enge Verbindung zu Kubernetes, da Podman die gleiche Pod-Architektur verwendet, die Kubernetes in Produktionsumgebungen nutzt. Allerdings gibt es in der Praxis einen entscheidenden Unterschied: In Produktionsumgebungen wird oft empfohlen, pro Pod nur einen Container zu betreiben. Dies erleichtert das Skalieren, da einzelne Container unabhängig voneinander skaliert und verwaltet werden können.
Für die Entwicklung hingegen ist es häufig sinnvoll, mehrere unterschiedliche Container in einem Pod zu betreiben. Dadurch lässt sich das Zusammenspiel der Komponenten, wie beispielsweise ein Webserver und eine Datenbank, innerhalb derselben Netzwerkumgebung einfacher testen. Dies führt zu effizienteren Tests und einer realistischeren Entwicklungsumgebung, ohne den Overhead einer vollen Produktionskonfiguration.
Die Images für die involvierten Container
In diesem Blogbeitrag verknüpfen wir die Beispiele aus den vorherigen Beiträgen zu einem Ganzen. Konkret geht es darum, eine Spring Boot REST API mit einer MSSQL-Datenbank über JPA zu verbinden. Beide Komponenten werden dabei als Container innerhalb eines (Entwicklungs-)Pods ausgeführt und können miteinander kommunizieren.
Die Spring Boot REST-API
Eine aktualisierte Version der Spring Boot REST API ist hier zu finden: Link
Diese enthält in den application.properties bereits die Verbindung zu einer lokalen MSSQL-Datenbank, die auf Port 1433 erwartet wird. Weiters ist die Applikation für Testzwecke so konfiguriert, dass das Datenbankschema und einige Testdaten automatisch beim Hochfahren der Applikation angelegt werden. Dh. mit jedem Neustart werden die Daten wieder zurückgesetzt.
Zusätzlich können in dieser Applikation nicht nur Personen abgefragt, sondern durch einen HTTP Post auf den Endpunkt „/persons“ auch neue Personen angelegt werden.
Zuerst muss in der Commandline in das Root-Verzeichnis (die Ebene mit dem pom.xml) gewechselt werden. Danach wird das Projekt mit Maven gebaut und ein Image mit dem bereits vorhandenem „Containerfile“ erzeugt. Zur Sicherheit werden images mit dem Namen „rest-api“ über das Command „pomdan rmi“ zuvor gelöscht.
mvn clean package<br>podman rmi -f rest-api<br>podman build --build-arg version=1.0.0 -t rest-api .
Code-Sprache: HTML, XML (xml)
Die Datenbank
Das MSSQL-Images, welches wir für den Datenbankcontainer benötigen, können wir direkt aus der zentralen Docker Registry holen. Dazu später mehr.
Erstellen eines Entwicklungspods
Container innerhalb eines Pods teilen sich Netzwerkressourcen, wodurch sie ohne Port-Mapping direkt über ihre Ports miteinander kommunizieren können.
Um jedoch die Spring Boot REST API auch vom Windows-Host aus zugänglich zu machen, werden wir den entsprechenden Port nach außen freigeben.
Im ersten Schritt erstellen wir einen Pod. Wir wissen bereits, dass wir den internen Port 8080 der Spring Boot Applikation für den Windows Host freigeben wollen. Daher mappen wir diesen auf den gleichen Port für Windows.
podman pod create --name devpod -p 8080:8080
Code-Sprache: CSS (css)
Achtung: Nachträglich können Portmappings nicht mehr geändert werden. Hierfür muss der Port neu erstellt werden, wodurch auch darin enthaltene Container gelöscht / neu angelegt werden.
Erzeugen der Container
Im nächsten Schritt werden nun Container der Spring REST-API sowie der Datenbank erzeugt. Wichtig ist hier, dass ihm „create“ oder „run“ command auch der Name des zuvor angelegten Pods (devpod) angegeben wird.
Wichtig ist, dass hier jetzt auf Containerebene kein Portmapping mehr angegeben werden darf, denn das Mapping nach außen erfolgt ausschließlich auf Pod-Ebene.
Es ist hier sinnvoll, wenn wir zuerst den Datenbank-Container starten und erst danach die Applikation, damit sich diese gleich zu einer DB verbinden kann.
Der Datenbank geben wir dieses mal den namen „rest-api-db“:
podman run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=UseAReallyStrongPassword!!!" -e "MSSQL_PID=Express" -d --name "rest-api-db" --pod "devpod" mcr.microsoft.com/mssql/server:2019-latest
Code-Sprache: JavaScript (javascript)
Wir geben der Spring REST-API wieder den Containername „rest-api-container“:
odman run -d --name "rest-api-container" --pod "devpod" localhost/rest-api
Code-Sprache: JavaScript (javascript)
Wir können nun mit Hilfe von curl von unserem Windows Host wieder die laufende Applikation im Container testen:
curl http://localhost:8080/persons
Code-Sprache: JavaScript (javascript)
Wenn dich jetzt Homer Simpson und sein Nachbar Ned Flanders begrüßen, hast du alles richtig gemacht. Diese Daten werden aus der MSSQL-Datenbank gelesen.

Bonus:
Über folgenden Befehl kannst du über einen HTTP Post neue Personen, in unserem Fall Hans Maulwurf hinzufügen:
curl -X POST http://localhost:8080/persons -H "Content-Type: application/json" -d "{\"firstName\":\"Hans\",\"lastName\":\"Maulwurf\"}"
Code-Sprache: JavaScript (javascript)
Beim erneuten Abrufen der Personen, sollte nun auch dieser Teil der liste sein:

Damit kommen wir zum Ende dieses Beitrags. Du hast nun gelernt, wie du Container zu einem Pod hinzufügen kannst. Wie diese untereinander kommunizieren und wie du von außerhalb auf die Applikationen zugreifen kannst.