Docker Compose: Vereinfachen Sie Ihre Arbeit mithilfe von Makefiles

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.

Docker Compose: Vereinfachen Sie Ihre Arbeit mithilfe von Makefiles

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, bei der Entwicklung und Bereitstellung von Microservices, ist fast zu einem Industriestandard geworden. Auf der Website des Projekts erfahren Sie, dass Docker die einzige unabhängige Containerisierungsplattform ist, die es Unternehmen ermöglicht, mühelos beliebige Anwendungen zu erstellen sowie diese in jeder Umgebung zu verteilen und auszuführen – von Hybrid Clouds bis hin zu Edge-Systemen.

Docker komponieren

Технология Docker komponieren Entwickelt für die Konfiguration von Multi-Container-Anwendungen. Ein Docker Compose-Projekt kann so viele Docker-Container enthalten, wie der Ersteller des Projekts benötigt.

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.

Docker Compose: Vereinfachen Sie Ihre Arbeit mithilfe von Makefiles
Zwei Container, die auf einem Hostsystem laufen

GNU machen

Programm makeist 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 (Telefonziele).

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-composeUnd 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ür make.

Docker Compose: Vereinfachen Sie Ihre Arbeit mithilfe von Makefiles
Hilfe zu verfügbaren Befehlen

  • make build - Zusammenstellen eines Bildes aus Dockerfile. In unserem Beispiel haben wir vorhandene Bilder verwendet timescale и ping. Aber das Bild api Wir wollen vor Ort sammeln. Genau das wird nach der Ausführung dieses Befehls geschehen.

Docker Compose: Vereinfachen Sie Ihre Arbeit mithilfe von Makefiles
Erstellen eines Docker-Containers

  • make start — Starten aller Container. Um nur einen Container zu starten, können Sie einen Befehl wie verwenden make start c=timescale.

Docker Compose: Vereinfachen Sie Ihre Arbeit mithilfe von Makefiles
Ausführen des Zeitskalencontainers

Docker Compose: Vereinfachen Sie Ihre Arbeit mithilfe von Makefiles
Ausführen eines Ping-Containers

  • make login-timescale — Melden Sie sich bei der Bash-Sitzung des Containers an timescale.

Docker Compose: Vereinfachen Sie Ihre Arbeit mithilfe von Makefiles
Bash in einem Zeitskalencontainer ausführen

  • make db-shell - Eingang zu psql in einem Behälter timescale um SQL-Abfragen an die Datenbank auszuführen.

Docker Compose: Vereinfachen Sie Ihre Arbeit mithilfe von Makefiles
Ausführen von psql in einem timescaledb-Container

  • make stop — Container stoppen.

Docker Compose: Vereinfachen Sie Ihre Arbeit mithilfe von Makefiles
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 oder make down c=api.

Docker Compose: Vereinfachen Sie Ihre Arbeit mithilfe von Makefiles
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 in make 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 MakefileDies optimiert die Zusammenarbeit und reduziert Fehler.

PS In unserem Marktplatz es gibt ein Bild Docker, das mit einem Klick installiert wird. Sie können überprüfen, an welchen Containern gearbeitet wird VPS. Alle Neukunden erhalten 3 Testtage kostenlos.

Liebe Leser! Wie automatisiert man Docker Compose?

Docker Compose: Vereinfachen Sie Ihre Arbeit mithilfe von Makefiles

Source: habr.com

Kommentar hinzufügen