Docker Compose Οδηγός για αρχάριους

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

Docker Compose Οδηγός για αρχάριους

Τι είναι το Docker Compose;

Το Docker Compose είναι ένα εργαλείο που περιλαμβάνεται στο Docker. Έχει σχεδιαστεί για την επίλυση προβλημάτων που σχετίζονται με την ανάπτυξη έργων.

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

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

Η τεχνολογία Docker Compose, αν την περιγράψετε με απλοποιημένο τρόπο, σας επιτρέπει να ξεκινήσετε πολλές υπηρεσίες με μία μόνο εντολή.

Διαφορά μεταξύ Docker και Docker Compose

Το Docker χρησιμοποιείται για τη διαχείριση των μεμονωμένων κοντέινερ (υπηρεσιών) που αποτελούν μια εφαρμογή.

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

Docker Compose Οδηγός για αρχάριους
Docker (μονό κοντέινερ) και Docker Compose (πολλαπλά κοντέινερ)

Τυπική θήκη χρήσης Docker Compose

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

Φανταστείτε ότι είστε ο προγραμματιστής ενός έργου web. Αυτό το έργο περιλαμβάνει δύο ιστοσελίδες. Το πρώτο επιτρέπει στους επιχειρηματίες να δημιουργούν, με λίγα μόνο κλικ, ηλεκτρονικά καταστήματα. Το δεύτερο στοχεύει στην υποστήριξη πελατών. Αυτοί οι δύο ιστότοποι αλληλεπιδρούν με την ίδια βάση δεδομένων.

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

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

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

Ανάπτυξη εφαρμογής πελάτη-διακομιστή χρησιμοποιώντας Docker Compose

Τώρα που ξέρετε για ποιον σκοπό θα χρησιμοποιήσουμε το Docker Compose, ήρθε η ώρα να δημιουργήσετε την πρώτη σας εφαρμογή πελάτη/διακομιστή χρησιμοποιώντας αυτό το εργαλείο. Δηλαδή, μιλάμε για την ανάπτυξη ενός μικρού ιστότοπου (διακομιστή) σε Python, ο οποίος μπορεί να παράγει ένα αρχείο με ένα τμήμα κειμένου. Αυτό το αρχείο ζητείται από τον διακομιστή από ένα πρόγραμμα (πελάτη), γραμμένο επίσης σε Python. Μετά τη λήψη του αρχείου από τον διακομιστή, το πρόγραμμα εμφανίζει το κείμενο που είναι αποθηκευμένο σε αυτό στην οθόνη.

Λάβετε υπόψη ότι υποθέτουμε ότι έχετε τα βασικά του Docker και ότι έχετε ήδη εγκατεστημένη την πλατφόρμα Docker.

Ας αρχίσουμε να εργαζόμαστε για το έργο.

▍1. Δημιουργήστε ένα έργο

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

  • αρχείο docker-compose.yml. Αυτό είναι ένα αρχείο Docker Compose που θα περιέχει τις οδηγίες που απαιτούνται για την εκκίνηση και τη διαμόρφωση των υπηρεσιών.
  • Ντοσιέ server. Θα περιέχει τα απαραίτητα αρχεία για να λειτουργήσει ο διακομιστής.
  • Ντοσιέ client. Εδώ θα βρίσκονται τα αρχεία εφαρμογής πελάτη.

Ως αποτέλεσμα, τα περιεχόμενα του κύριου φακέλου του έργου σας θα πρέπει να έχουν την εξής μορφή:

.
├── client/
├── docker-compose.yml
└── server/
2 directories, 1 file

▍2. Δημιουργία διακομιστή

Εδώ, στη διαδικασία δημιουργίας διακομιστή, θα θίξουμε μερικά βασικά πράγματα σχετικά με το Docker.

2α. Δημιουργία Αρχείων

Μεταβείτε στο φάκελο server και δημιουργήστε τα ακόλουθα αρχεία σε αυτό:

  • αρχείο server.py. Θα περιέχει τον κωδικό διακομιστή.
  • αρχείο index.html. Αυτό το αρχείο θα περιέχει ένα κομμάτι κειμένου που θα πρέπει να εμφανίζει η εφαρμογή πελάτη.
  • αρχείο Dockerfile. Αυτό είναι το αρχείο Docker που θα περιέχει τις οδηγίες που απαιτούνται για τη δημιουργία του περιβάλλοντος διακομιστή.

