Ikvienu pāris gadu laikā programmatūras izstrādes nozarē notiek paradigmas maiņa. Viens no šiem parādībām ir interesi par mikropakalpojumu koncepciju. Lai gan mikropakalpojumi nav jauna tehnoloģija, to popularitāte pēdējā laikā ir strauji pieaugusi.
Lielie monolītiskie pakalpojumi mūsdienās tiek aizstāti ar neatkarīgiem autonomiem mikropakalpojumiem. Mikropakalpojumu var uzskatīt par lietojumprogrammu, kas kalpo vienai un ļoti specifiskai mērķim. Piemēram, tas var būt relāciju datu bāze, Express lietojumprogramma vai Solr pakalpojums.
Mūsdienās ir grūti iedomāties jaunas programmatūras sistēmas izstrādi bez mikropakalpojumiem. Šī situācija mūs, savukārt, novirza uz Docker platformu.
Docker
Platforma , mikropakalpojumu izstrādes un izvietošanas jomā ir kļuvusi par praktiski industrijas standartu. Projekta tīmekļa vietnē var uzzināt, ka Docker ir vienīgā neatkarīgā konteinerizācijas platforma, kas ļauj organizācijām bez sarežģījumiem veidot jebkādas lietojumprogrammas, kā arī izplatīt un palaist tās jebkurā vidē — no hibrīda mākoņiem līdz malas sistēmām.
Docker Compose
Tehnoloģija ir paredzēta vairāku konteineru lietojumprogrammu konfigurēšanai. Docker Compose projektā var ietilpt tik daudz Docker konteineru, cik nepieciešams šī projekta veidotājam.
Strādājot ar Docker Compose, lai iestatītu lietojumprogrammas pakalpojumus un organizētu to mijiedarbību, tiek izmantots YAML fails. Tādējādi Docker Compose ir rīks, kas apraksta un palaida vairāku konteineru Docker lietojumprogrammas.

Divi konteineri, kas darbojas uz hosta sistēmas
GNU Make
Programma make, būtībā ir rīks, kas automatizē programmu un bibliotēku izstrādāšanu no avota koda. Kopumā var teikt, ka make tā ir piemērojama jebkuram procesam, kas ietver brīvprātīgu komandu izpildi, lai pārveidotu noteiktus izejmateriālus uz noteiktu rezultātu vai mērķi. Mūsu gadījumā komandas docker-compose tiks pārveidotas par abstraktiem mērķiem ().
Lai paziņotu programmai make par to, ko vēlamies no viņas, mums būs nepieciešams fails Makefile.
Mūsu Makefile kas saturēs parastās komandas docker un docker-compose, kas paredzēti daudzu uzdevumu risināšanai. Proti, mēs runājam par konteineru izveidošanu, to palaišanu, apturēšanu, restartēšanu, lietotāja pieteikšanos konteineros, darbu ar konteineru žurnāliem un citu līdzīgu uzdevumu risināšanu.
Tipiski Docker Compose lietošanas gadījumi
Iedomāsimies tipisku tīmekļa lietojumprogrammu, kurā ir sekojošie komponenti:
- TimescaleDB (Postgres) datu bāze.
- Express.js lietojumprogramma.
- Ping (vienkārši konteiners, kas neko īpašu nedara).
Šai lietojumprogrammai būs nepieciešami 3 Docker konteineri un fails docker-compose, kura satur instrukcijas šo konteiners vadīšanai. Katram no konteineriem būs dažādas saskarnes. Piemēram, ar konteinera timescale varēs darboties līdzīgi kā ar datu bāzēm. Proti, tas ļauj veikt šādas darbības:
- Ienākšana Postgres terminālī.
- Tabulu importēšana un eksportēšana.
- Izveide
pg_dumpjaunas tabulas vai datu bāzes.
Express.js konteiners expressjs, var nodrošināt šādas iespējas:
- Jaunu datu sniegšana no sistēmas žurnāla.
- Ienākšana terminālī, lai izpildītu noteiktas komandas.
Mijiedarbība ar konteineriem
Pēc tam, kad esam konfigurējuši savienojumu starp konteineriem, izmantojot Docker Compose, ir pienācis laiks nodrošināt mijiedarbību ar šiem konteineriem. Docker Compose sistēmā ir komanda docker-compose, kas atbalsta opciju -f, kas ļauj nodot sistēmai failu docker-compose.yml.
Izmantojot šīs opcijas iespējas, varam ierobežot mijiedarbību ar sistēmu tikai ar tiem konteineriem, kuri minēti failā docker-compose.yml.
Paskatīsimies, kā izskatās mijiedarbība ar konteineriem, izmantojot komandas docker-compose. Ja mēs vēlētos ienākt terminālī psql, attiecīgās komandas varētu izskatīties šādi:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres Tā pati komanda, kuru izmanto, neizmantojot docker-compose, bet docker, varētu izskatīties šādi:
docker exec -it edp_timescale_1 psql -Upostgres Ņemiet vērā, ka šādos gadījumos vienmēr ir ieteicamāk izmantot nevis komandu docker, bet komandu docker-compose, jo tas ļauj izvairīties no nepieciešamības atcerēties konteineru nosaukumus.
Abas iepriekš minētās komandas nav pārāk sarežģītas. Bet, ja mēs izmantotu "apvalku", kas veidots Makefile, kas sniegtu mums saskarni kā vienkāršas komandas un pati izsauktu līdzīgas garas komandas, tad tos pašus rezultātus varētu sasniegt šādi:
make db-shell Ir pilnīgi acīmredzams, ka izmantošana Makefile ievērojami atvieglo darbu ar konteineriem!
Darba piemērs
Pamatojoties uz iepriekšminēto projekta shēmu, izveidosim nākamo failu 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 Lai pārvaldītu Docker Compose konfigurāciju un mijiedarbotos ar konteineriem, kurus tā apraksta, izveidosim nākamo failu 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 -U postgres Lielākā daļa šeit aprakstīto komandu tiek lietotas visiem konteineriem, bet opcijas c= ļauj ierobežot komandas darbības jomu līdz vienam konteineram.
Pēc tam, kad Makefile gatavs, to var izmantot tā:
make help— izvadīt visus pieejamos komandu sarakstus,make.

