Docker Compose: تبسيط باستخدام Makefile

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

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





عامل ميناء


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

يؤلف عامل الميناء


تم تصميم تقنية Docker Compose لتكوين التطبيقات متعددة الحاويات. يمكن أن يتضمن مشروع Docker Compose العديد من حاويات Docker التي يحتاجها منشئ هذا المشروع.

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


حاويتين تعملان على النظام المضيف

صنع غنو


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

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

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

الاستخدامات النموذجية لتأليف عامل الميناء


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

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

سيحتاج هذا التطبيق إلى 3 حاويات Docker وملف docker-composeيحتوي على تعليمات لإدارة هذه الحاويات. سيكون لكل حاوية حاويات مختلفة من التفاعل. على سبيل المثال ، timescaleيمكنك العمل مع حاوية بنفس الطريقة التي تعمل بها مع قواعد البيانات. وهي تسمح لك بتنفيذ الإجراءات التالية:

  • تسجيل الدخول إلى Postgres shell.
  • جداول الاستيراد والتصدير.
  • إنشاء 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.


إطلاق الحاوية الزمنية


قم بتشغيل حاوية ping

  • make login-timescale- الدخول في جلسة باش للحاوية timescale.


تشغيل باش في حاوية مقياس زمني

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


تشغيل psql في حاوية قياس الوقت

  • 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 لدينا في السوق هناك عامل الميناء الصورة ، التي يتم تثبيتها في نقرة واحدة. يمكنك التحقق من تشغيل الحاويات على VPS . يتم منح جميع العملاء الجدد 3 أيام مجانًا للاختبار.

القراء الأعزاء! كيف تقوم بأتمتة العمل مع Docker Compose؟

Source: https://habr.com/ru/post/undefined/


All Articles