Docker Compose: Mit Makefile vereinfachen

Alle paar Jahre findet in der Softwareentwicklungsbranche ein Paradigmenwechsel statt. Eines dieser Phänomene ist das wachsende Interesse am Konzept der Mikrodienste. Obwohl Microservices nicht die neueste Technologie sind, ist ihre Popularität erst in letzter Zeit buchstäblich in die Höhe geschossen.

Große monolithische Dienste werden heutzutage durch unabhängige autonome Mikrodienste ersetzt. Ein Microservice kann als eine Anwendung betrachtet werden, die einem einzigen und sehr spezifischen Zweck dient. Beispielsweise kann 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 vorstellbar. Und diese Situation führt uns wiederum zur Docker-Plattform.





Docker


Die Docker- Plattform für die Entwicklung und Bereitstellung von Microservices ist fast zum Industriestandard geworden. Auf der Projektwebsite finden Sie heraus, dass Docker die einzige unabhängige Containerisierungsplattform ist, mit der Unternehmen mühelos Anwendungen erstellen sowie in jeder Umgebung verteilen und ausführen können - von Hybrid-Clouds bis hin zu Grenzsystemen.

Docker komponieren


Die Docker Compose- Technologie dient zur Konfiguration von Anwendungen mit mehreren Containern. Ein Docker Compose-Projekt kann so viele Docker-Container enthalten, wie der Ersteller dieses Projekts benötigt.

Bei der Arbeit mit Docker Compose wird eine YAML-Datei verwendet, um Anwendungsdienste zu konfigurieren und deren Interaktion miteinander zu organisieren. Docker Compose ist somit ein Tool zum Beschreiben und Ausführen von Docker-Anwendungen mit mehreren Containern.


Zwei Container, die auf dem Hostsystem ausgeführt werden

GNU machen


Ein Programm makeist im Wesentlichen ein Werkzeug zur Automatisierung der Zusammenstellung von Programmen und Bibliotheken aus dem Quellcode. Im Allgemeinen können wir sagen, dass es makeauf jeden Prozess anwendbar ist, der die Ausführung beliebiger Befehle zum Konvertieren bestimmter Quellmaterialien in eine bestimmte resultierende Form, in ein bestimmtes Ziel umfasst. In unserem Fall werden die Teams docker-composein abstrakte Ziele ( falsche Ziele ) umgewandelt.

Um dem Programm mitzuteilen, makewas wir von ihm wollen, benötigen wir eine Datei Makefile.

Unsere Makefileenthalten die üblichen Befehle dockerunddocker-composedas sollen viele Probleme lösen. Wir sprechen nämlich über das Zusammenstellen eines Containers, über das Starten, Stoppen, Neustarten, das Organisieren der Anmeldung eines Benutzers am Container, das Arbeiten mit Containerprotokollen und das Lösen anderer ähnlicher Probleme.

Typische Verwendungen für Docker Compose


Stellen Sie sich eine normale Webanwendung vor, die die folgenden Komponenten enthält:

  • TimescaleDB-Datenbank (Postgres).
  • Express.js Anwendung.
  • Ping (nur ein Container, der nichts Besonderes macht).

Diese Anwendung benötigt 3 Docker-Container und eine Datei docker-composemit Anweisungen zum Verwalten dieser Container. Jeder der Container hat unterschiedliche Interaktionspunkte. timescaleSie können beispielsweise mit einem Container genauso arbeiten wie mit Datenbanken. Sie können nämlich die folgenden Aktionen ausführen:

  • Melden Sie sich bei der Postgres-Shell an.
  • Tabellen importieren und exportieren.
  • Erstellen Sie eine pg_dumpTabelle oder Datenbank.

Der Container einer Express.js-Anwendung expressjskann die folgenden Funktionen aufweisen:

  • Die Ausgabe frischer Daten aus dem Systemprotokoll.
  • Geben Sie die Shell ein, um bestimmte Befehle auszuführen.

Container-Interaktion


Nachdem wir die Verbindung zwischen Containern mit Docker Compose konfiguriert haben, ist es Zeit, eine Interaktion mit diesen Containern herzustellen. Als Teil des Docker Compose-Systems gibt es einen Befehl docker-compose, der eine Option unterstützt -f, mit der Sie eine Datei auf das System übertragen können docker-compose.yml.

