04 октября 2023 Время чтения: 6 минут

Александр,

продуктовый аналитик ispmanager

Добавляем MongoDB в контейнер Docker в ispmanager

ispmanager

MongoDB — нереляционная база данных (NoSQL), которая хранит данные в документах BSON (binary JSON), а затем организует их в коллекции вместо таблиц. Это позволяет ускорить разработку и быть гибче, поскольку схему можно легко изменить. MongoDB лучше всего справляется со вставкой или обновлением большого количества записей. Если вам необходимо записывать большие объёмы данных, MongoDB отлично подойдёт для этих целей. В этой статье расскажу, как установить MongoDB на сервер с ispmanager 6. Для этого нужны версии панели pro или host c поддержкой контейнеров Docker.

Содержание

1. Предварительная подготовка

На первом этапе нам понадобится выполнить два действия через консоль: проверить поддержку AVX и сопоставить порты БД с портами на сервере. Для работы можно подключиться к серверу по SSH, а можно использовать Shell-клиент, встроенный в ispmanager. Я воспользуюсь вторым способом и перейду через основное меню панели в раздел Администрирование → Shell-клиент.

Переход в Shell-клиент в ispmanager: Основное меню, Администрирование, Shell-клиент
Переход в Shell-клиент в ispmanager: Основное меню → Администрирование → Shell-клиент

1.1 Проверка поддержки AVX

Обратите внимание: начиная с версии mongodb 5.0 требуется поддержка AVX для процессора вашего сервера. Проверить это можно следующей командой:cat /proc/cpuinfo | grep -i avx

Вывод пустой строки означает, что AVX на сервере не поддерживается
Вывод пустой строки означает, что AVX на сервере не поддерживается

Вывод пустой команды означает, что ваш сервер с панелью не поддерживает AVX. Эта информация пригодится нам в дальнейшем при настройке тега для контейнера — в этом случае для него рекомендуется выбрать тег 4.4-rc.

Если команда вернёт что-то похожее на flags : … avx … , это означает, что на сервере с панелью есть поддержка AVX и можно выбрать любой тег.

К указанию тегов мы ещё раз вернёмся позже.

1.2 Сопоставление портов

Следующим шагом сопоставим порты, используемые MongoDB с открытыми портами на сервере. MongoDB внутри контейнера слушает порт 27017. На стороне сервера для большей защиты рекомендую указать другой свободный порт, например 16793.

Чтобы проверить, свободен ли порт 16793 на сервере, воспользуйтесь lsof -i -P | grep :16793. Если вернётся пустая строка, порт свободен, и его можно использовать.

Вывод пустой строки означает, что порт 16793 свободен
Вывод пустой строки означает, что порт 16793 свободен

Добавление MongoDB через Docker

Перейдём к созданию контейнера c MongoDB в ispmanager.

Чтобы добавить MongoDB в контейнере Docker, необходимо в Основном меню ispmanager выбрать вкладку Docker и нажать кнопку Создать контейнер.

Переход к созданию контейнера в ispmanager
Переход к созданию контейнера в ispmanager

На вкладке Образы в поиске введите mongo и выберете официальный образ mongo. Он помечен зелёной плашкой Official image.

Переход к созданию контейнера в ispmanager
Поиск образа MongoDB

Откроется экран с базовыми настройками контейнеров:

Базовая настройка контейнера
Базовая настройка контейнера

Далее заполним форму создания контейнера.

2.1 Имя контейнера

Указываем имя для будущего контейнера, например mongo-db

2.2 Тег

Выбираем тег образа, который будем использовать для нашего контейнера, по умолчанию это latest. На момент написания статьи тег latest соответствует версии 7.0. Выше мы проверяли, есть ли на сервере поддержка AVX. Если её нет, стоит выбрать тег 4.4-rc. Если поддержка есть, можно использовать любой тег.

2.3 Автоматический старт

Рекомендую выбрать Перезапускать всегда, чтобы при перезагрузке сервера или в других ситуациях контейнер с mongoDB автоматически стартовал.

2.4 Ограничение оперативной памяти

По умолчанию панель создаёт контейнер без ограничения по RAM. Но если на сервере есть проблема со свободной оперативной памятью, можно ограничить количество, которое будет использовать контейнер.

2.5 Сопоставление папок

Сопоставление папок работает следующим образом: целевая папка на сервере (например, /opt/data) монтируется внутрь контейнера по пути, который мы укажем (например, /tmp/test). Всё, что контейнер запишет в папку /tmp/test, будет доступно пользователям системы по пути /opt/data. Это работает и в обратную сторону: то, что запишем в папку /opt/data, будет доступно внутри контейнера по пути /tmp/test.

