Docker Compose и оркестровка контейнеров

Мы продолжаем цикл статей о контейнерах; сначала мы начали с создания собственных образов с помощью Docker Build и посмотрели, как запускать их с помощью Docker run. Сегодня мы узнаем, что такое Docker Compose, и начнем наше путешествие в мир оркестровки контейнеров.

В настоящее время мы управляем нашими контейнерами вручную и самостоятельно, что для некоторых эпизодических тестов является действительным и функциональным. Но когда количество контейнеров, которыми необходимо управлять, начинает расти, этот метод становится невыполнимым. Именно здесь в игру вступает оркестровка контейнеров для эффективного управления несколькими контейнерами.

Что такое оркестровка контейнеров

Оркестровка контейнеров – это централизованное и эффективное управление и мониторинг контейнеров. Не только самих контейнеров, но и их окружения, включая их отношения и связи друг с другом.

Инструмент оркестровки должен иметь как минимум 4 ключевых элемента:

  • Развертывание
  • Масштабирование
  • Web
  • Надежность

Развертывание, как следует из названия, – это возможность эффективного развертывания наших контейнеров. Такое развертывание обычно осуществляется с помощью манифестов. (мы рассмотрим эти манифесты позже).

Под масштабированием понимается возможность увеличения количества запущенных контейнеров простым способом. Если, например, у нас есть контейнер, в котором работает веб-сервер, и трафик растет, мы можем масштабировать его и дублировать один и тот же контейнер столько раз, сколько необходимо для удовлетворения спроса. Масштабирование работает не только в смысле роста, количество реплик контейнера также может быть уменьшено, если, например, уменьшится трафик.

Хороший оркестровщик должен уметь управлять внутренней сетью, объединяющей контейнеры. Как мы узнали, контейнеры обычно одноразовые, мы можем поднимать или останавливать эти контейнеры в соответствии с конкретными потребностями нашего приложения, поэтому очень сложно управлять ips-адресами каждого контейнера. Для этого инструменты оркестровки способны генерировать внутренние сегменты сети для наших приложений, в дополнение к наличию сетевых балансировщиков и службы DNS, которая позволит нам обращаться к различным элементам нашего приложения по имени, без необходимости управлять ip-адресами.

Надежность: оркестратор должен быть способен поддерживать работоспособность нашего приложения; как только мы объявим контейнеры, которые должны быть развернуты для нашего приложения, оркестратор позаботится о том, чтобы они всегда были доступны. Мы знаем, что контейнеры одноразовые, они останавливаются и умирают; в таких случаях их приходится запускать снова или даже возводить совершенно новый, чтобы заменить умерший контейнер. Оркестратор способен выполнять эти задачи автоматически, поднимая умирающие контейнеры на основе того, что мы ему объявляем.

Это может показаться немного сложным, но не волнуйтесь, как только мы перейдем к делу, вы увидите, что это простые для понимания концепции, и что на самом деле именно оркестратор берет на себя решение сложных задач; нам нужно только побеспокоиться о правильном объявлении того, что мы хотим, чтобы делал оркестратор.

В нашем случае для начала нашего путешествия с оркестраторами мы будем использовать один из самых простых, Docker Compose, который содержит все описанные выше элементы и очень прост в использовании.

Что такое Docker Compose?

Это инструмент, который позволяет нам запускать несколько взаимодействующих контейнеров простым способом, используя манифесты, в данном случае в формате YAML. В этом манифесте мы определяем желаемое состояние. Docker Compose позаботится обо всех действиях, необходимых для поддержания этого состояния, и, что самое приятное, это можно сделать с помощью одной команды.