Έτσι πρέπει να είναι τα περιεχόμενα του φακέλου σας server/:

.
├── Dockerfile
├── index.html
└── server.py
0 directories, 3 files

2β. Επεξεργασία αρχείου Python.

Προσθήκη στο αρχείο server.py τον παρακάτω κωδικό:

#!/usr/bin/env python3

# Импорт системных библиотек python.
# Эти библиотеки будут использоваться для создания веб-сервера.
# Вам не нужно устанавливать что-то особенное, эти библиотеки устанавливаются вместе с Python.

import http.server
import socketserver

# Эта переменная нужна для обработки запросов клиента к серверу.

handler = http.server.SimpleHTTPRequestHandler

# Тут мы указываем, что сервер мы хотим запустить на порте 1234. 
# Постарайтесь запомнить эти сведения, так как они нам очень пригодятся в дальнейшем, при работе с docker-compose.

with socketserver.TCPServer(("", 1234), handler) as httpd:

    # Благодаря этой команде сервер будет выполняться постоянно, ожидая запросов от клиента.

   httpd.serve_forever()

Αυτός ο κώδικας σας επιτρέπει να δημιουργήσετε έναν απλό διακομιστή web. Θα δώσει στους πελάτες ένα αρχείο index.html, το περιεχόμενο του οποίου θα εμφανίζεται αργότερα στην ιστοσελίδα.

2γ. Επεξεργασία αρχείου HTML

Να αρχειοθετήσω index.html προσθέστε το ακόλουθο κείμενο:

Docker-Compose is magic!

Αυτό το κείμενο θα σταλεί στον πελάτη.

2δ. Επεξεργασία του αρχείου Docker

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

# На всякий случай напоминаю, что Dockerfile всегда должен начинаться с импорта базового образа.
# Для этого используется ключевое слово 'FROM'.
# Здесь нам нужно импортировать образ python (с DockerHub).
# В результате мы, в качестве имени образа, указываем 'python', а в качестве версии - 'latest'.

FROM python:latest

# Для того чтобы запустить в контейнере код, написанный на Python, нам нужно импортировать файлы 'server.py' и 'index.html'.
# Для того чтобы это сделать, мы используем ключевое слово 'ADD'.
# Первый параметр, 'server.py', представляет собой имя файла, хранящегося на компьютере.
# Второй параметр, '/server/', это путь, по которому нужно разместить указанный файл в образе.
# Здесь мы помещаем файл в папку образа '/server/'.

ADD server.py /server/
ADD index.html /server/

# Здесь мы воспользуемся командой 'WORKDIR', возможно, новой для вас.
# Она позволяет изменить рабочую директорию образа.
# В качестве такой директории, в которой будут выполняться все команды, мы устанавливаем '/server/'.

WORKDIR /server/

Τώρα ας δουλέψουμε στον πελάτη.

▍3. Δημιουργήστε έναν πελάτη

Κατά τη δημιουργία της πλευράς πελάτη του έργου μας, θα θυμηθούμε ορισμένα βασικά στοιχεία του Docker στην πορεία.

3α. Δημιουργία Αρχείων

Μεταβείτε στο φάκελο του έργου σας client και δημιουργήστε τα ακόλουθα αρχεία σε αυτό:

  • αρχείο client.py. Εδώ θα βρίσκεται ο κωδικός πελάτη.
  • αρχείο Dockerfile. Αυτό το αρχείο παίζει τον ίδιο ρόλο με ένα παρόμοιο αρχείο στο φάκελο διακομιστή. Δηλαδή, περιέχει μια δήλωση που περιγράφει πώς να δημιουργήσετε ένα περιβάλλον για την εκτέλεση κώδικα πελάτη.

Ως αποτέλεσμα, ο φάκελός σας client/ Σε αυτό το στάδιο θα πρέπει να μοιάζει με αυτό:

.
├── client.py
└── Dockerfile
0 directories, 2 files

3β. Επεξεργασία αρχείου Python

Προσθήκη στο αρχείο client.py τον παρακάτω κωδικό:

#!/usr/bin/env python3

# Импортируем системную библиотеку Python.
# Она используется для загрузки файла 'index.html' с сервера.
# Ничего особенного устанавливать не нужно, эта библиотека устанавливается вместе с Python.

import urllib.request