Palaidiet pieejamo komandu palīdzību
make build— attēla izveide noDockerfile. Mūsu piemērā mēs izmantojām esošās bildestimescaleunping. Bet bildeapiko mēs vēlamies savākt lokāli. Tieši to mēs izdarīsim pēc šīs komandas izpildes.

Docker konteineru veidošana
make start— visu konteineru palaišana. Lai palaistu tikai vienu konteineru, var izmantot komandumake start c=timescale.

Timescale konteineru palaišana

Ping konteineru palaišana
make login-timescale— iekļūšana konteineru bash sesijātimescale.

Bash palaišana timescale konteinerā
make db-shell— iekļūšanapsqlkonteinerātimescalelai veiktu SQL vaicājumus uz datu bāzi.

Psql palaišana timescaledb konteinerā
make stop— konteineru apstādināšana.
![]()
Timescale konteineru apstādināšana
make down— konteineru apstādināšana un dzēšana. Lai dzēstu konkrētu konteineru, var izmantot šo komandu ar norādītu vajadzīgo konteineru. Piemēram —make down c=timescalevaimake down c=api.

Visu konteineru apstādināšana un dzēšana
Secinājumi
Neskatoties uz to, ka Docker Compose sniedz plašu komandu klāstu, kas ir paredzēts konteineru pārvaldībai, dažreiz šīs komandas kļūst garas, līdz ar to tās ir grūti atcerēties.
Izmantošanas metode Makefile palīdzēja mums nodrošināt ātru un vienkāršu mijiedarbību ar konteineriem no faila docker-compose.yml. Proti, runa ir par sekojošo:
- Izstrādātājs sadarbojas tikai ar projekta konteineriem, kas aprakstīti
docker-compose.yml, strādājot netraucē citu palaistu konteineru. - Ja kāda komanda ir aizmirsta, var izpildīt komandu
make helpun saņemt informāciju par pieejamām komandām. - Nav jāatceras garus argumentu sarakstus, lai veiktu tādas darbības kā jaunāko žurnāla ierakstu saņemšana vai iekļūšana sistēmā. Piemēram, komanda
docker-compose -f docker-compose.yml exec timescale psql -Upostgrespārvēršasmake db-shell. - Fails
Makefileto var, projekta attīstoties, pielāgot tādā veidā. Piemēram, nav grūti pievienot komandu datu bāzes dublēšanai vai jebkurai citai rīcībai. - Ja liela izstrādātāju komanda izmanto to pašu
Makefile, tas sakārto sadarbību un samazina kļūdu skaitu.
P.S. Mūsu ir attēls , kas tiek instalēts ar vienu klikšķi. Jūs varat pārbaudīt konteineru darbību uz . Visām jaunajām klientam tiek sniegti 3 dienas bezmaksas testēšanai.
Cienījamie lasītāji! Kā jūs automatizējat darbu ar Docker Compose?
Avots: habr.com
