Добавляем MongoDB в контейнер Docker в ispmanager
MongoDB — нереляционная база данных (NoSQL), которая хранит данные в документах BSON (binary JSON), а затем организует их в коллекции вместо таблиц. Это позволяет ускорить разработку и быть гибче, поскольку схему можно легко изменить. MongoDB лучше всего справляется со вставкой или обновлением большого количества записей. Если вам необходимо записывать большие объёмы данных, MongoDB отлично подойдёт для этих целей. В этой статье расскажу, как установить MongoDB на сервер с ispmanager 6. Для этого нужны версии панели pro или host c поддержкой контейнеров Docker.
Содержание
- 1. Предварительная подготовка
- 2. Добавление MongoDB через Docker
- 3. Проверка работоспособности контейнера с MongoDB
- 4. Рекомендации по безопасности
1. Предварительная подготовка
На первом этапе нам понадобится выполнить два действия через консоль: проверить поддержку AVX и сопоставить порты БД с портами на сервере. Для работы можно подключиться к серверу по SSH, а можно использовать Shell-клиент, встроенный в ispmanager. Я воспользуюсь вторым способом и перейду через основное меню панели в раздел Администрирование → Shell-клиент.
1.1 Проверка поддержки AVX
Обратите внимание: начиная с версии mongodb 5.0 требуется поддержка AVX для процессора вашего сервера. Проверить это можно следующей командой:cat /proc/cpuinfo | grep -i avx
Вывод пустой команды означает, что ваш сервер с панелью не поддерживает AVX. Эта информация пригодится нам в дальнейшем при настройке тега для контейнера — в этом случае для него рекомендуется выбрать тег 4.4-rc.
Если команда вернёт что-то похожее на flags : … avx …
, это означает, что на сервере с панелью есть поддержка AVX и можно выбрать любой тег.
К указанию тегов мы ещё раз вернёмся позже.
1.2 Сопоставление портов
Следующим шагом сопоставим порты, используемые MongoDB с открытыми портами на сервере. MongoDB внутри контейнера слушает порт 27017. На стороне сервера для большей защиты рекомендую указать другой свободный порт, например 16793.
Чтобы проверить, свободен ли порт 16793 на сервере, воспользуйтесь lsof -i -P | grep :16793. Если вернётся пустая строка, порт свободен, и его можно использовать.
Добавление MongoDB через Docker
Перейдём к созданию контейнера c MongoDB в ispmanager.
Чтобы добавить MongoDB в контейнере Docker, необходимо в Основном меню ispmanager выбрать вкладку Docker и нажать кнопку Создать контейнер.
На вкладке Образы в поиске введите mongo и выберете официальный образ mongo. Он помечен зелёной плашкой Official image.
Откроется экран с базовыми настройками контейнеров:
Далее заполним форму создания контейнера.
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 хранит записанные данные.
2.7 Сопоставление портов
Перейдём к следующему разделу формы — нажмём Добавить сопоставление портов и в графе Порт сервера укажем свободный порт 16793, который мы определили на этапе предварительной подготовки. В графе Порт контейнера укажем 27017.
2.8 Переменная окружения
Последнее, что нам необходимо сделать в этой форме, — указать логин и пароль администратора базы данных. Делается это через переменные окружения.
- Нажмём Добавить переменную, в графе Имя добавляем переменную под названием MONGO_INITDB_ROOT_USERNAME. Эта переменная инициализирует пользователя с root-привилегиями в MongoDB. В графе Значение указываем логин этого пользователя, например supermongouser.
- Затем ещё раз нажмем Добавить переменную, в графе Имя добавим переменную под названием MONGO_INITDB_ROOT_PASSWORD. Она задаёт пользователя, указанного в MONGO_INITDB_ROOT_USERNAME. В нашем случае supermongouser.
- В графе Значение укажем пароль. Рекомендую поставить сложный пароль вида %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 и готова к использованию!
4. Рекомендации по безопасности
Есть две особенности Docker, на которые стоит обратить внимание, чтобы база данных была под защитой.
- Docker динамически прописывает свои правила в iptables каждый раз при запуске. Поэтому для ограничения доступа к контейнеру MongoDB необходимо написать скрипт, который будет добавлять правила ограничения в начало таблицы к определённому порту при запуске Docker. Или это может быть скрипт, который по CRON запускает проверку на наличие нужных правил в iptables и, если их нет, добавляет (некоторое время возможен доступ извне). Поэтому строго рекомендуется использовать на сервере порт, отличный от стандартного 27017.
- Все переменные окружения, которые мы задаём, и настроенные внутри контейнера отображаются при выполнении команды от имени root/sudo или от пользователя, состоящего в группе docker. Например, команда
docker exec mongo-db /usr/bin/env
вернёт в том числе имя пользователя с привилегиями root и пароль от MongoDB. Это необходимо учитывать и ограничивать круг пользователей с привилегиями root или docker.