# Эта переменная содержит запрос к 'http://localhost:1234/'.
# Возможно, сейчас вы задаётесь вопросом о том, что такое 'http://localhost:1234'.
# localhost указывает на то, что программа работает с локальным сервером.
# 1234 - это номер порта, который вам предлагалось запомнить при настройке серверного кода.

fp = urllib.request.urlopen("http://localhost:1234/")

# 'encodedContent' соответствует закодированному ответу сервера ('index.html').
# 'decodedContent' соответствует раскодированному ответу сервера (тут будет то, что мы хотим вывести на экран).

encodedContent = fp.read()
decodedContent = encodedContent.decode("utf8")

# Выводим содержимое файла, полученного с сервера ('index.html').

print(decodedContent)

# Закрываем соединение с сервером.

fp.close()

Χάρη σε αυτόν τον κωδικό, η εφαρμογή πελάτη μπορεί να πραγματοποιήσει λήψη δεδομένων από τον διακομιστή και να τα εμφανίσει στην οθόνη.

3γ. Επεξεργασία του αρχείου Docker

Όπως και στην περίπτωση του διακομιστή, δημιουργούμε για τον πελάτη ένα απλό Dockerfile, υπεύθυνος για τη διαμόρφωση του περιβάλλοντος στο οποίο θα εκτελείται η εφαρμογή πελάτη Python. Εδώ είναι ο κωδικός πελάτη Dockerfile:

# То же самое, что и в серверном Dockerfile.

FROM python:latest

# Импортируем 'client.py' в папку '/client/'.

ADD client.py /client/

# Устанавливаем в качестве рабочей директории '/client/'.

WORKDIR /client/

▍4. Docker Compose

Όπως μπορείτε να δείτε, έχουμε δημιουργήσει δύο διαφορετικά έργα: διακομιστή και πελάτη. Κάθε ένα από αυτά έχει το δικό του αρχείο Dockerfile. Μέχρι στιγμής, όλα όσα συμβαίνουν δεν ξεπερνούν τα βασικά της συνεργασίας με τον Docker. Τώρα αρχίζουμε να δουλεύουμε με το Docker Compose. Για να το κάνετε αυτό, ανατρέξτε στο αρχείο docker-compose.ymlπου βρίσκεται στον ριζικό φάκελο του έργου.

Σημειώστε ότι εδώ δεν στοχεύουμε να καλύψουμε απολύτως όλες τις εντολές που μπορούν να χρησιμοποιηθούν docker-compose.yml. Ο κύριος στόχος μας είναι να αναλύσουμε ένα πρακτικό παράδειγμα που σας δίνει βασικές γνώσεις για το Docker Compose.

Εδώ είναι ο κώδικας που πρέπει να βάλετε στο αρχείο docker-compose.yml:

# Файл docker-compose должен начинаться с тега версии.
# Мы используем "3" так как это - самая свежая версия на момент написания этого кода.

version: "3"

# Следует учитывать, что docker-composes работает с сервисами.
# 1 сервис = 1 контейнер.
# Сервисом может быть клиент, сервер, сервер баз данных...
# Раздел, в котором будут описаны сервисы, начинается с 'services'.

services:

  # Как уже было сказано, мы собираемся создать клиентское и серверное приложения.
  # Это означает, что нам нужно два сервиса.
  # Первый сервис (контейнер): сервер.
  # Назвать его можно так, как нужно разработчику.
  # Понятное название сервиса помогает определить его роль.
  # Здесь мы, для именования соответствующего сервиса, используем ключевое слово 'server'.

  server:
 
    # Ключевое слово "build" позволяет задать
    # путь к файлу Dockerfile, который нужно использовать для создания образа,
    # который позволит запустить сервис.
    # Здесь 'server/' соответствует пути к папке сервера,
    # которая содержит соответствующий Dockerfile.

    build: server/

    # Команда, которую нужно запустить после создания образа.
    # Следующая команда означает запуск "python ./server.py".

    command: python ./server.py

    # Вспомните о том, что в качестве порта в 'server/server.py' указан порт 1234.
    # Если мы хотим обратиться к серверу с нашего компьютера (находясь за пределами контейнера),
    # мы должны организовать перенаправление этого порта на порт компьютера.
    # Сделать это нам поможет ключевое слово 'ports'.
    # При его использовании применяется следующая конструкция: [порт компьютера]:[порт контейнера]
    # В нашем случае нужно использовать порт компьютера 1234 и организовать его связь с портом
    # 1234 контейнера (так как именно на этот порт сервер 
    # ожидает поступления запросов).

    ports:
      - 1234:1234

  # Второй сервис (контейнер): клиент.
  # Этот сервис назван 'client'.

  client:
    # Здесь 'client/ соответствует пути к папке, которая содержит
    # файл Dockerfile для клиентской части системы.

    build: client/

    # Команда, которую нужно запустить после создания образа.
    # Следующая команда означает запуск "python ./client.py".
 
    command: python ./client.py

    # Ключевое слово 'network_mode' используется для описания типа сети.
    # Тут мы указываем то, что контейнер может обращаться к 'localhost' компьютера.

    network_mode: host

    # Ключевое слово 'depends_on' позволяет указывать, должен ли сервис,
    # прежде чем запуститься, ждать, когда будут готовы к работе другие сервисы.
    # Нам нужно, чтобы сервис 'client' дождался бы готовности к работе сервиса 'server'.
 
    depends_on:
      - server