В нашем случае не требуется сопоставлять папки между системой и контейнером.

2.6 Том

Тома в Docker играют роль постоянного хранилища, они не привязаны к жизненному циклу контейнера. При удалении контейнера данные, записанные в томах, сохраняются. Тома можно подключать к нескольким контейнерам.

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

В нашем случае создадим том для хранения записей БД, чтобы при удалении контейнера мы не потеряли данные, записанные в MongoDB.

Нажмём Добавить том. Откроются новые графы:

  • В графе Том оставим значение Создать новый том.
  • В графе Имя тома укажем понятное для нас имя, например mongo-data.
  • В графе Точка монтирования внутри контейнера укажем /data/db — по этому пути mongodb хранит записанные данные.
Базовая настройка контейнера
Создание нового тома для контейнера MongoDB

2.7 Сопоставление портов

Перейдём к следующему разделу формы — нажмём Добавить сопоставление портов и в графе Порт сервера укажем свободный порт 16793, который мы определили на этапе предварительной подготовки. В графе Порт контейнера укажем 27017.

Сопоставление портов
Сопоставление портов

2.8 Переменная окружения

Последнее, что нам необходимо сделать в этой форме, — указать логин и пароль администратора базы данных. Делается это через переменные окружения.

  1. Нажмём Добавить переменную, в графе Имя добавляем переменную под названием MONGO_INITDB_ROOT_USERNAME. Эта переменная инициализирует пользователя с root-привилегиями в MongoDB. В графе Значение указываем логин этого пользователя, например supermongouser.
  2. Затем ещё раз нажмем Добавить переменную, в графе Имя добавим переменную под названием MONGO_INITDB_ROOT_PASSWORD. Она задаёт пользователя, указанного в MONGO_INITDB_ROOT_USERNAME. В нашем случае supermongouser.
  3. В графе Значение укажем пароль. Рекомендую поставить сложный пароль вида %l~V$1QwoAWjjEXpbnCjKtsykC{o.
Сопоставление портов
Добавление переменных окружения

2.9 Завершение создания контейнера

После заполнения всех полей нажмём кнопку Создать. Вас вернёт на страницу с контейнерами. Вскоре здесь, в нижнем правом углу, всплывёт уведомление о том, что контейнер создан. Теперь вы сможете подключиться к базе MongoDB, используя адрес вашей панели и порт, который мы указали у сервера в разделе 1.2 Сопоставление портов.

Сопоставление портов
Уведомление об успешном создании контейнера

3. Проверка работоспособности контейнера с MongoDB

Давайте проверим, работает ли контейнер с базами данных. Попробуем подключиться к созданному контейнеру с mongoDB с внешнего устройства. В нашем примере для клиента mongosh: mongosh "mongodb://x.x.x.x:16793/" -u "supermongouser" -p-, где x.x.x.x — IP-адрес сервера. Потребуется ввести пароль, который мы указывали ранее (раздел 2.8 Переменная окружения).

При успешной аутентификации нас подключат к тестовой базе. Здесь командой show dbs можно посмотреть списки базы данных, а затем переключиться на нужную и работать с ней. Поздравляем! MongoDB установлена в контейнере Docker и готова к использованию!

Сопоставление портов
Тестирование подключения к MongoDB

4. Рекомендации по безопасности

Есть две особенности Docker, на которые стоит обратить внимание, чтобы база данных была под защитой.

  1. Docker динамически прописывает свои правила в iptables каждый раз при запуске. Поэтому для ограничения доступа к контейнеру MongoDB необходимо написать скрипт, который будет добавлять правила ограничения в начало таблицы к определённому порту при запуске Docker. Или это может быть скрипт, который по CRON запускает проверку на наличие нужных правил в iptables и, если их нет, добавляет (некоторое время возможен доступ извне). Поэтому строго рекомендуется использовать на сервере порт, отличный от стандартного 27017.
  2. Все переменные окружения, которые мы задаём, и настроенные внутри контейнера отображаются при выполнении команды от имени root/sudo или от пользователя, состоящего в группе docker. Например, команда docker exec mongo-db /usr/bin/env вернёт в том числе имя пользователя с привилегиями root и пароль от MongoDB. Это необходимо учитывать и ограничивать круг пользователей с привилегиями root или docker.

Как перейти на ispmanager c поддержкой Docker

Скачайте ispmanager версий pro(до 50 сайтов) или host (безлимитно) и пользуйтесь с удовольствием! Если раньше у вас не было панели, первые две недели бесплатные.