Alle paar Jahre erlebt die Softwareentwicklungsbranche einen Paradigmenwechsel. Eines dieser Phänomene ist das wachsende Interesse am Konzept der Microservices. Obwohl Microservices nicht die neueste Technologie sind, ist ihre Popularität erst in jüngster Zeit regelrecht in die Höhe geschossen.
Große monolithische Dienste werden jetzt durch unabhängige, autonome Mikrodienste ersetzt. Ein Microservice kann als eine Anwendung betrachtet werden, die einem einzigen und sehr spezifischen Zweck dient. Beispielsweise könnte es sich um ein relationales DBMS, eine Express-Anwendung oder einen Solr-Dienst handeln.
Heutzutage ist die Entwicklung eines neuen Softwaresystems ohne den Einsatz von Microservices kaum noch vorstellbar. Und diese Situation wiederum führt uns zur Docker-Plattform.
Docker
Plattform
Docker komponieren
Технология
Bei der Arbeit mit Docker Compose wird eine YAML-Datei verwendet, um Anwendungsdienste zu konfigurieren und deren Interaktion untereinander zu organisieren. Docker Compose ist daher ein Tool zum Beschreiben und Ausführen von Multi-Container-Docker-Anwendungen.
Zwei Container, die auf einem Hostsystem laufen
GNU machen
Programm make
ist im Wesentlichen ein Tool zur Automatisierung der Erstellung von Programmen und Bibliotheken aus Quellcode. Im Allgemeinen können wir das sagen make
gilt für jeden Prozess, bei dem beliebige Befehle ausgeführt werden, um einige Eingabematerialien in eine Ausgabeform oder ein bestimmtes Ziel umzuwandeln. In unserem Fall die Befehle docker-compose
werden in abstrakte Ziele umgewandelt (
Dem Programm mitteilen make
Was wir davon wollen, brauchen wir eine Datei Makefile
.
In unserem Makefile
enthält reguläre Befehle docker
и docker-compose
, die viele Probleme lösen sollen. Es geht nämlich darum, einen Container zusammenzustellen, ihn zu starten, zu stoppen, neu zu starten, die Benutzeranmeldung am Container zu organisieren, mit Containerprotokollen zu arbeiten und andere ähnliche Probleme zu lösen.
Typische Anwendungsfälle für Docker Compose
Stellen wir uns eine normale Webanwendung vor, die über die folgenden Komponenten verfügt:
- TimescaleDB-Datenbank (Postgres).
- Express.js-Anwendung.
- Ping (nur ein Container, macht nichts Besonderes).
Diese Anwendung benötigt 3 Docker-Container und eine Datei docker-compose
, das Anweisungen zum Verwalten dieser Container enthält. Jeder Container verfügt über unterschiedliche Berührungspunkte. Zum Beispiel mit einem Container timescale
Es wird möglich sein, ungefähr auf die gleiche Weise zu arbeiten wie mit Datenbanken. Es ermöglicht Ihnen nämlich, die folgenden Aktionen auszuführen:
- Anmelden bei der Postgres-Shell.
- Import und Export von Tabellen.
- Schöpfung
pg_dump
Tabellen oder Datenbanken.
Express.js-Anwendungscontainer, expressjs
, kann die folgenden Fähigkeiten haben:
- Bereitstellung aktueller Daten aus dem Systemprotokoll.
- Melden Sie sich bei der Shell an, um bestimmte Befehle auszuführen.
Interaktion mit Containern
Sobald wir die Kommunikation zwischen Containern mithilfe von Docker Compose eingerichtet haben, ist es an der Zeit, mit diesen Containern zu kommunizieren. Innerhalb des Docker Compose-Systems gibt es einen Befehl docker-compose
, unterstützende Option -f
, mit dem Sie eine Datei an das System übertragen können docker-compose.yml
.
Mithilfe der Funktionen dieser Option können Sie die Interaktion mit dem System nur auf die in der Datei genannten Container beschränken docker-compose.yml
.
Werfen wir einen Blick darauf, wie Interaktionen mit Containern bei der Verwendung von Befehlen aussehen docker-compose
. Wenn wir uns vorstellen, dass wir uns bei der Shell anmelden müssen psql
, dann könnten die entsprechenden Befehle so aussehen:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
Derselbe Befehl, der nicht zur Ausführung verwendet wird docker-compose
Und docker
, könnte so aussehen:
docker exec -it edp_timescale_1 psql -Upostgres
Bitte beachten Sie, dass es in solchen Fällen immer vorzuziehen ist, den Befehl zu verwenden docker
, und der Befehl docker-compose
, da dadurch die Notwendigkeit entfällt, sich Containernamen zu merken.
Beide oben genannten Befehle sind nicht so schwierig. Aber wenn wir einen „Wrapper“ im Formular verwenden würden Makefile
, was uns eine Schnittstelle in Form einfacher Befehle geben würde und selbst ähnlich lange Befehle aufrufen würde, dann könnten die gleichen Ergebnisse wie folgt erzielt werden:
make db-shell
Es ist ganz offensichtlich, dass die Verwendung Makefile
erleichtert die Arbeit mit Behältern erheblich!
Arbeitsbeispiel
Basierend auf dem obigen Projektdiagramm erstellen wir die folgende Datei docker-compose.yml
:
version: '3.3'
services:
api:
build: .
image: mywebimage:0.0.1
ports:
- 8080:8080
volumes:
- /app/node_modules/
depends_on:
- timescale
command: npm run dev
networks:
- webappnetwork
timescale:
image: timescale/timescaledb-postgis:latest-pg11
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
command: ["postgres", "-c", "log_statement=all", "-c", "log_destination=stderr"]
volumes:
- ./create_schema.sql:/docker-entrypoint-initdb.d/create_schema.sql
networks:
- webappnetwork
ping:
image: willfarrell/ping
environment:
HOSTNAME: "localhost"
TIMEOUT: 300
networks:
webappnetwork:
driver: bridge
Um die Docker Compose-Konfiguration zu verwalten und mit den darin beschriebenen Containern zu interagieren, erstellen wir die folgende Datei Makefile
:
THIS_FILE := $(lastword $(MAKEFILE_LIST))
.PHONY: help build up start down destroy stop restart logs logs-api ps login-timescale login-api db-shell
help:
make -pRrq -f $(THIS_FILE) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^[^[:alnum:]]' -e '^$@$$'
build:
docker-compose -f docker-compose.yml build $(c)
up:
docker-compose -f docker-compose.yml up -d $(c)
start:
docker-compose -f docker-compose.yml start $(c)
down:
docker-compose -f docker-compose.yml down $(c)
destroy:
docker-compose -f docker-compose.yml down -v $(c)
stop:
docker-compose -f docker-compose.yml stop $(c)
restart:
docker-compose -f docker-compose.yml stop $(c)
docker-compose -f docker-compose.yml up -d $(c)
logs:
docker-compose -f docker-compose.yml logs --tail=100 -f $(c)
logs-api:
docker-compose -f docker-compose.yml logs --tail=100 -f api
ps:
docker-compose -f docker-compose.yml ps
login-timescale:
docker-compose -f docker-compose.yml exec timescale /bin/bash
login-api:
docker-compose -f docker-compose.yml exec api /bin/bash
db-shell:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
Die meisten der hier beschriebenen Befehle gelten für alle Container, jedoch mit der Option c=
ermöglicht es Ihnen, den Umfang eines Befehls auf einen Container zu beschränken.
Nach Makefile
Fertig, Sie können es wie folgt verwenden:
make help
– Ausgabe einer Liste aller verfügbaren Befehle fürmake
.
Hilfe zu verfügbaren Befehlen
make build
- Zusammenstellen eines Bildes ausDockerfile
. In unserem Beispiel haben wir vorhandene Bilder verwendettimescale
иping
. Aber das Bildapi
Wir wollen vor Ort sammeln. Genau das wird nach der Ausführung dieses Befehls geschehen.
Erstellen eines Docker-Containers
make start
— Starten aller Container. Um nur einen Container zu starten, können Sie einen Befehl wie verwendenmake start c=timescale
.
Ausführen des Zeitskalencontainers
Ausführen eines Ping-Containers
make login-timescale
— Melden Sie sich bei der Bash-Sitzung des Containers antimescale
.
Bash in einem Zeitskalencontainer ausführen
make db-shell
- Eingang zupsql
in einem Behältertimescale
um SQL-Abfragen an die Datenbank auszuführen.
Ausführen von psql in einem timescaledb-Container
make stop
— Container stoppen.
Stoppen eines Zeitskalencontainers
make down
— Anhalten und Entfernen von Containern. Um einen bestimmten Container zu entfernen, können Sie diesen Befehl verwenden und den gewünschten Container angeben. Zum Beispiel -make down c=timescale
odermake down c=api
.
Stoppen und Löschen aller Container
Ergebnisse
Obwohl Docker Compose uns einen umfangreichen Befehlssatz zum Verwalten von Containern bietet, können diese Befehle manchmal langwierig und schwer zu merken sein.
Verwendungsmethode Makefile
hat uns geholfen, eine schnelle und einfache Interaktion mit Containern aus einer Datei zu ermöglichen docker-compose.yml
. Es geht nämlich um Folgendes:
- Der Entwickler interagiert nur mit den in beschriebenen Projektcontainern
docker-compose.yml
, wird die Arbeit nicht durch andere laufende Container beeinträchtigt. - Für den Fall, dass ein bestimmter Befehl vergessen wird, können Sie den Befehl ausführen
make help
und erhalten Sie Hilfe zu verfügbaren Befehlen. - Sie müssen sich keine langen Listen mit Argumenten merken, um Aktionen wie das Abrufen der neuesten Protokolleinträge oder das Anmelden bei einem System auszuführen. Zum Beispiel ein Befehl wie
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
verwandelt sich inmake db-shell
. - Datei
Makefile
Sie können sich flexibel daran anpassen, wenn das Projekt wächst. Es ist beispielsweise einfach, einen Befehl hinzuzufügen, um eine Datenbanksicherung zu erstellen oder eine andere Aktion auszuführen. - Wenn ein großes Entwicklerteam dasselbe verwendet
Makefile
Dies optimiert die Zusammenarbeit und reduziert Fehler.
PS In unserem
Liebe Leser! Wie automatisiert man Docker Compose?
Source: habr.com