Запуск СУБД mongodb в контейнере для контура SVA #
Возможно использование внешней БД mongodb
Для контура SVA используется образ cr.repo.altuera.ru/sva/prod/mongodb:${SVA_VERSION}. Это реплика официального публичного образа версии 4.4.22 с предустановленными тестовыми сертификатами и скриптами:
- для создания пользователя при инициализации БД
- для обновления БД SVA
Порты #
По-умолчанию MongoDB слушает порт tcp:27017 в контейнере.
Контейнеры SVA подключаются к БД внутри сети docker по имени сервиса mongo на порт по-умолчанию,
поэтому публикация портов не требуется, кроме случаев:
- требуется доступ к MongoDB извне (например, для административных целей)
- хосты SVA не объединены сетью docker
Постоянное хранилище (Volumes) #
Контейнер с MongoDB требует двух хранилищ для сохранения настроек и данных при перезапусках контейнера:
/data/dbпуть в контейнере, где хранятся данные БД/data/configdbпуть в контейнере, где хранятся настройки MongoDB
volumes:
- mongo-db:/data/db
- mongo-configdb:/data/configdb
Для реализации постоянного хранения можно использовать как docker volumes, так и место на дисках хоста с докером
Аутентификация #
По-умолчанию аутентификация пользователей отсутствует. Доступ к БД возможен без пароля.
Задать данные для аутентификации можно следующими переменными окружения:
MONGO_INITDB_ROOT_USERNAME- имя root пользователя mongo (для администрирования)MONGO_INITDB_ROOT_PASSWORD- пароль root пользователя mongoDB_USER- имя пользователя бд для сервисов SVADB_PASSWORD- пароль бд для сервисов SVA
Данные переменные используются только при инициализации БД (первом запуске контейнера или запуск с удаленным постоянным хранилищем), если БД уже инициализирована, то наличие и/или изменение этих параметров не играет роли.
TLS #
Настройка защищенного подключения к БД с использованием TLS настраивается через параметры запуска контейнера (command):
command: [
"--tlsMode", "allowTLS",
"--tlsCertificateKeyFile", "/cert/cert_key.pem",
"--tlsAllowConnectionsWithoutCertificates" ]
MongoDB использует единый порт (27017 по-умолчанию) для незащищенных и защищенных подключений. Режим работы порта настраивается опцией tlsMode.
tlsModeрежим работы TLSallowTLS- можно подключаться любым способомpreferTLS- предпочтительно использовать TLSrequireTLS- обязательное использование TLS
tlsCertificateKeyFile- путь к файлу с сертификатом (в контейнере). Формат pem, должен содержать:- сертификат
- ключ сертификата без пароля
- при необходимости сертификаты промежуточных CA
tlsAllowConnectionsWithoutCertificates- опция отключает проверку сертификата клиента. Обязательна при использовании в контуре SVA, поскольку в текущей версии SVA сервисы SVA не поддерживают взаимную TLS авторизацию.
В контейнере в /cert расположены тестовые самоподписанные сертификаты, которые можно использовать для отладки и тестирования.
Операции с контейнером #
При включенной аутентификации добавлять логин и пароль к вызовам команд mongo/mongodump/mongorestore:
-u <username> -p <password>
При обязательном использовании TLS (--tlsMode=requireTLS) также необходимо добавлять параметры подключения к БД через TLS:
--tls --tlsCAFile </cert/CA.crt>, где </cert/CA.crt> путь в контейнере к файлу с CA сертификатами.
Выполнить скрипты миграции БД до актуальной версии #
docker exec -it <container-name> /docker-entrypoint-initdb.d/update.sh
- При заданных параметрах
MONGO_INITDB_ROOT_USERNAMEилиDB_USERс соответствующими паролями, эти параметры автоматически подставляются при вызове скрипта. - При настроенном tls, чтобы не указывать путь к CA сертификату, его можно положить в сам контейнер и указать путь к нему переменной окружения
DB_CACERT_PATH=</cert/CA_fullchain.pem>
В таком случае никаких параметров при вызове скрипта указывать не потребуется.
Резервное копирование (dump) #
# все БД
docker exec -i <container-name> mongodump --gzip --archive > dump.gz
# одну БД <database_name>
docker exec -i <container-name> mongodump -d <database_name> --gzip --archive > database_name.gz
Восстановление из резервной копии #
# все БД, содержащиеся в дампе
docker exec -i <container-name> mongorestore --drop --gzip --archive < dump.gz
# одну БД <database_name> из дампа, в котором более одной БД
docker exec -i <container-name> mongorestore --drop --nsInclude="<database_name>.*" --gzip --archive < dump.gz
Переименование БД в mongo #
# <src-db> исходная БД, <src-collection> - исходная коллекция, для всех коллекций использовать *
# <dst-db> целевая БД, <dst-collection> - целевая коллекция, для всех коллекций использовать *
docker exec -i <container-name> sh -c 'mongodump --archive --db=<src-db> --collection=<src-collection> | mongorestore --archive --nsFrom='<src-db>.<src-collection>' --nsTo='<dest-db>.<dest-collection>'
Примеры compose файлов #
Без авторизации, доступ внутри контура #
Можно использовать, если:
- все компоненты обращаются к бд только внутри сети docker
- если не требуется доступ к бд извне
volumes:
mongodb-data:
mongodb-config:
services:
mongo:
image: cr.repo.altuera.ru/sva/prod/mongodb:${SVA_VERSION}
restart: unless-stopped
volumes:
- mongodb-data:/data/db
- mongodb-config:/data/configdb
С авторизацией, TLS, и анонсированием портов наружу #
Если требуется безопасный авторизованный доступ к бд вне сети docker.
Постоянное хранилище вынесено на диск.
services:
mongo:
image: cr.repo.altuera.ru/sva/prod/mongodb:${SVA_VERSION}
restart: unless-stopped
ports:
- 27017:27017
environment:
MONGO_INITDB_ROOT_USERNAME: mongo
MONGO_INITDB_ROOT_PASSWORD: mongo
DB_USER: sva
DB_PASSWORD: sva
DB_CACERT_PATH: /cert/CA_fullchain.pem
volumes:
- /srv/mongo/data:/data/db
- /srv/mongo/config:/data/configdb
command: [
"--tlsMode", "requireTLS",
"--tlsCertificateKeyFile", "/cert/cert_key_fullchain.pem",
"--tlsAllowConnectionsWithoutCertificates",
]