Кіраўніцтва па 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.

Уявіце сабе, што вы з'яўляецеся распрацоўшчыкам нейкага вэб-праекта. У гэты праект уваходзіць два вэб-сайты. Першы дазваляе людзям, якія займаюцца бізнэсам, ствараць, усяго ў некалькі пстрычак мышшу, інтэрнэт-крамы. Другі накіраваны на падтрымку кліентаў. Гэтыя два сайты ўзаемадзейнічаюць з адной і той жа базай дадзеных.

Ваш праект становіцца ўсё больш папулярным, і аказваецца, што магутнасці сервера, на якім ён працуе, ужо недастаткова. У выніку вы вырашаеце перавесці ўвесь праект на іншую машыну.

Нажаль, нешта накшталт 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.

2a. Стварэнне файлаў

Перайдзіце ў тэчку server і стварыце ў ёй наступныя файлы:

  • файл server.py. У ім будзе знаходзіцца код сэрвера.
  • файл index.html. У гэтым файле будзе знаходзіцца фрагмент тэксту, які павінен вывесці кліенцкае прыкладанне.
  • файл Dockerfile. Гэта - файл Docker, які будзе змяшчаць інструкцыі, неабходныя для стварэння асяроддзя сервера.

Вось як павінна выглядаць змесціва вашай тэчкі server/:

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

2b. Рэдагаванне 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()

Гэты код дазваляе стварыць просты вэб-сервер. Ён будзе аддаваць кліентам файл index.html, змесціва якога пазней будзе выводзіцца на вэб-старонцы.

2c. Рэдагаванне HTML-файла

У файл index.html дадамо наступны тэкст:

Docker-Compose is magic!

Гэты тэкст будзе перадавацца кліенту.

2d. Рэдагаванне файла Dockerfile

Цяпер мы створым просты файл Dockerfile, які будзе адказваць за арганізацыю асяроддзя выканання для Python-сервера. У якасці асновы стваранай выявы скарыстаемся афіцыйным чынам, прызначаны для выканання праграм, напісаных на Python. Вось змесціва Dockerfile:

# На всякий случай напоминаю, что 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.

3a. Стварэнне файлаў

Перайдзіце ў тэчку вашага праекта client і стварыце ў ёй наступныя файлы:

  • файл client.py. Тут будзе знаходзіцца код кліента.
  • файл Dockerfile. Гэты файл гуляе тую ж ролю, што і аналагічны файл у тэчцы сервера. У прыватнасці, ён утрымоўвае інструкцыю, якая апісвае стварэнне асяроддзя для выканання кліенцкага кода.

У выніку ваша тэчка client/ на дадзеным этапе працы павінна выглядаць так:

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

3b. Рэдагаванне 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()

Дзякуючы гэтаму коду кліенцкае прыкладанне можа загрузіць дадзеныя з сервера і вывесці іх на экран.

3c. Рэдагаванне файла Dockerfile

Як і ў выпадку з серверам, мы ствараем для кліента просты 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 для пачаткоўцаў

Крыніца: habr.com

Дадаць каментар