Մի քանի տարին մեկ ծրագրային ապահովման մշակման արդյունաբերությունը ենթարկվում է պարադիգմային փոփոխության: Այս երեւույթներից մեկը կարելի է ճանաչել որպես միկրոծառայությունների հայեցակարգի նկատմամբ աճող հետաքրքրությունը։ Չնայած միկրոսերվիսները նորագույն տեխնոլոգիաներ չեն, միայն վերջերս է դրա ժողովրդականությունը բառացիորեն կտրուկ աճել:
Խոշոր մոնոլիտ ծառայություններն այժմ փոխարինվում են անկախ, ինքնավար միկրոծառայություններով: Միկրոծառայությունը կարելի է համարել որպես ծրագիր, որը ծառայում է մեկ և շատ կոնկրետ նպատակի: Օրինակ, դա կարող է լինել հարաբերական DBMS, Express հավելված, Solr ծառայություն:
Այս օրերին դժվար է պատկերացնել նոր ծրագրային համակարգի մշակում առանց միկրոծառայությունների օգտագործման: Եվ այս իրավիճակն իր հերթին մեզ տանում է դեպի Docker հարթակ։
դոկեր
Հարթակ
Դոկտոր կազմեք
Технология
Docker Compose-ի հետ աշխատելիս YAML ֆայլն օգտագործվում է հավելվածի ծառայությունները կարգավորելու և դրանց փոխազդեցությունը միմյանց հետ կազմակերպելու համար: Հետևաբար, Docker Compose-ը գործիք է բազմաբեռնարկղերով Docker հավելվածները նկարագրելու և գործարկելու համար:
Երկու կոնտեյներ, որոնք աշխատում են հյուրընկալող համակարգով
GNU Դարձնել
Ծրագիր make
, ըստ էության գործիք է սկզբնական կոդից ծրագրերի և գրադարանների կառուցման ավտոմատացման համար: Ընդհանուր առմամբ, կարելի է ասել, որ make
կիրառվում է ցանկացած գործընթացի վրա, որը ներառում է կամայական հրամանների կատարում՝ որոշ մուտքային նյութեր ինչ-որ ելքային ձևի փոխակերպելու նպատակով։ Մեր դեպքում հրամանները docker-compose
կվերածվի վերացական նպատակների (
Ծրագիրը պատմելու համար make
այն մասին, թե ինչ ենք ուզում դրանից, մեզ անհրաժեշտ է ֆայլ Makefile
.
Մեր Makefile
կպարունակի կանոնավոր հրամաններ docker
и docker-compose
, որոնք նախատեսված են բազմաթիվ խնդիրներ լուծելու համար։ Մասնավորապես, մենք խոսում ենք կոնտեյներ հավաքելու, այն գործարկելու, դադարեցնելու, վերագործարկելու, կոնտեյներ օգտատերերի մուտքը կազմակերպելու, կոնտեյների տեղեկամատյանների հետ աշխատելու և նմանատիպ այլ խնդիրների լուծման մասին:
Տիպիկ օգտագործման դեպքեր Docker Compose-ի համար
Եկեք պատկերացնենք սովորական վեբ հավելված, որն ունի հետևյալ բաղադրիչները.
- TimescaleDB տվյալների բազա (Postgres):
- Express.js հավելված։
- Ping (ընդամենը կոնտեյներ, հատուկ բան չի անում):
Այս հավելվածին անհրաժեշտ կլինի 3 Docker կոնտեյներ և ֆայլ docker-compose
, որը պարունակում է այս տարաների կառավարման հրահանգներ: Յուրաքանչյուր կոնտեյներ կունենա տարբեր հպման կետեր: Օրինակ՝ կոնտեյներով timescale
հնարավոր կլինի աշխատել մոտավորապես այնպես, ինչպես աշխատում են տվյալների բազաների հետ։ Մասնավորապես, այն թույլ է տալիս կատարել հետևյալ գործողությունները.
- Մուտք գործել Postgres shell:
- Սեղանների ներմուծում և արտահանում։
- ստեղծում
pg_dump
աղյուսակներ կամ տվյալների բազաներ:
Express.js հավելվածի կոնտեյներ, expressjs
, կարող է ունենալ հետևյալ հնարավորությունները.
- Համակարգի մատյանից թարմ տվյալների տրամադրում:
- Մուտք գործեք shell՝ որոշակի հրամաններ կատարելու համար:
Փոխազդեցություն բեռնարկղերի հետ
Երբ մենք կարգավորենք կապը կոնտեյների միջև Docker Compose-ի միջոցով, ժամանակն է շփվել այդ կոնտեյներների հետ: Docker Compose համակարգում կա հրաման docker-compose
, աջակցող տարբերակ -f
, որը թույլ է տալիս ֆայլ փոխանցել համակարգ docker-compose.yml
.
Օգտագործելով այս տարբերակի հնարավորությունները, դուք կարող եք սահմանափակել համակարգի հետ փոխգործակցությունը միայն այն բեռնարկղերով, որոնք նշված են ֆայլում: docker-compose.yml
.
Եկեք տեսնենք, թե ինչ տեսք ունեն բեռնարկղերի հետ փոխազդեցությունները հրամաններ օգտագործելիս docker-compose
. Եթե պատկերացնենք, որ պետք է մուտք գործել պատյան psql
, ապա համապատասխան հրամանները կարող են այսպիսի տեսք ունենալ.
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
Նույն հրամանը, որը չի օգտագործվում կատարելու համար docker-compose
Իսկ docker
, կարող է այսպիսի տեսք ունենալ.
docker exec -it edp_timescale_1 psql -Upostgres
Խնդրում ենք նկատի ունենալ, որ նման դեպքերում միշտ նախընտրելի է օգտագործել հրամանը docker
, և հրամանը docker-compose
, քանի որ դա վերացնում է բեռնարկղերի անունները հիշելու անհրաժեշտությունը:
Վերոհիշյալ երկու հրամաններն այնքան էլ դժվար չեն: Բայց եթե ձևի մեջ օգտագործեինք «փաթաթան». Makefile
, որը մեզ կտա ինտերֆեյս պարզ հրամանների տեսքով և ինքնին կկոչեր նմանատիպ երկար հրամաններ, ապա նույն արդյունքներին կարելի է հասնել հետևյալ կերպ.
make db-shell
Միանգամայն ակնհայտ է, որ օգտագործումը Makefile
շատ ավելի հեշտ է դարձնում տարաների հետ աշխատանքը:
Աշխատանքային օրինակ
Ելնելով վերը նշված նախագծի դիագրամից՝ մենք կստեղծենք հետևյալ ֆայլը 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
Docker Compose կոնֆիգուրացիան կառավարելու և դրա նկարագրած բեռնարկղերի հետ փոխազդելու համար մենք կստեղծենք հետևյալ ֆայլը 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
Այստեղ նկարագրված հրամանների մեծ մասը վերաբերում է բոլոր բեռնարկղերին, սակայն օգտագործելով տարբերակը c=
թույլ է տալիս սահմանափակել հրամանի շրջանակը մեկ կոնտեյներով:
Հետո Makefile
պատրաստ է, կարող եք օգտագործել այսպես.
make help
- թողարկելով բոլոր հրամանների ցանկը, որոնք հասանելի ենmake
.
Օգնություն հասանելի հրամանների վերաբերյալ
make build
- պատկերի հավաքումDockerfile
. Մեր օրինակում մենք օգտագործել ենք գոյություն ունեցող պատկերներtimescale
иping
. Բայց պատկերըapi
մենք ցանկանում ենք հավաքել տեղում: Սա հենց այն է, ինչ արվելու է այս հրամանը կատարելուց հետո:
Docker կոնտեյների կառուցում
make start
- գործարկել բոլոր բեռնարկղերը: Միայն մեկ կոնտեյներ գործարկելու համար կարող եք օգտագործել այնպիսի հրաման, ինչպիսին էmake start c=timescale
.
Ժամանակացույցի կոնտեյների գործարկում
Պինգ կոնտեյների վարում
make login-timescale
— մուտք գործել կոնտեյների bash նիստtimescale
.
Running bash-ը ժամանակային կոնտեյներով
make db-shell
- մուտքpsql
տարայի մեջtimescale
տվյալների բազայի նկատմամբ SQL հարցումներ իրականացնելու համար:
PSQL-ի գործարկում timescaledb կոնտեյներով
make stop
- կանգնեցնող տարաներ.
Ժամկետային կոնտեյների դադարեցում
make down
- բեռնարկղերի դադարեցում և հեռացում: Հատուկ կոնտեյներ հեռացնելու համար կարող եք օգտագործել այս հրամանը՝ նշելով ցանկալի բեռնարկղը: Օրինակ -make down c=timescale
կամmake down c=api
.
Բոլոր բեռնարկղերի դադարեցում և ջնջում
Արդյունքները
Թեև Docker Compose-ը մեզ տալիս է բեռնարկղերի կառավարման հրամանների հարուստ հավաքածու, երբեմն այդ հրամանները կարող են երկար ու դժվար հիշել:
Օգտագործման եղանակը Makefile
օգնեց մեզ ստեղծել արագ և հեշտ փոխազդեցություն ֆայլի բեռնարկղերի հետ docker-compose.yml
. Խոսքը, մասնավորապես, հետևյալի մասին է.
- Մշակողը շփվում է միայն նախագծի բեռնարկղերի հետ, որոնք նկարագրված են
docker-compose.yml
, աշխատանքին չեն խանգարում այլ հոսող տարաներ։ - Այն դեպքում, երբ որոշակի հրամանը մոռացվում է, կարող եք կատարել հրամանը
make help
և ստացեք օգնություն հասանելի հրամանների վերաբերյալ: - Պետք չէ հիշել փաստարկների երկար ցուցակները, որպեսզի կատարեք այնպիսի գործողություններ, ինչպիսիք են գրանցամատյանում վերջին գրառումները ստանալը կամ համակարգ մուտք գործելը: Օրինակ՝ նման հրաման
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
վերածվում էmake db-shell
. - ֆայլ
Makefile
Դուք կարող եք ճկուն կերպով հարմարվել դրան, քանի որ նախագիծը մեծանում է: Օրինակ, հեշտ է հրաման ավելացնել տվյալների բազայի կրկնօրինակում ստեղծելու կամ որևէ այլ գործողություն կատարելու համար: - Եթե մշակողների մեծ թիմը օգտագործում է նույնը
Makefile
, սա հեշտացնում է համագործակցությունը և նվազեցնում սխալները:
PS Մեր
Հարգելի ընթերցողներ: Ինչպե՞ս եք ավտոմատացնում Docker Compose-ը:
Source: www.habr.com