Docker Compose: کار خود را با Makefile ساده کنید

هر چند سال یکبار، صنعت توسعه نرم افزار یک تغییر پارادایم را تجربه می کند. یکی از این پدیده ها را می توان افزایش علاقه به مفهوم میکروسرویس ها دانست. اگرچه میکروسرویس ها جدیدترین فناوری نیستند، اما اخیراً محبوبیت آن به معنای واقعی کلمه افزایش یافته است.

سرویس‌های یکپارچه بزرگ اکنون با میکروسرویس‌های مستقل جایگزین شده‌اند. میکروسرویس را می توان به عنوان یک برنامه کاربردی در نظر گرفت که یک هدف واحد و بسیار خاص را انجام می دهد. به عنوان مثال، می تواند یک DBMS رابطه ای، یک برنامه Express، یک سرویس Solr باشد.

Docker Compose: کار خود را با Makefile ساده کنید

امروزه تصور توسعه یک سیستم نرم افزاری جدید بدون استفاده از میکروسرویس ها دشوار است. و این وضعیت به نوبه خود ما را به پلتفرم Docker هدایت می کند.

کارگر بارانداز

پلت فرم کارگر بارانداز، در توسعه و استقرار میکروسرویس ها، تقریباً به استاندارد صنعتی تبدیل شده است. در وب‌سایت پروژه، می‌توانید یاد بگیرید که Docker تنها پلتفرم کانتینری‌سازی مستقل است که به سازمان‌ها اجازه می‌دهد بدون زحمت هر برنامه‌ای را ایجاد کنند، و همچنین آنها را در هر محیطی توزیع و اجرا کنند - از ابرهای ترکیبی گرفته تا سیستم‌های لبه.

داکور نوشتن

Технология داکور نوشتن طراحی شده برای پیکربندی برنامه های کاربردی چند کانتینری. یک پروژه Docker Compose می‌تواند به همان تعداد کانتینر Docker داشته باشد که خالق آن پروژه نیاز دارد.

هنگام کار با Docker Compose، یک فایل YAML برای پیکربندی سرویس های برنامه و سازماندهی تعامل آنها با یکدیگر استفاده می شود. بنابراین Docker Compose ابزاری برای توصیف و اجرای برنامه‌های Docker چند کانتینری است.

Docker Compose: کار خود را با Makefile ساده کنید
دو کانتینر در حال اجرا بر روی یک سیستم میزبان

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.

Docker Compose: کار خود را با Makefile ساده کنید
راهنمایی برای دستورات موجود

  • make build - ساخت تصویر از Dockerfile. در مثال ما از تصاویر موجود استفاده کردیم timescale и ping. اما تصویر api ما می خواهیم به صورت محلی بسازیم. این دقیقا همان کاری است که پس از اجرای این دستور انجام خواهد شد.

Docker Compose: کار خود را با Makefile ساده کنید
ساخت کانتینر داکر

  • make start - تمام ظروف را راه اندازی کنید. برای اجرای تنها یک کانتینر، می توانید از دستوری مانند استفاده کنید make start c=timescale.

Docker Compose: کار خود را با Makefile ساده کنید
اجرای ظرف مقیاس زمانی

Docker Compose: کار خود را با Makefile ساده کنید
اجرای یک ظرف پینگ

  • make login-timescale - وارد جلسه bash کانتینر شوید timescale.

Docker Compose: کار خود را با Makefile ساده کنید
اجرای bash در یک ظرف مقیاس زمانی

  • make db-shell - ورودی به psql در یک ظرف timescale برای اجرای پرس و جوهای SQL در برابر پایگاه داده.

Docker Compose: کار خود را با Makefile ساده کنید
اجرای psql در یک ظرف timescaledb

  • make stop - کانتینرها را متوقف کنید.

Docker Compose: کار خود را با Makefile ساده کنید
توقف کانتینر مقیاس زمانی

  • make down - توقف و حذف ظروف. برای حذف یک کانتینر خاص، می توانید از این دستور استفاده کنید و ظرف مورد نظر را مشخص کنید. مثلا - make down c=timescale یا make down c=api.

Docker Compose: کار خود را با Makefile ساده کنید
تمام کانتینرها را متوقف و حذف کنید

نمایش نتایج: از

حتی اگر سیستم 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 در ما بازار یک تصویر وجود دارد کارگر بارانداز، که با یک کلیک نصب می شود. می توانید ظروف کار را بررسی کنید VPS. به تمام مشتریان جدید 3 روز آزمایش رایگان داده می شود.

خوانندگان عزیز! چگونه کار با Docker Compose را خودکار می کنید؟

Docker Compose: کار خود را با Makefile ساده کنید

منبع: www.habr.com

اضافه کردن نظر