Im 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 ein Setup auch mehr wie zwei Docker Container enthalten kann, wollen wir uns in diesem Artikel damit beschäftigen, wie man eine Microservices Struktur mit hilfe von Docker Compose aufbauen kann.
Inhaltsverzeichnis
Was ist Docker Compose?
Unter Docker Compose versteht man die Funktion, mittels eines Datei (docker-compose.yml) einen Container mit Einstellungen und Abhängigkeiten zu versehen. Dabei kann zum Beispiel das Netzwerk konfiguriert werden, Mount Points für Netzlaufwerke gesetzt werden oder auch Links zu anderen Container hergestellt werden. Um den letzteren Punkt geht es uns hier in dem Artikel heute.
Wir wollen eine docker-compose.yml Datei für den Docker Container mit der Abfrage des Key-Value Stores anlegen. Beim Starten dieses Docker Containers soll automatisch Redis als Abhängigkeit gestartet werden. Wie das ganze im Detail aussieht schauen wir uns im nächsten Abschnitt etwas genauer an.
Anlegen eines docker-compose.yml für den Key-Value Store
Die docker-compose.yml legen wir im selben Ordner an, in dem auch das Dockerfile liegt. Die Datei wird anschließend mit dem folgenden Inhalt gefüllt:
1 2 3 4 5 6 7 8 | version: '3' services: dockerapp: build: . depends_on: - redis redis: image: redis:3.2.0 |
In der ersten Zeile hinterlegen wir hier die Version von Docker Compose. Diese könnt ihr mit dem folgenden Befehl ermitteln:
1 2 3 4 5 6 | docker-compose version docker-compose version 1.21.1, build 5a3f1a3 docker-py version: 3.3.0 CPython version: 3.6.4 OpenSSL version: OpenSSL 1.0.2o 27 Mar 2018 |
In der zweiten Zeile fangen wir dann mit der Definition des Microservices Setups an, in dem wir die einzelnen Services benennen.
Dabei beginnen wir mit dem Container, in dem das Python Script liegt. Dieser soll beim Ausführen der docker-compose.yml gebaut und gestartet werden.
In Zeile 5/6 legen wir dann die Abhängigkeit zum redis Container fest. Wichtig hierbei ist, dass wir auf einen Container verweisen, der nun weiter unten im docker-compose.yml noch definiert wird.
In Zeile 7/8 definieren wir dann den redis Container. Damit ist das anlegen der docker-compose Datei auch schon abgeschlossen.
Ausführen der Docker Compose Datei
Wir führen nun zum Starten des Setups die docker-compose.yml Datei aus. Dafür müssen wir uns in dem Ordner befinden, in dem diese Datei angelegt wurde. Hier wird die Datei dann mit docker-compose up ausgeführt. Das ganze sieht wie folgt aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | docker-compose up Creating network "microservices_default" with the default driver Building dockerapp Step 1/7 : FROM python:3.6 ---> 29d2f3226daf Step 2/7 : RUN pip install redis ---> Using cache ---> 39cee31a4554 Step 3/7 : RUN useradd -ms /bin/bash modius ---> Using cache ---> 5560897ee61c Step 4/7 : USER modius ---> Using cache ---> 56551ab66703 Step 5/7 : WORKDIR /app ---> Using cache ---> b7195ccc0dae Step 6/7 : COPY app /app ---> bfd8b5b94cb6 Step 7/7 : CMD ["python","-u", "app.py"] ---> Running in cb1440e3f207 Removing intermediate container cb1440e3f207 ---> 643347123f85 Successfully built 643347123f85 Successfully tagged microservices_dockerapp:latest WARNING: Image for service dockerapp was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. Creating microservices_redis_1 ... done Creating microservices_dockerapp_1 ... done Attaching to microservices_redis_1, microservices_dockerapp_1 redis_1 | _._ redis_1 | _.-``__ ''-._ redis_1 | _.-`` `. `_. ''-._ Redis 3.2.0 (00000000/0) 64 bit redis_1 | .-`` .-```. ```\/ _.,_ ''-._ redis_1 | ( ' , .-` | `, ) Running in standalone mode redis_1 | |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 redis_1 | | `-._ `._ / _.-' | PID: 1 redis_1 | `-._ `-._ `-./ _.-' _.-' redis_1 | |`-._`-._ `-.__.-' _.-'_.-'| redis_1 | | `-._`-._ _.-'_.-' | http://redis.io redis_1 | `-._ `-._`-.__.-'_.-' _.-' redis_1 | |`-._`-._ `-.__.-' _.-'_.-'| redis_1 | | `-._`-._ _.-'_.-' | redis_1 | `-._ `-._`-.__.-'_.-' _.-' redis_1 | `-._ `-.__.-' _.-' redis_1 | `-._ _.-' redis_1 | `-.__.-' redis_1 | redis_1 | 1:M 26 Jun 13:19:38.404 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. redis_1 | 1:M 26 Jun 13:19:38.405 # Server started, Redis version 3.2.0 redis_1 | 1:M 26 Jun 13:19:38.405 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. redis_1 | 1:M 26 Jun 13:19:38.405 * The server is now ready to accept connections on port 6379 dockerapp_1 | b'bar' microservices_dockerapp_1 exited with code 0 |
Das ausführen kann mit ctrl + c abgebrochen werden.
Nach diesem Prinzip kann man nun Microservice Setups beliebiger größe Aufbauen.
jan meint
Hi,
ich habe folgende Frage:
Wie kann man denn mehrere docker-composer-Dateien nutzen?
Also bspw. will ich eine Composer-Datei haben, um ein NGINX+MARIADB+PHP-System hochzuziehen.
Aber ich will auch eine Composer-Datei vorliegen haben, wenn ich mal ein WORDPRESS + MYSQL-System starten möchte.
Geht das denn? Also kann man bspw dem Befehl „docker-composer“ den Dateinamen einer YAML-Datei übergeben?
Vielen Dank
Jan
Christian meint
Hi Jan,
ja das geht mit dem folgenden Befehl:
docker-compose -f custom-filename.yml up
Gruß
Christian