Κάθε λίγα χρόνια, η βιομηχανία ανάπτυξης λογισμικού υφίσταται μια αλλαγή παραδείγματος. Ένα από αυτά τα φαινόμενα μπορεί να αναγνωριστεί ως το αυξανόμενο ενδιαφέρον για την έννοια των μικροϋπηρεσιών. Αν και οι μικροϋπηρεσίες δεν είναι η πιο πρόσφατη τεχνολογία, μόλις πρόσφατα η δημοτικότητά της κυριολεκτικά εκτοξεύτηκε στα ύψη.
Οι μεγάλες μονολιθικές υπηρεσίες αντικαθίστανται πλέον από ανεξάρτητες, αυτόνομες μικροϋπηρεσίες. Μια microservice μπορεί να θεωρηθεί ως μια εφαρμογή που εξυπηρετεί έναν ενιαίο και πολύ συγκεκριμένο σκοπό. Για παράδειγμα, θα μπορούσε να είναι ένα σχεσιακό DBMS, μια εφαρμογή Express, μια υπηρεσία Solr.
Αυτές τις μέρες, είναι δύσκολο να φανταστεί κανείς την ανάπτυξη ενός νέου συστήματος λογισμικού χωρίς τη χρήση μικροϋπηρεσιών. Και αυτή η κατάσταση, με τη σειρά της, μας οδηγεί στην πλατφόρμα Docker.
Λιμενεργάτης
Πλατφόρμα
Docker Compose
Технология
Όταν εργάζεστε με το Docker Compose, ένα αρχείο YAML χρησιμοποιείται για τη διαμόρφωση των υπηρεσιών εφαρμογών και την οργάνωση της αλληλεπίδρασής τους μεταξύ τους. Το Docker Compose είναι επομένως ένα εργαλείο για την περιγραφή και την εκτέλεση εφαρμογών Docker πολλαπλών κοντέινερ.
Δύο κοντέινερ που λειτουργούν σε ένα κεντρικό σύστημα
Δημιουργία 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
.
Βοήθεια για τις διαθέσιμες εντολές
make build
- συναρμολόγηση εικόνας απόDockerfile
. Στο παράδειγμά μας χρησιμοποιήσαμε υπάρχουσες εικόνεςtimescale
иping
. Αλλά η εικόναapi
θέλουμε να συλλέξουμε τοπικά. Αυτό ακριβώς θα γίνει μετά την εκτέλεση αυτής της εντολής.
Κατασκευή κοντέινερ Docker
make start
— εκτόξευση όλων των εμπορευματοκιβωτίων. Για να εκκινήσετε μόνο ένα κοντέινερ, μπορείτε να χρησιμοποιήσετε μια εντολή όπωςmake start c=timescale
.
Εκτέλεση του κοντέινερ χρονικής κλίμακας
Εκτέλεση ενός κοντέινερ ping
make login-timescale
— συνδεθείτε στη συνεδρία bash του κοντέινερtimescale
.
Running 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