Посібник з 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

Додати коментар або відгук