Har bir necha yilda dasturiy ta'minot ishlab chiqish sanoati paradigma o'zgarishiga duch keladi. Ushbu hodisalardan biri mikroservislar kontseptsiyasiga bo'lgan qiziqishning ortib borayotgani sifatida tan olinishi mumkin. Mikroservislar eng yangi texnologiya bo'lmasa-da, yaqinda uning mashhurligi tom ma'noda keskin oshdi.
Yirik monolit xizmatlar endi mustaqil, avtonom mikroservislar bilan almashtirilmoqda. Mikroservisni bitta va juda aniq maqsadga xizmat qiluvchi dastur sifatida qarash mumkin. Masalan, bu relyatsion DBMS, Express ilovasi, Solr xizmati bo'lishi mumkin.
Hozirgi kunda mikroservislardan foydalanmasdan yangi dasturiy ta'minot tizimini ishlab chiqishni tasavvur qilish qiyin. Va bu holat, o'z navbatida, bizni Docker platformasiga olib boradi.
Docker
Platformalar
Docker tuzish
texnologiya
Docker Compose bilan ishlashda YAML fayli ilova xizmatlarini sozlash va ularning bir-biri bilan oʻzaro aloqalarini tashkil qilish uchun ishlatiladi. Shuning uchun Docker Compose ko'p konteynerli Docker ilovalarini tavsiflash va ishga tushirish uchun vositadir.
Xost tizimida ishlaydigan ikkita konteyner
GNU Make
Dastur make
, aslida manba kodidan dasturlar va kutubxonalar qurishni avtomatlashtirish vositasidir. Umuman olganda, buni aytishimiz mumkin make
ba'zi kiritilgan materiallarni qandaydir chiqish shakliga, qandaydir maqsadga aylantirish uchun ixtiyoriy buyruqlarni bajarishni o'z ichiga olgan har qanday jarayonga taalluqlidir. Bizning holatda, buyruqlar docker-compose
mavhum maqsadlarga aylanadi (
Dastur aytish uchun make
undan nima istayotganimiz haqida bizga fayl kerak Makefile
.
Bizning Makefile
muntazam buyruqlarni o'z ichiga oladi docker
и docker-compose
, ular ko'p muammolarni hal qilish uchun mo'ljallangan. Ya'ni, biz konteynerni yig'ish, uni ishga tushirish, to'xtatish, qayta ishga tushirish, konteynerga foydalanuvchi loginini tashkil qilish, konteyner jurnallari bilan ishlash va shunga o'xshash boshqa muammolarni hal qilish haqida gapiramiz.
Docker Compose uchun odatiy foydalanish holatlari
Keling, quyidagi komponentlarga ega oddiy veb-ilovani tasavvur qilaylik:
- TimescaleDB ma'lumotlar bazasi (Postgres).
- Express.js ilovasi.
- Ping (shunchaki konteyner, maxsus hech narsa qilmaydi).
Ushbu ilovaga 3 ta Docker konteyneri va fayl kerak bo'ladi docker-compose
, unda ushbu konteynerlarni boshqarish bo'yicha ko'rsatmalar mavjud. Har bir konteyner turli xil aloqa nuqtalariga ega bo'ladi. Masalan, konteyner bilan timescale
ular ma'lumotlar bazalari bilan qanday ishlaydi, taxminan xuddi shunday ishlash mumkin bo'ladi. Ya'ni, u quyidagi amallarni bajarishga imkon beradi:
- Postgres qobig'iga kirish.
- Jadvallarni import va eksport qilish.
- yaratilish
pg_dump
jadvallar yoki ma'lumotlar bazalari.
Express.js dastur konteyneri, expressjs
, quyidagi imkoniyatlarga ega bo'lishi mumkin:
- Tizim jurnalidan yangi ma'lumotlarni taqdim etish.
- Muayyan buyruqlarni bajarish uchun qobiqqa kiring.
Konteynerlar bilan ishlash
Docker Compose yordamida konteynerlar o‘rtasida aloqa o‘rnatganimizdan so‘ng, bu konteynerlar bilan bog‘lanish vaqti keldi. Docker Compose tizimida buyruq mavjud docker-compose
, qo'llab-quvvatlovchi variant -f
, bu sizga faylni tizimga o'tkazish imkonini beradi docker-compose.yml
.
Ushbu parametrning imkoniyatlaridan foydalanib, siz tizim bilan o'zaro aloqani faqat faylda ko'rsatilgan konteynerlar bilan cheklashingiz mumkin. docker-compose.yml
.
Keling, buyruqlardan foydalanganda konteynerlar bilan o'zaro aloqalar qanday bo'lishini ko'rib chiqaylik docker-compose
. Agar biz qobiqqa kirishimiz kerakligini tasavvur qilsak psql
, keyin tegishli buyruqlar quyidagicha ko'rinishi mumkin:
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
Amalga oshirish uchun ishlatilmaydigan bir xil buyruq docker-compose
va docker
, shunday ko'rinishi mumkin:
docker exec -it edp_timescale_1 psql -Upostgres
E'tibor bering, bunday hollarda buyruqni ishlatish har doim afzalroqdir docker
, va jamoa docker-compose
, chunki bu konteyner nomlarini eslab qolish zaruratini yo'q qiladi.
Yuqoridagi ikkala buyruq ham unchalik qiyin emas. Ammo formada "o'rash" dan foydalansak Makefile
, bu bizga oddiy buyruqlar ko'rinishidagi interfeysni beradi va o'zi shunga o'xshash uzun buyruqlar deb atasa, xuddi shunday natijalarga erishish mumkin:
make db-shell
Foydalanish juda aniq Makefile
konteynerlar bilan ishlashni ancha osonlashtiradi!
Ishlash namunasi
Yuqoridagi loyiha diagrammasi asosida quyidagi faylni yaratamiz 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 konfiguratsiyasini boshqarish va u tasvirlangan konteynerlar bilan ishlash uchun biz quyidagi faylni yaratamiz. 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
Bu erda tasvirlangan buyruqlarning ko'pchiligi barcha konteynerlar uchun amal qiladi, lekin variantni ishlatadi c=
buyruq doirasini bitta konteyner bilan cheklash imkonini beradi.
so'ng Makefile
tayyor, siz uni quyidagicha ishlatishingiz mumkin:
make help
— mavjud bo'lgan barcha buyruqlar ro'yxatini chiqarishmake
.
Mavjud buyruqlar bo'yicha yordam
make build
- dan tasvirni yig'ishDockerfile
. Bizning misolimizda biz mavjud rasmlardan foydalandiktimescale
иping
. Lekin tasvirapi
biz mahalliy yig'ishni xohlaymiz. Bu buyruqni bajargandan so'ng aynan shunday bo'ladi.
Docker konteynerini qurish
make start
— barcha konteynerlarni ishga tushirish. Faqat bitta konteynerni ishga tushirish uchun siz kabi buyruqdan foydalanishingiz mumkinmake start c=timescale
.
Vaqt shkalasi konteynerini ishga tushirish
Ping konteynerini ishga tushirish
make login-timescale
— konteynerning bash sessiyasiga kiringtimescale
.
Vaqt shkalasi konteynerida bash ishga tushirilmoqda
make db-shell
- kirishpsql
konteynerdatimescale
ma'lumotlar bazasiga qarshi SQL so'rovlarini bajarish uchun.
Psql-ni timescaledb konteynerida ishga tushirish
make stop
- konteynerlarni to'xtatish.
Vaqt o'lchovi konteynerini to'xtatish
make down
- idishlarni to'xtatish va olib tashlash. Muayyan konteynerni olib tashlash uchun siz kerakli konteynerni ko'rsatgan holda ushbu buyruqdan foydalanishingiz mumkin. Masalan -make down c=timescale
yokimake down c=api
.
Barcha konteynerlarni to'xtatish va o'chirish
natijalar
Garchi Docker Compose bizga konteynerlarni boshqarish bo'yicha boy buyruqlar to'plamini taqdim etsa ham, ba'zida bu buyruqlar uzoq va eslab qolish qiyin bo'lishi mumkin.
Foydalanish usuli Makefile
fayldagi konteynerlar bilan tez va oson oʻzaro aloqa oʻrnatishimizga yordam berdi docker-compose.yml
. Ya'ni, biz quyidagilar haqida gapiramiz:
- Ishlab chiquvchi faqat maqolada tasvirlangan loyiha konteynerlari bilan o'zaro ishlaydi
docker-compose.yml
, ishga boshqa ishlaydigan konteynerlar xalaqit bermaydi. - Agar ma'lum bir buyruq unutilgan bo'lsa, siz buyruqni bajarishingiz mumkin
make help
va mavjud buyruqlar bo'yicha yordam oling. - Eng so'nggi jurnal yozuvlarini olish yoki tizimga kirish kabi amallarni bajarish uchun argumentlarning uzun ro'yxatini eslab qolish shart emas. Masalan, kabi buyruq
docker-compose -f docker-compose.yml exec timescale psql -Upostgres
aylanadimake db-shell
. - Fayl
Makefile
Loyiha o'sib borishi bilan siz unga moslashuvchan tarzda moslashingiz mumkin. Misol uchun, ma'lumotlar bazasi zahirasini yaratish yoki boshqa har qanday amalni bajarish uchun buyruq qo'shish oson. - Agar ishlab chiquvchilarning katta jamoasi xuddi shunday foydalansa
Makefile
, bu hamkorlikni soddalashtiradi va xatolarni kamaytiradi.
PS Bizning
Hurmatli o'quvchilar! Docker Composeni qanday avtomatlashtirasiz?
Manba: www.habr.com