▍5. Κατασκευή έργου

Μετά μέσα docker-compose.yml έχουν γίνει όλες οι απαραίτητες οδηγίες, το έργο πρέπει να συναρμολογηθεί. Αυτό το βήμα της εργασίας μας μοιάζει με τη χρήση της εντολής docker build, αλλά η αντίστοιχη εντολή σχετίζεται με πολλές υπηρεσίες:

$ docker-compose build

▍6. Έναρξη του έργου

Τώρα που κατασκευάστηκε το έργο, ήρθε η ώρα να το τρέξουμε. Αυτό το βήμα της εργασίας μας αντιστοιχεί στο βήμα στο οποίο, όταν εργαζόμαστε με μεμονωμένα κοντέινερ, εκτελείται η εντολή docker run:

$ docker-compose up

Μετά την εκτέλεση αυτής της εντολής, το κείμενο που φορτώθηκε από τον πελάτη από τον διακομιστή θα πρέπει να εμφανιστεί στο τερματικό: Docker-Compose is magic!.

Όπως ήδη αναφέρθηκε, ο διακομιστής χρησιμοποιεί τη θύρα του υπολογιστή 1234 για την εξυπηρέτηση των αιτημάτων των πελατών. Επομένως, εάν μεταβείτε στο πρόγραμμα περιήγησης στη διεύθυνση http://localhost:1234/, θα εμφανίσει μια σελίδα με κείμενο Docker-Compose is magic!.

Χρήσιμες εντολές

Ας ρίξουμε μια ματιά σε μερικές από τις εντολές που μπορεί να σας φανούν χρήσιμες όταν εργάζεστε με το Docker Compose.

Αυτή η εντολή σάς επιτρέπει να σταματήσετε και να διαγράψετε κοντέινερ και άλλους πόρους που δημιουργήθηκαν από την εντολή docker-compose up:

$ docker-compose down

Αυτή η εντολή εκτυπώνει τα αρχεία καταγραφής υπηρεσιών:

$ docker-compose logs -f [service name]

Για παράδειγμα, στο έργο μας μπορεί να χρησιμοποιηθεί με αυτή τη μορφή: $ docker-compose logs -f [service name].

Με αυτήν την εντολή, μπορείτε να εμφανίσετε μια λίστα με κοντέινερ:

$ docker-compose ps

Αυτή η εντολή σάς επιτρέπει να εκτελέσετε μια εντολή σε ένα κοντέινερ που τρέχει:

$ docker-compose exec [service name] [command]

Για παράδειγμα, μπορεί να μοιάζει με αυτό: docker-compose exec server ls.

Αυτή η εντολή σας επιτρέπει να εμφανίσετε μια λίστα εικόνων:

$ docker-compose images

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

Καλύψαμε τα βασικά της εργασίας με την τεχνολογία Docker Compose, η γνώση της οποίας θα σας επιτρέψει να χρησιμοποιήσετε αυτήν την τεχνολογία και, εάν θέλετε, να αρχίσετε να τη μελετάτε σε μεγαλύτερο βάθος. Εδώ αποθετήριο με τον κώδικα του έργου, τον οποίο εξετάσαμε εδώ.

Αγαπητοί αναγνώστες! Χρησιμοποιείτε το Docker Compose στα έργα σας;

Docker Compose Οδηγός για αρχάριους

Πηγή: www.habr.com

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