Docker Compose: Απλοποίηση της εργασίας σας χρησιμοποιώντας Makefiles

Κάθε λίγα χρόνια, η βιομηχανία ανάπτυξης λογισμικού υφίσταται μια αλλαγή παραδείγματος. Ένα από αυτά τα φαινόμενα μπορεί να αναγνωριστεί ως το αυξανόμενο ενδιαφέρον για την έννοια των μικροϋπηρεσιών. Αν και οι μικροϋπηρεσίες δεν είναι η πιο πρόσφατη τεχνολογία, μόλις πρόσφατα η δημοτικότητά της κυριολεκτικά εκτοξεύτηκε στα ύψη.

Οι μεγάλες μονολιθικές υπηρεσίες αντικαθίστανται πλέον από ανεξάρτητες, αυτόνομες μικροϋπηρεσίες. Μια microservice μπορεί να θεωρηθεί ως μια εφαρμογή που εξυπηρετεί έναν ενιαίο και πολύ συγκεκριμένο σκοπό. Για παράδειγμα, θα μπορούσε να είναι ένα σχεσιακό DBMS, μια εφαρμογή Express, μια υπηρεσία Solr.

Docker Compose: Απλοποίηση της εργασίας σας χρησιμοποιώντας Makefiles

Αυτές τις μέρες, είναι δύσκολο να φανταστεί κανείς την ανάπτυξη ενός νέου συστήματος λογισμικού χωρίς τη χρήση μικροϋπηρεσιών. Και αυτή η κατάσταση, με τη σειρά της, μας οδηγεί στην πλατφόρμα Docker.

Λιμενεργάτης

Πλατφόρμα Λιμενεργάτης, στην ανάπτυξη και ανάπτυξη μικροϋπηρεσιών, έχει γίνει σχεδόν ένα βιομηχανικό πρότυπο. Στον ιστότοπο του έργου μπορείτε να μάθετε ότι το Docker είναι η μόνη ανεξάρτητη πλατφόρμα μεταφοράς εμπορευματοκιβωτίων που επιτρέπει στους οργανισμούς να δημιουργούν αβίαστα οποιαδήποτε εφαρμογή, καθώς και να τις διανέμουν και να τις εκτελούν σε οποιοδήποτε περιβάλλον - από υβριδικά σύννεφα έως συστήματα ακμών.

Docker Compose

Технология Docker Compose σχεδιασμένο για τη διαμόρφωση εφαρμογών πολλαπλών κοντέινερ. Ένα έργο Docker Compose μπορεί να περιέχει τόσα κοντέινερ Docker όσα χρειάζεται ο δημιουργός του έργου.

Όταν εργάζεστε με το Docker Compose, ένα αρχείο YAML χρησιμοποιείται για τη διαμόρφωση των υπηρεσιών εφαρμογών και την οργάνωση της αλληλεπίδρασής τους μεταξύ τους. Το Docker Compose είναι επομένως ένα εργαλείο για την περιγραφή και την εκτέλεση εφαρμογών Docker πολλαπλών κοντέινερ.

Docker Compose: Απλοποίηση της εργασίας σας χρησιμοποιώντας Makefiles
Δύο κοντέινερ που λειτουργούν σε ένα κεντρικό σύστημα

Δημιουργία GNU

Πρόγραμμα make, είναι ουσιαστικά ένα εργαλείο για την αυτοματοποίηση της δημιουργίας προγραμμάτων και βιβλιοθηκών από τον πηγαίο κώδικα. Σε γενικές γραμμές, μπορούμε να το πούμε αυτό make ισχύει για οποιαδήποτε διαδικασία που περιλαμβάνει την εκτέλεση αυθαίρετων εντολών για τη μετατροπή ορισμένων υλικών εισόδου σε κάποια μορφή εξόδου, σε κάποιο στόχο. Στην περίπτωσή μας οι εντολές docker-compose θα μετατραπεί σε αφηρημένους στόχους (Τηλεφωνικοί στόχοι).