Эта статья не предназначена для использования Docker Compose и всех его возможностей, для этого у нас есть официальная документация Docker ( https://docs.docker.com/compose/compose-file/ ), где описаны все доступные опции и их синтаксис. Цель – представить Docker Compose как простую альтернативу для развертывания контейнерных приложений и введение в контейнерную оркестровку.

В общем, для использования любого оркестратора желаемое состояние обычно объявляется в одном или нескольких манифестах; это, по сути, принцип Infrastructure as Code (IaC).

Манифесты в Docker Compose записываются в формате YAML, который является очень распространенным форматом в других типах оркестраторов, также очень распространенных, таких как Kubernetes или Docker Swarn, поэтому то, что мы узнаем здесь, будет полезно, когда мы перейдем к этим более мощным и сложным инструментам.

Примером простого yaml манифеста Docker Compose для базы данных Mysql может быть:

version: '3.1'
services:
db:
image: rameijeiras/pandorafms-percona-base
environment:
MYSQL_ROOT_PASSWORD: pandora
MYSQL_DATABASE: pandora
MYSQL_USER: pandora
MYSQL_PASSWORD: pandora
ports:
- "3306:3306"

Как вы видите, это похоже на то, что мы делаем в команде Docker run, но в формате YAML.

Этот манифест гомологичен ручному выполнению команды:

docker run --name db \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=pandora \
-e MYSQL_DATABASE=pandora \
-e MYSQL_USER=pandora \
-e MYSQL_PASSWORD=pandora \
-d rameijeiras/pandorafms-percona-base

После сохранения манифеста, обычно в файле docker-compose.yml, мы просто переходим в директорию этого файла и выполняем команду docker-compose up. Автоматически Docker Compose выполнит необходимые задачи для создания контейнера: загрузит образ, если у нас нет его локально, установит объявленные переменные окружения и выставит порт 3306 контейнера на порт 3306 хоста, как мы объявили.

Для этого контейнера преимущества compose перед выполнением команды Docker run не очень заметны. В данном случае это отсутствие необходимости запускать длинную команду и возможность сделать это более простой командой, но когда нам нужно управлять более чем одним контейнером и объединять их, именно тогда полезность такого оркестратора, как Docker Compose, становится очевидной.

Установка Docker Compose

Для того чтобы использовать Docker Compose, мы должны иметь установленный Docker на нашей машине или на сервере; если вы не знаете, как установить Docker, вы должны следовать шагам в его официальной документации ( https://docs.docker.com/engine/install/ ) для различных операционных систем.

Установка Docker Compose очень проста; я оставляю здесь документацию, ( https://docs.docker.com/compose/install/ ) хотя шаги очень просты.

В системах Linux достаточно выполнить пару команд:

sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

На системах Windows с установкой Docker for Windows Docker Compose установлен по умолчанию.

Мы можем проверить установку на любой системе, выполнив команду

docker-compose -v

Linux

null
изображение: WindowsTerminal_G4P8jVQxNG.png

Windows (powershell):

null
Изображение: WindowsTerminal_ruyy7PUpug.png

Запуск Pandora FMS Community с помощью Docker Compose

Сейчас мы рассмотрим практический пример и, конечно же, воспользуемся нашим любимым приложением: Pandora FMS. В предыдущих статьях мы научились генерировать собственные образы и запускать их с помощью команды Docker run; сегодня мы сделаем это гораздо проще, используя только манифест в формате yaml и команду docker-compose up.

Если вы не читали предыдущие статьи, не волнуйтесь: мы опубликовали их результаты в репозитории https://github.com/rafaelameijeiras/PandoraFMS и опубликовали сгенерированные образы в Docker hub, так что вы можете следовать руководству для запуска Pandora FMS без каких-либо проблем.

Мы будем использовать манифест:

version: '3.1'
services:
db:
image: rameijeiras/pandorafms-percona-base
restart: always
command: ["mysqld", "--innodb-buffer-pool-size=300M"]
environment:
MYSQL_ROOT_PASSWORD: pandora
MYSQL_DATABASE: pandora
MYSQL_USER: pandora
MYSQL_PASSWORD: pandora
networks:
- pandora

pandora:
image: rameijeiras/pandorafms-community
restart: always
depends_on:
- db
environment:
MYSQL_ROOT_PASSWORD: pandora
DBHOST: db
DBNAME: pandora
DBUSER: pandora
DBPASS: pandora
DBPORT: 3306
INSTANCE_NAME: pandora01
SLEEP: 10
RETRIES: 5
volumes:
- mysql:/var/lib/mysql
networks:
- pandora
ports:
- "8080:80"
- "41121:41121"
- "162:162/udp"

networks:
pandora:
volumes:
mysql:

Если вы загрузили репозиторий, он будет находиться в каталоге

PandoraFMS/pandorafms_community/docker-compose.yml


изображение: WindowsTerminal_ZqL7HX9JOj.png

Теперь вы просто выполняете команду:

docker-compose -f PandoraFMS/pandorafms_community/docker-compose.yml up

Как вы видите, мы использовали параметр -f (file) для определения файла манифеста, который мы хотим использовать, без необходимости перехода в каталог, который его содержит; мы также можем использовать другое имя для файла, отличное от docker-compose.yamlесли мы используем аргумент -f, за которым следует путь и имя yaml-файла.

После запуска команды она начнет выполнение задач, необходимых для подъема и соединения заявленных контейнеров. Если у вас нет локальных образов, он загрузит их перед подъемом контейнеров. Гораздо проще, чем запускать каждый контейнер независимо.


изображение: compose-up.gif

По умолчанию при выполнении команды журнал обоих контейнеров останется на экране; мы можем использовать ctrl + z, чтобы отправить его в фон, или, что еще лучше, мы можем выполнить команду с флагом -d, который по умолчанию запустит контейнеры в фоновом режиме, оставив терминал доступным для использования.

docker-compose -f PandoraFMS/pandorafms_community/docker-compose.yml up -d

Чтобы увидеть состояние всех контейнеров, объявленных в этом манифесте, достаточно просто выполнить команду:

docker-compose -f PandoraFMS/pandorafms_community/docker-compose.yml ps


изображение: WindowsTerminal_yDo0HjuAZw.png

Теперь мы просто заходим в браузер и вводим ip нашего Docker-сервера, за которым следует двоеточие “:” и порт, который мы указали в манифесте, диагональ “/” pandora_console ; в моем случае я запускаю его локально, поэтому я буду использовать 127.0.0.1:8080/pandora_console


изображение: yTJF7R3Z6h.png

Как вы можете видеть, Pandora FMS Community Edition уже запущена с помощью всего одной команды; чистое и быстрое развертывание.

Чтобы остановить контейнеры, объявленные в манифесте, просто выполните команду:

docker-compose -f PandoraFMS/pandorafms_community/docker-compose.yml stop


изображение: WindowsTerminal_iCFmhaMMFZ.png

Как видно из манифеста, мы храним информацию о базе данных в локальном томе mysql, поэтому независимо от того, сколько раз мы останавливаем или поднимаем контейнер, данные в контейнере базы данных будут постоянными.

Если мы хотим бесследно стереть все данные, включая постоянные данные в базе данных, мы можем выполнить команду:

docker-compose -f PandoraFMS/pandorafms_community/docker-compose.yml down


изображение: WindowsTerminal_kjiqQWXJRu.png

Это уничтожит контейнеры и все связанные с ними данные.

Как видите, использование Docker Compose значительно упростит наши развертывания. Это очень универсальный и мощный инструмент, но поначалу он может показаться сложным. Если это ваш случай, не волнуйтесь, очень сложно рассмотреть все его возможности в одном посте.

Так что если вам нравится мир контейнеров и вы хотите узнать больше о Docker Compose и других более продвинутых оркестрантах, таких как Kubernetes, следите за блогом.

Прежде чем мы попрощаемся, помните, что если вам необходимо контролировать более 100 устройств, вы можете воспользоваться БЕСПЛАТНОЙ 30-дневной демонстрацией Pandora FMS Enterprise. Получите его здесь.

Если у вас небольшое количество устройств для мониторинга, вы можете использовать OpenSource версию Pandora FMS. Более подробную информацию можно найти здесь.

Shares