Immer wieder hört man von Docker im Zusammenhang mit dem Thema Microservices. Dies wollen wir uns in diesem Artikel einmal genauer anschauen.
Dafür werden wir als erstes klären, was genau Microservices sind. Anschließend erstellen wir einen Docker Container mit einem Redis Script in Python. Danach starten wir einen Redis Container und erstellen beim Starten unserer Python App einen Link zu diesen Container. Als letztes werden wir dann sehen, dass der Zugriff vom Python Container auf den Redis Container funktioniert.
Inhaltsverzeichnis
Was sind Microservices
Im wesentlichen versteht man unter Microservices die Modularisierung von Software. Hierbei gibt es diverse Ansätze wie zum Beispiel eine Modularisierung nach Klasse oder Packages.
Eine wesentlicher Bestandteil von Microservices ist hierbei, dass unabhängige Deployment der einzelnen Komponenten. So können einzelne Microservices ausgetauscht werden, ohne das alle Bestandteile der Applikation angefasst werden müssen.
Diese Modularisierung lässt sich sehr gut mit Docker Containern realisieren. Dabei bilden dann mehrere Docker Container am Ende eine Applikation. Für die Kommunikation zwischen den einzelnen Container kann entweder eine REST Schnittstelle oder ein Set von URLs verwendet werden.
Neben dem Vorteil des Unabhängigen Deployments hat die Realisierung von Microservices mit Docker noch ein paar weitere Konsequenzen:
- jeder Microservice kann in einer anderen Programmiersprache realisiert werden
- innerhalb eines Docker Containers kann fast jede Infrastruktur laufen
- die Microservices können einzeln skaliert werden.
- Steigerung der Robustheit, da sich Ressourcenprobleme nur auf den Microservice auswirken
Erstellen eines Apache Redis Python Scripts
Zum Testen, dass der Python Container auf den Redis Container zugreift, verwenden wir ein kleines Test Script. Dafür legen wir uns einen Ordner Microservices an. In diesem erstellen wir wiederum einen Ordner app. Im app Ordner erstellen wir einen Datei app.py mit dem folgenden Inhalt.
1 2 3 4 5 6 7 | import redis client = redis.StrictRedis(host='redis', port=6379, db=0) client.set('foo', 'bar') value = client.get('foo') print(value) |
Beim Erstellen des Redis Client im Code, geben wir als Adresse den Namen redis ein. Auf diesen Namen werden wir dann den Redis Docker Container linken.
Nun müssen wir noch ein Dockerfile erstellen um den Python Container zu bauen. Dafür legen wir eine Datei mit dem Namen Dockerfile direkt im microservices Container an. Der Inhalt des Dockerfiles sieht sehr ähnlich aus, wie im Artikel Python Flask App mit Docker deployen:
1 2 3 4 5 6 7 | FROM python:3.6 RUN pip install redis RUN useradd -ms /bin/bash modius USER modius WORKDIR /app COPY app /app CMD ["python","-u", "app.py"] |
Nun können wir ein Docker Image erstellen, als Grundlage für unseren Docker Container.
1 | docker build -t pyredis:v0.1 . |
Starten des Redis und Python Containers
Als erstes starten wir den Redis Container, da wir beim Starten des Python Containers auf diesen verlinken wollen. Wenn der Redis Container noch nicht auf dem System vorhanden ist, wird dieser beim Startversuch automatisch vom DockerHub heruntergeladen
1 2 3 4 5 6 7 8 9 10 11 12 13 | docker run -d --name redis redis:3.2.0 Unable to find image 'redis:3.2.0' locally 3.2.0: Pulling from library/redis 51f5c6a04d83: Pull complete 6c8ccd839b1d: Pull complete 0fded1c9651d: Pull complete 7f1aa6a73799: Pull complete 658be2e58dbd: Pull complete 3d3b67be53f9: Pull complete 8a88e1919daf: Pull complete Digest: sha256:4b24131101fa0117bcaa18ac37055fffd9176aa1a240392bb8ea85e0be50f2ce Status: Downloaded newer image for redis:3.2.0 54fad25b3266688d305c4c0c01f8add5195e0740f4c33adf4dc06765b01c0b78 |
Anschließend können wir den Container mit der Python App starten. Dabei benutzt man den Parameter –link um einen Link zu einem anderen Container herzustellen. Dadurch kann der Python Container mit dem Redis Container Daten austauschen.
1 2 | docker run -d --name pyredis --link redis pyredis:v0.1 5bd8972cc206bf7baf1e203b31efe335987d854b8b9c58368c5fc97b3cce3a9c |
Prüfen des kleinen Microservices Setup
In dem Python Skript kontaktieren wir den Redis Container und setzten einen Key-Value Eintrag foo / bar. Anschließend wollen wir von Redis den Value zum Key foo wissen. Wenn alles richtig geklappt hat, steht im Log des Docker Containers nun bar. Dies kann mit dem folgenden Befehl geprüft werden.
1 2 | docker logs pyredis b'bar' |
Im folgenden Artikel schauen wir uns an, wie man das ganze nun auch automatisiert ausführen kann. Schaut doch mal rein: Docker Compose – Automatisiertes starten von Microservices
[…] Artikel Docker Microservices – Key-Value Store mit Python und Redis haben wir uns angeschaut, wie man mit Docker eine Microservices Setup realisieren kann. Da so […]