Για να πω το πρόγραμμα make για το τι θέλουμε από αυτό, χρειαζόμαστε ένα αρχείο Makefile.

Σε μας Makefile θα περιέχει κανονικές εντολές docker и docker-compose, τα οποία έχουν σχεδιαστεί για να λύνουν πολλά προβλήματα. Δηλαδή, μιλάμε για τη συναρμολόγηση ενός κοντέινερ, για την εκκίνηση, τη διακοπή του, την επανεκκίνηση του, για την οργάνωση της σύνδεσης χρήστη στο κοντέινερ, για την εργασία με αρχεία καταγραφής κοντέινερ και για την επίλυση άλλων παρόμοιων προβλημάτων.

Τυπικές περιπτώσεις χρήσης για Docker Compose

Ας φανταστούμε μια κανονική εφαρμογή Ιστού που έχει τα ακόλουθα στοιχεία:

  • Βάση δεδομένων TimescaleDB (Postgres).
  • Εφαρμογή Express.js.
  • Ping (απλώς ένα δοχείο, δεν κάνει κάτι ιδιαίτερο).

Αυτή η εφαρμογή θα χρειαστεί 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: Απλοποίηση της εργασίας σας χρησιμοποιώντας Makefiles
Βοήθεια για τις διαθέσιμες εντολές

  • make build - συναρμολόγηση εικόνας από Dockerfile. Στο παράδειγμά μας χρησιμοποιήσαμε υπάρχουσες εικόνες timescale и ping. Αλλά η εικόνα api θέλουμε να συλλέξουμε τοπικά. Αυτό ακριβώς θα γίνει μετά την εκτέλεση αυτής της εντολής.

Docker Compose: Απλοποίηση της εργασίας σας χρησιμοποιώντας Makefiles
Κατασκευή κοντέινερ Docker

  • make start — εκτόξευση όλων των εμπορευματοκιβωτίων. Για να εκκινήσετε μόνο ένα κοντέινερ, μπορείτε να χρησιμοποιήσετε μια εντολή όπως make start c=timescale.

Docker Compose: Απλοποίηση της εργασίας σας χρησιμοποιώντας Makefiles
Εκτέλεση του κοντέινερ χρονικής κλίμακας

Docker Compose: Απλοποίηση της εργασίας σας χρησιμοποιώντας Makefiles
Εκτέλεση ενός κοντέινερ ping

  • make login-timescale — συνδεθείτε στη συνεδρία bash του κοντέινερ timescale.

Docker Compose: Απλοποίηση της εργασίας σας χρησιμοποιώντας Makefiles
Running bash σε κοντέινερ χρονικής κλίμακας

  • make db-shell - είσοδος σε psql σε ένα δοχείο timescale για την εκτέλεση ερωτημάτων SQL στη βάση δεδομένων.

Docker Compose: Απλοποίηση της εργασίας σας χρησιμοποιώντας Makefiles
Εκτέλεση psql σε κοντέινερ timescaledb

  • make stop — δοχεία αναστολής.

Docker Compose: Απλοποίηση της εργασίας σας χρησιμοποιώντας Makefiles
Διακοπή ενός κοντέινερ χρονικής κλίμακας

  • make down — σταμάτημα και αφαίρεση δοχείων. Για να αφαιρέσετε ένα συγκεκριμένο κοντέινερ, μπορείτε να χρησιμοποιήσετε αυτήν την εντολή προσδιορίζοντας το επιθυμητό κοντέινερ. Για παράδειγμα - make down c=timescale ή make down c=api.

Docker Compose: Απλοποίηση της εργασίας σας χρησιμοποιώντας Makefiles
Διακοπή και διαγραφή όλων των κοντέινερ

Αποτελέσματα της

Αν και το 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: Απλοποίηση της εργασίας σας χρησιμοποιώντας Makefiles

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο