Docker Compose: από την ανάπτυξη στην παραγωγή

Μετάφραση της μεταγραφής του podcast που ετοιμάστηκε εν όψει της έναρξης του μαθήματος "Διαχειριστής Linux"

Docker Compose: από την ανάπτυξη στην παραγωγή

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

Με την έλευση του docker compose v3 αυτά τα αρχεία YAML μπορούν να χρησιμοποιηθούν απευθείας στο περιβάλλον παραγωγής, όταν εργάζεστε με
σύμπλεγμα Σμήνος Docker.

Αλλά αυτό σημαίνει ότι μπορείτε να χρησιμοποιήσετε το ίδιο αρχείο docker-compose στο
διαδικασία ανάπτυξης και περιβάλλον παραγωγής; Ή χρησιμοποιήστε το ίδιο αρχείο για
σκαλωσιά? Λοιπόν, γενικά, ναι, αλλά για τέτοια λειτουργικότητα χρειαζόμαστε τα εξής:

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

Διαφορές μεταξύ αρχείων ανάπτυξης και παραγωγής

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

Στην παραγωγή έχετε ένα σύμπλεγμα πολλαπλών κόμβων και ο όγκος είναι τοπικός
σε σχέση με τον κεντρικό υπολογιστή στον οποίο λειτουργεί το κοντέινερ (ή η υπηρεσία) σας, επομένως δεν το κάνετε
μπορείτε να προσαρτήσετε τον πηγαίο κώδικα χωρίς περίπλοκες λειτουργίες, οι οποίες περιλαμβάνουν
συγχρονισμός κώδικα, σήματα κ.λπ.

Αντίθετα, συνήθως θέλουμε να δημιουργήσουμε μια εικόνα με μια συγκεκριμένη έκδοση του κώδικά σας.
Είναι σύνηθες να το επισημαίνετε με την κατάλληλη ετικέτα (μπορείτε να χρησιμοποιήσετε σημασιολογικό
έκδοση ή άλλο σύστημα της επιλογής σας).

Παράκαμψη διαμόρφωσης

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

Το Docker compose υποστηρίζει τη συγχώνευση διαφορετικών αρχείων σύνθεσης σε
λάβετε την τελική διαμόρφωση. Το πώς λειτουργεί φαίνεται σε ένα παράδειγμα:

$ cat docker-compose.yml
version: "3.2"

services:
  whale:
    image: docker/whalesay
    command: ["cowsay", "hello!"]
$ docker-compose up
Creating network "composeconfigs_default" with the default driver
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1  |  ________
whale_1  | < hello! >
whale_1  |  --------
whale_1  |     
whale_1  |      
whale_1  |       
whale_1  |                     ##        .
whale_1  |               ## ## ##       ==
whale_1  |            ## ## ## ##      ===
whale_1  |        /""""""""""""""""___/ ===
whale_1  |   ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
whale_1  |        ______ o          __/
whale_1  |                     __/
whale_1  |           __________/
composeconfigs_whale_1 exited with code 0

Όπως αναφέρθηκε, το docker compose υποστηρίζει τη συγχώνευση πολλαπλών συνθέτων
αρχεία, αυτό σας επιτρέπει να παρακάμψετε διάφορες επιλογές στο δεύτερο αρχείο. Για παράδειγμα:

$ cat docker-compose.second.yml
version: "3.2"
services:
  whale:
    command: ["cowsay", "bye!"]

$ docker-compose -f docker-compose.yml -f docker-compose.second.yml up
Creating composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1  |  ______
whale_1  | < bye! >
whale_1  |  ------
whale_1  |     
whale_1  |      
whale_1  |       
whale_1  |                     ##        .
whale_1  |               ## ## ##       ==
whale_1  |            ## ## ## ##      ===
whale_1  |        /""""""""""""""""___/ ===
whale_1  |   ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
whale_1  |        ______ o          __/
whale_1  |                     __/
whale_1  |           __________/
composeconfigs_whale_1 exited with code 0

Αυτή η σύνταξη δεν είναι πολύ βολική στη διαδικασία ανάπτυξης, όταν η εντολή
πρέπει να γίνει πολλές φορές.

Ευτυχώς, το docker compose αναζητά αυτόματα ένα ειδικό αρχείο που ονομάζεται
docker-compose.override.yml για να παρακάμψετε τιμές docker-compose.yml. Αν
μετονομάστε το δεύτερο αρχείο, θα έχετε το ίδιο αποτέλεσμα, χρησιμοποιώντας μόνο την αρχική εντολή:

$ mv docker-compose.second.yml docker-compose.override.yml
$ docker-compose up
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1  |  ______
whale_1  | < bye! >
whale_1  |  ------
whale_1  |     
whale_1  |      
whale_1  |       
whale_1  |                     ##        .
whale_1  |               ## ## ##       ==
whale_1  |            ## ## ## ##      ===
whale_1  |        /""""""""""""""""___/ ===
whale_1  |   ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
whale_1  |        ______ o          __/
whale_1  |                     __/
whale_1  |           __________/
composeconfigs_whale_1 exited with code 0

Εντάξει, αυτό είναι πιο εύκολο να το θυμάστε.

Μεταβλητή παρεμβολή

Υποστήριξη αρχείων διαμόρφωσης παρεμβολή
μεταβλητές
και προεπιλεγμένες τιμές. Δηλαδή, μπορείτε να κάνετε τα εξής:

services:
  my-service:
    build:
      context: .
    image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
...

Και αν το κάνετε docker-compose build (ή push) χωρίς μεταβλητή περιβάλλοντος
$MY_SERVICE_VERSION, θα χρησιμοποιηθεί η τιμή αργότεροαλλά αν ρυθμίσετε
η τιμή της μεταβλητής περιβάλλοντος πριν από την κατασκευή, θα χρησιμοποιηθεί κατά την κατασκευή ή την ώθηση
για να εγγραφείτε private.registry.mine.

Οι αρχές μου

Οι προσεγγίσεις που με βολεύουν μπορεί να είναι χρήσιμες για εσάς. Ακολουθώ αυτό
απλοί κανόνες:

  • Όλες οι στοίβες μου για παραγωγή, ανάπτυξη (ή άλλα περιβάλλοντα) ορίζονται μέσω
    docker-compose αρχεία.
  • Τα αρχεία ρυθμίσεων που απαιτούνται για την κάλυψη όλων των περιβαλλόντων μου, μέγ.
    αποφύγετε τις επικαλύψεις.
  • Χρειάζομαι μια απλή εντολή για να λειτουργήσω σε κάθε περιβάλλον.
  • Η κύρια διαμόρφωση ορίζεται στο αρχείο docker-compose.yml.
  • Οι μεταβλητές περιβάλλοντος χρησιμοποιούνται για τον ορισμό ετικετών εικόνας ή άλλων
    μεταβλητές που μπορούν να αλλάξουν από περιβάλλον σε περιβάλλον (σταδιοποίηση, ολοκλήρωση,
    παραγωγή).
  • Οι τιμές των μεταβλητών για την παραγωγή χρησιμοποιούνται ως τιμές από
    από προεπιλογή, αυτό ελαχιστοποιεί τους κινδύνους εάν εκτελείτε τη στοίβα στην παραγωγή χωρίς
    καθορισμένη μεταβλητή περιβάλλοντος.
  • Για να ξεκινήσετε μια υπηρεσία σε περιβάλλον παραγωγής, χρησιμοποιήστε την εντολή docker stack deploy - compose-file docker-compose.yml - with-registry-auth my-stack-name.
  • Το περιβάλλον εργασίας ξεκινά με την εντολή docker-συνθέστε μέχρι -d.

Ας δούμε ένα απλό παράδειγμα.

# docker-compose.yml
...
services:
  my-service:
    build:
      context: .
    image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
    environment:
      API_ENDPOINT: ${API_ENDPOINT:-https://production.my-api.com}
...

И

# docker-compose.override.yml
...
services:
  my-service:
    ports: # This is needed for development!
      - 80:80
    environment:
      API_ENDPOINT: https://devel.my-api.com
    volumes:
      - ./:/project/src
...

μπορώ να χρησιμοποιήσω docker-compose (docker-compose up)για να τρέξετε τη στοίβα στο
λειτουργία ανάπτυξης με προσαρτημένο πηγαίο κώδικα /project/src.

Μπορώ να χρησιμοποιήσω τα ίδια αρχεία στην παραγωγή! Και θα μπορούσα να χρησιμοποιήσω ακριβώς
ίδιο αρχείο docker-compose.yml για σκηνοθεσία. Για να επεκταθεί αυτό σε
παραγωγή, πρέπει απλώς να δημιουργήσω και να στείλω την εικόνα με μια προκαθορισμένη ετικέτα
στο στάδιο CI:

export MY_SERVICE_VERSION=1.2.3
docker-compose -f docker-compose.yml build
docker-compose -f docker-compose.yml push

Στην παραγωγή, αυτό μπορεί να εκτελεστεί με τις ακόλουθες εντολές:

export MY_SERVICE_VERSION=1.2.3
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth

Και αν θέλετε να κάνετε το ίδιο στη σκηνή, απλά πρέπει να ορίσετε
απαραίτητες μεταβλητές περιβάλλοντος για να εργαστείτε στο περιβάλλον σκηνής:

export MY_SERVICE_VERSION=1.2.3
export API_ENDPOINT=http://staging.my-api.com
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth

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

Μάθετε περισσότερα για το μάθημα "Διαχειριστής Linux"

Πηγή: www.habr.com

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