Docker Compose: upraszczanie pracy za pomocą plików Makefile

Co kilka lat branża tworzenia oprogramowania ulega zmianie paradygmatu. Za jedno z tych zjawisk można uznać rosnące zainteresowanie koncepcją mikroserwisów. Choć mikroserwisy nie są najnowszą technologią, dopiero niedawno ich popularność dosłownie wzrosła.

Duże monolityczne usługi są obecnie zastępowane niezależnymi, autonomicznymi mikroserwisami. Mikrousługę można traktować jako aplikację służącą jednemu i bardzo konkretnemu celowi. Może to być na przykład relacyjny system DBMS, aplikacja Express, usługa Solr.

Docker Compose: upraszczanie pracy za pomocą plików Makefile

W dzisiejszych czasach trudno sobie wyobrazić rozwój nowego systemu oprogramowania bez wykorzystania mikroserwisów. I ta sytuacja z kolei prowadzi nas do platformy Docker.

Doker

platforma Dokerw opracowywaniu i wdrażaniu mikrousług stała się niemal standardem branżowym. Na stronie projektu można dowiedzieć się, że Docker to jedyna niezależna platforma konteneryzacji, która pozwala organizacjom bez wysiłku tworzyć dowolne aplikacje, a także dystrybuować je i uruchamiać w dowolnym środowisku - od chmur hybrydowych po systemy brzegowe.

Docker Compose

Технология Docker Compose przeznaczony do konfiguracji aplikacji wielokontenerowych. Projekt Docker Compose może zawierać tyle kontenerów Docker, ile potrzebuje twórca projektu.

Podczas pracy z Docker Compose plik YAML służy do konfigurowania usług aplikacji i organizowania ich wzajemnej interakcji. Docker Compose jest zatem narzędziem do opisywania i uruchamiania wielokontenerowych aplikacji Docker.

Docker Compose: upraszczanie pracy za pomocą plików Makefile
Dwa kontenery działające w systemie hosta

Marka GNU

Program make, jest zasadniczo narzędziem do automatyzacji budowania programów i bibliotek z kodu źródłowego. Ogólnie można tak powiedzieć make dotyczy każdego procesu polegającego na wykonywaniu dowolnych poleceń w celu przekształcenia niektórych materiałów wejściowych w jakąś formę wyjściową, w jakimś celu. W naszym przypadku polecenia docker-compose zostaną przekształcone w cele abstrakcyjne (Cele telefoniczne).

Aby powiedzieć programowi make o tym, czego od niego chcemy, potrzebujemy pliku Makefile.

В нашем Makefile będzie zawierać zwykłe polecenia docker и docker-compose, które mają na celu rozwiązanie wielu problemów. Mianowicie mówimy o składaniu kontenera, jego uruchamianiu, zatrzymywaniu, ponownym uruchamianiu, organizowaniu logowania użytkowników do kontenera, pracy z logami kontenera i rozwiązywaniu innych podobnych problemów.

Typowe przypadki użycia Docker Compose

Wyobraźmy sobie zwykłą aplikację internetową zawierającą następujące komponenty:

  • Baza danych TimescaleDB (Postgres).
  • Aplikacja Express.js.
  • Ping (tylko kontener, nie robi nic specjalnego).

Ta aplikacja będzie potrzebować 3 kontenerów Docker i pliku docker-compose, który zawiera instrukcje dotyczące zarządzania tymi kontenerami. Każdy kontener będzie miał inne punkty styku. Na przykład z pojemnikiem timescale będzie można pracować w przybliżeniu w ten sam sposób, w jaki pracują z bazami danych. Mianowicie umożliwia wykonanie następujących czynności:

  • Logowanie do powłoki Postgres.
  • Import i eksport tabel.
  • tworzenie pg_dump tabele lub bazy danych.

Kontener aplikacji Express.js, expressjs, może mieć następujące możliwości:

  • Dostarczanie świeżych danych z logu systemowego.
  • Zaloguj się do powłoki, aby wykonać określone polecenia.

Interakcja z kontenerami

Po skonfigurowaniu komunikacji między kontenerami za pomocą Docker Compose czas na komunikację z tymi kontenerami. W systemie Docker Compose istnieje polecenie docker-compose, opcja wsparcia -f, który umożliwia przesłanie pliku do systemu docker-compose.yml.

Korzystając z możliwości tej opcji, możesz ograniczyć interakcję z systemem tylko do tych kontenerów, które są wymienione w pliku docker-compose.yml.

Przyjrzyjmy się jak wyglądają interakcje z kontenerami podczas korzystania z poleceń docker-compose. Jeśli wyobrazimy sobie, że musimy zalogować się do powłoki psql, wówczas odpowiednie polecenia mogą wyglądać następująco:

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

To samo polecenie, które nie jest używane do wykonania docker-composeI docker, może wyglądać tak:

docker exec -it  edp_timescale_1 psql -Upostgres

Należy pamiętać, że w takich przypadkach zawsze lepiej jest użyć polecenia dockeri zespół docker-compose, ponieważ eliminuje to potrzebę zapamiętywania nazw kontenerów.

Obydwa powyższe polecenia nie są aż tak trudne. Ale gdybyśmy użyli „opakowania” w formularzu Makefile, który dałby nam interfejs w postaci prostych poleceń i sam wywołałby podobne długie polecenia, wówczas te same wyniki można by osiągnąć w następujący sposób:

make db-shell

To oczywiste, że użycie Makefile znacznie ułatwia pracę z kontenerami!

Przykład działania

Na podstawie powyższego schematu projektu utworzymy następujący plik 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

Aby zarządzać konfiguracją Docker Compose i wchodzić w interakcję z opisanymi w niej kontenerami, utworzymy następujący plik 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

Większość opisanych tutaj poleceń dotyczy wszystkich kontenerów, ale z użyciem opcji c= pozwala ograniczyć zakres polecenia do jednego kontenera.

Później Makefile gotowe, możesz użyć go w ten sposób:

  • make help — wyświetlenie listy wszystkich dostępnych poleceń make.

Docker Compose: upraszczanie pracy za pomocą plików Makefile
Pomoc dotycząca dostępnych poleceń

  • make build - składanie obrazu z Dockerfile. W naszym przykładzie wykorzystaliśmy istniejące obrazy timescale и ping. Ale obraz api chcemy zbierać lokalnie. Dokładnie to się stanie po wykonaniu tego polecenia.

Docker Compose: upraszczanie pracy za pomocą plików Makefile
Budowanie kontenera Docker

  • make start — uruchomienie wszystkich kontenerów. Aby uruchomić tylko jeden kontener, możesz użyć polecenia takiego jak make start c=timescale.

Docker Compose: upraszczanie pracy za pomocą plików Makefile
Uruchamianie kontenera skali czasu

Docker Compose: upraszczanie pracy za pomocą plików Makefile
Uruchamianie kontenera ping

  • make login-timescale — zaloguj się do sesji bash kontenera timescale.

Docker Compose: upraszczanie pracy za pomocą plików Makefile
Uruchamianie basha w kontenerze skali czasu

  • make db-shell - wejście do psql w pojemniku timescale do wykonywania zapytań SQL względem bazy danych.

Docker Compose: upraszczanie pracy za pomocą plików Makefile
Uruchamianie psql w kontenerze b ze skalą czasową

  • make stop — zatrzymywanie kontenerów.

Docker Compose: upraszczanie pracy za pomocą plików Makefile
Zatrzymywanie kontenera skali czasu

  • make down — zatrzymywanie i usuwanie kontenerów. Aby usunąć konkretny kontener, możesz użyć tego polecenia, określając żądany kontener. Na przykład - make down c=timescale lub make down c=api.

Docker Compose: upraszczanie pracy za pomocą plików Makefile
Zatrzymywanie i usuwanie wszystkich kontenerów

Wyniki

Chociaż Docker Compose udostępnia nam bogaty zestaw poleceń do zarządzania kontenerami, czasami polecenia te mogą stać się długie i trudne do zapamiętania.

Sposób użycia Makefile pomógł nam nawiązać szybką i łatwą interakcję z kontenerami z pliku docker-compose.yml. Mianowicie mówimy o następujących kwestiach:

  • Deweloper wchodzi w interakcję wyłącznie z kontenerami projektu opisanymi w docker-compose.ymlpraca nie jest zakłócana przez inne pracujące kontenery.
  • Jeżeli zapomnisz o jakimś poleceniu, możesz je wykonać make help i uzyskaj pomoc dotyczącą dostępnych poleceń.
  • Nie musisz pamiętać długich list argumentów, aby wykonywać takie czynności, jak pobieranie najnowszych wpisów do dziennika lub logowanie do systemu. Na przykład polecenie typu docker-compose -f docker-compose.yml exec timescale psql -Upostgres zamienia make db-shell.
  • plik Makefile Można się do niego elastycznie dostosowywać w miarę rozwoju projektu. Na przykład łatwo jest dodać polecenie utworzenia kopii zapasowej bazy danych lub wykonania dowolnej innej akcji.
  • Jeśli duży zespół programistów używa tego samego Makefileusprawnia to współpracę i zmniejsza liczbę błędów.

PS В нашем rynek jest obraz Doker, który można zainstalować jednym kliknięciem. Działanie kontenerów można sprawdzić na stronie VPS. Wszystkim nowym klientom oferujemy 3 dni testów bezpłatnie.

Drodzy Czytelnicy! Jak zautomatyzować Docker Compose?

Docker Compose: upraszczanie pracy za pomocą plików Makefile

Źródło: www.habr.com

Dodaj komentarz