هر چند سال یکبار، صنعت توسعه نرم افزار یک تغییر پارادایم را تجربه می کند. یکی از این پدیده ها را می توان افزایش علاقه به مفهوم میکروسرویس ها دانست. اگرچه میکروسرویس ها جدیدترین فناوری نیستند، اما اخیراً محبوبیت آن به معنای واقعی کلمه افزایش یافته است.
سرویسهای یکپارچه بزرگ اکنون با میکروسرویسهای مستقل جایگزین شدهاند. میکروسرویس را می توان به عنوان یک برنامه کاربردی در نظر گرفت که یک هدف واحد و بسیار خاص را انجام می دهد. به عنوان مثال، می تواند یک 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.
- پینگ (فقط ظرفی که کار خاصی انجام نمی دهد).
این برنامه به 3 کانتینر داکر و یک فایل نیاز دارد docker-compose
حاوی دستورالعمل هایی برای مدیریت این ظروف. هر یک از کانتینرها نقاط تعامل متفاوتی خواهند داشت. مثلا با ظرف timescale
کار تقریباً مشابه کار با پایگاه داده امکان پذیر خواهد بود. یعنی به شما اجازه می دهد کارهای زیر را انجام دهید:
- وارد پوسته Postgres شوید.
- واردات و صادرات میز.
- ایجاد
pg_dump
جداول یا پایگاه های داده
ظرف برنامه Express.js، expressjs
، ممکن است دارای ویژگی های زیر باشد:
- صدور اطلاعات تازه از گزارش سیستم.
- وارد کردن یک پوسته برای اجرای دستورات خاص.
تعامل با ظروف
اکنون که ارتباط بین کانتینرها را با استفاده از 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
ما می خواهیم به صورت محلی بسازیم. این دقیقا همان کاری است که پس از اجرای این دستور انجام خواهد شد.
ساخت کانتینر داکر
make start
- تمام ظروف را راه اندازی کنید. برای اجرای تنها یک کانتینر، می توانید از دستوری مانند استفاده کنیدmake start c=timescale
.
اجرای ظرف مقیاس زمانی
اجرای یک ظرف پینگ
make login-timescale
- وارد جلسه bash کانتینر شویدtimescale
.
اجرای 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 را خودکار می کنید؟
منبع: www.habr.com