Mit den Funktionen dieser Option können Sie die Interaktion mit dem System nur auf die in der Datei genannten Container beschränken docker-compose.yml.

Sehen Sie sich an, wie Containerinteraktionen bei der Verwendung von Befehlen aussehen docker-compose. Wenn wir uns vorstellen, dass wir die Shell betreten müssen psql, sehen die entsprechenden Befehle möglicherweise folgendermaßen aus:

docker-compose -f docker-compose.yml exec timescale psql -Upostgres

Der gleiche Befehl, für den nicht docker-compose, aber verwendet wird docker, kann folgendermaßen aussehen:

docker exec -it  edp_timescale_1 psql -Upostgres

Bitte beachten Sie, dass es in solchen Fällen immer vorzuziehen ist, nicht einen Befehl docker, sondern einen Befehl zu verwenden docker-compose, da dies die Notwendigkeit beseitigt, sich die Namen der Container zu merken.

Beide oben genannten Befehle sind nicht so kompliziert. Wenn wir jedoch den „Wrapper“ in einer Form verwenden Makefilewürden, die uns eine Schnittstelle in Form einfacher Befehle bietet und selbst so lange Befehle aufruft, könnten die gleichen Ergebnisse wie folgt erzielt werden:

make db-shell

Es ist offensichtlich, dass die Verwendung Makefiledie Arbeit mit Containern erheblich vereinfacht!

Arbeitsbeispiel


Erstellen Sie anhand des obigen Projektdiagramms 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

Erstellen Sie die folgende Datei, um die Docker Compose-Konfiguration zu verwalten und mit den darin beschriebenen Containern zu interagieren 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. Mit der Option c=können Sie jedoch den Umfang des Befehls auf einen Container beschränken.

Sobald Sie Makefilefertig sind, können Sie es folgendermaßen verwenden:

  • make help- Ausgabe einer Liste aller für make.


Hilfe zu verfügbaren Befehlen

  • make build- Montage des Bildes aus Dockerfile. In unserem Beispiel haben wir vorhandene Bilder timescaleund verwendet ping. Aber apiwir wollen das Bild lokal sammeln. Dies ist genau das, was nach Ausführung dieses Befehls getan wird.


Docker-Container-Baugruppe

  • make start- Start aller Container. Um nur einen Container zu starten, können Sie den Befehl des Formulars verwenden make start c=timescale.


Zeitskalencontainer starten


Starten Sie den Ping-Container

  • make login-timescale- Eintritt in die Bash-Sitzung des Containers timescale.


Bash im Zeitskalencontainer ausführen

  • make db-shell- Melden Sie psqlsich beim Container timescalean, um SQL-Abfragen an die Datenbank auszuführen.


Ausführen von psql im timescaledb-Container

  • make stop - Behälter stoppen.


Stoppen des Zeitskalencontainers

  • make down- Behälter anhalten und entfernen. Um einen bestimmten Container zu löschen, können Sie diesen Befehl mit dem angegebenen Container verwenden. Zum Beispiel - make down c=timescaleoder make down c=api.


Stoppen und löschen Sie alle Container

Zusammenfassung


Trotz der Tatsache, dass das Docker Compose-System eine umfangreiche Reihe von Befehlen zum Verwalten von Containern bereitstellt, werden diese Befehle manchmal lang und können daher schwer zu merken sein.

Die Verwendungsmethode Makefilehat uns geholfen, eine schnelle und einfache Interaktion mit Containern aus der Datei herzustellen docker-compose.yml. Wir sprechen nämlich über Folgendes:

  • , docker-compose.yml, .
  • , , make help .
  • , . , docker-compose -f docker-compose.yml exec timescale psql -Upostgres make db-shell.
  • Makefile , , . , .
  • Makefile, .

PS Auf unserem Marktplatz gibt es ein Docker- Image , das mit einem Klick installiert wird. Sie können den Betrieb von Containern auf VPS überprüfen . Alle Neukunden erhalten 3 Tage kostenlos zum Testen.

Liebe Leser! Wie automatisieren Sie die Arbeit mit Docker Compose?

Source: https://habr.com/ru/post/undefined/


All Articles