Docker Compose: تبسيط عملك مع Makefile

كل بضع سنوات ، تشهد صناعة تطوير البرمجيات نقلة نوعية. يمكن التعرف على إحدى هذه الظواهر على أنها الاهتمام المتزايد بمفهوم الخدمات المصغرة. على الرغم من أن الخدمات المصغرة ليست من أحدث التقنيات ، إلا أن شعبيتها قد ارتفعت مؤخرًا بشكل كبير.

يتم الآن استبدال الخدمات المتجانسة الكبيرة بخدمات مصغرة مستقلة قائمة بذاتها. يمكن اعتبار الخدمة المصغرة كتطبيق يخدم غرضًا واحدًا ومحددًا للغاية. على سبيل المثال ، يمكن أن يكون نظام DBMS علاقيًا أو تطبيقًا سريعًا أو خدمة Solr.

Docker Compose: تبسيط عملك مع Makefile

في الوقت الحاضر ، من الصعب تخيل تطوير نظام برمجي جديد دون استخدام الخدمات المصغرة. وهذا الموقف ، بدوره ، يقودنا إلى منصة Docker.

عامل في حوض السفن

منصة التداول عامل في حوض السفن، في تطوير ونشر الخدمات المصغرة ، أصبح معيار الصناعة تقريبًا. على موقع الويب الخاص بالمشروع ، يمكنك معرفة أن Docker هي منصة الحاويات المستقلة الوحيدة التي تسمح للمؤسسات بإنشاء أي تطبيقات بسهولة ، وكذلك توزيعها وتشغيلها في أي بيئة - من السحب المختلطة إلى أنظمة الحافة.

دوكر يؤلف

Технология دوكر يؤلف مصممة لتكوين تطبيقات متعددة الحاويات. يمكن أن يحتوي مشروع Docker Compose على العديد من حاويات Docker التي يحتاجها منشئ هذا المشروع.

عند العمل باستخدام Docker Compose ، يتم استخدام ملف YAML لتكوين خدمات التطبيقات وتنظيم تفاعلها مع بعضها البعض. وبالتالي ، فإن Docker Compose هي أداة لوصف وتشغيل تطبيقات Docker متعددة الحاويات.

Docker Compose: تبسيط عملك مع Makefile
حاويتان تعملان على نظام مضيف

صنع غنو

برنامج make، في جوهرها ، هي أداة لأتمتة تجميع البرامج والمكتبات من التعليمات البرمجية المصدر. بشكل عام ، يمكن القول أن make تنطبق على أي عملية تتضمن تنفيذ أوامر تعسفية لتحويل بعض المواد المصدر إلى نتيجة نهائية ما ، إلى غرض ما. في حالتنا ، الأوامر docker-compose سيتم تحويلها إلى أهداف مجردة (أهداف زائفة).

ليقول البرنامج make حول ما نريده منها ، نحتاج إلى ملف Makefile.

لدينا في Makefile سوف تحتوي على الأوامر المعتادة docker и docker-compose، والتي تم تصميمها لحل مجموعة متنوعة من المشاكل. أي أننا نتحدث عن تجميع حاوية ، وبدء تشغيلها ، وإيقافها ، وإعادة تشغيلها ، وتنظيم دخول المستخدم إلى الحاوية ، والعمل مع سجلات الحاوية ، وحل المهام المماثلة الأخرى.

حالات الاستخدام النموذجية لـ Docker Compose

تخيل تطبيق ويب نموذجي يحتوي على المكونات التالية:

  • قاعدة بيانات TimescaleDB (Postgres).
  • تطبيق Express.js.
  • بينغ (مجرد حاوية لا تفعل أي شيء خاص).

سيحتاج هذا التطبيق إلى 3 حاويات Docker وملف 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
بناء حاوية Docker

  • make start - بدء تشغيل جميع الحاويات. لتشغيل حاوية واحدة فقط ، يمكنك استخدام أمر مثل make start c=timescale.

Docker Compose: تبسيط عملك مع Makefile
تشغيل حاوية مقياس الوقت

Docker Compose: تبسيط عملك مع Makefile
تشغيل حاوية ping

  • make login-timescale - تسجيل الدخول إلى جلسة bash من الحاوية timescale.

Docker Compose: تبسيط عملك مع Makefile
تشغيل bash في حاوية مقياس الوقت

  • make db-shell - مدخل ل psql في حاوية timescale لتنفيذ استعلامات SQL على قاعدة البيانات.

Docker Compose: تبسيط عملك مع Makefile
تشغيل psql في حاوية مقياس الوقت

  • 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

إضافة تعليق