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.
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
Docker Compose
Технология
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.
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 (
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-compose
I 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 docker
i 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
.
Pomoc dotycząca dostępnych poleceń
make build
- składanie obrazu zDockerfile
. W naszym przykładzie wykorzystaliśmy istniejące obrazytimescale
иping
. Ale obrazapi
chcemy zbierać lokalnie. Dokładnie to się stanie po wykonaniu tego polecenia.
Budowanie kontenera Docker
make start
— uruchomienie wszystkich kontenerów. Aby uruchomić tylko jeden kontener, możesz użyć polecenia takiego jakmake start c=timescale
.
Uruchamianie kontenera skali czasu
Uruchamianie kontenera ping
make login-timescale
— zaloguj się do sesji bash konteneratimescale
.
Uruchamianie basha w kontenerze skali czasu
make db-shell
- wejście dopsql
w pojemnikutimescale
do wykonywania zapytań SQL względem bazy danych.
Uruchamianie psql w kontenerze b ze skalą czasową
make stop
— zatrzymywanie kontenerów.
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
lubmake down c=api
.
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.yml
praca 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
zamieniamake 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
Makefile
usprawnia to współpracę i zmniejsza liczbę błędów.
PS В нашем
Drodzy Czytelnicy! Jak zautomatyzować Docker Compose?
Źródło: www.habr.com