Поиск по сайту:

Как запустить MongoDB в контейнере Docker


MongoDB — это документно-ориентированный движок базы данных NoSQL, который завоевал популярность среди разработчиков благодаря модели хранения, подобной JSON. MongoDB часто обеспечивает более прямое сопоставление между кодом и сохраняемыми данными, облегчая быструю итерацию и помогая устранить значительное несоответствие импеданса традиционных баз данных SQL.

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

В этом руководстве мы покажем вам, как начать работу с MongoDB в Docker. Ключевым моментом является хранение данных: контейнеры Docker по умолчанию эфемерны и теряют свои данные при остановке. Вам нужно будет смонтировать том в контейнер MongoDB, чтобы обеспечить постоянство.

Запуск контейнера MongoDB

Вы можете запустить одноразовый контейнер MongoDB с помощью docker run:

docker run -d -p 27017:27017 --name example-mongo mongo:latest

Это даст вам работающий сервер с последней версией MongoDB. Он использует официальный образ, доступный на Docker Hub. Флаг -d (отсоединить) означает, что контейнер будет работать в фоновом режиме отдельно от вашего процесса оболочки.

Порт контейнера 27017, используемый MongoDB по умолчанию, привязан к порту 27017 на вашем хосте. Вы сможете подключиться к своему экземпляру Mongo на localhost:27017. Если вы хотите изменить номер порта, измените первую часть флага -p, например 9000:27017, чтобы использовать localhost:9000. .

Образ MongoDB также включает оболочку mongo. Команда docker exec предоставляет способ доступа к нему в работающем контейнере:

docker exec -it example-mongo mongo

Это запустит интерактивный сеанс оболочки Mongo в вашем терминале. Он идеально подходит для быстрого взаимодействия с вашим экземпляром базы данных без добавления каких-либо внешних зависимостей.

Вы можете просмотреть журналы Mongo с помощью команды docker logs:

docker logs example-mongo --follow

Флаг --follow означает, что журналы будут постоянно передаваться на ваш терминал.

Подключение из другого контейнера

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

docker network create mongo-network
docker run -d --network mongo-network --name example-mongo mongo:latest

Ваш «клиентский» контейнер также должен присоединиться к mongo-network. Он сможет ссылаться на контейнер по имени в строках подключения MongoDB. В этом примере он может получить доступ к базе данных, связавшись с example-mongo:27017.

Сохранение данных с томами

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

Образ MongoDB настроен на хранение всех своих данных в каталоге /data/db в файловой системе контейнера. Подключение тома к этому местоположению обеспечит сохранение данных за пределами контейнера.

docker run -d 
    -p 27017:27017 
    --name example-mongo 
    -v mongo-data:/data/db 
    mongo:latest

Эта версия команды docker run создает новый том Docker с именем mongo-data и монтирует его в контейнер. Том будет управляться Docker; вы можете увидеть это, запустив docker volumes ls.

Добавьте некоторые данные в Mongo:

use test-db
db.demos.save({foo: "bar"})

Затем перезапустите контейнер:

docker restart example-mongo

Ранее добавленные данные останутся нетронутыми, поскольку Docker снова подключит том после перезапуска. Вы можете проверить это, повторно подключившись к Mongo и запросив коллекцию demos:

use test-db
db.demos.find({foo: "bar"})

Вы можете удалить контейнер и запустить совершенно новый с тем же объемом mongo-data. Поскольку файлы тома все еще будут существовать на вашем хосте, Docker смонтирует их обратно в новый контейнер. Mongo автоматически пропускает свою обычную процедуру инициализации базы данных, когда каталог данных уже заполнен при запуске контейнера.

Тома сохраняются до тех пор, пока вы не удалите их с помощью команды docker volumes rm или не используете флаг --volumes при уничтожении контейнера с помощью docker rm.

Добавление аутентификации

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

Образ Mongo Docker обеспечивает удобное быстрое знакомство с относительно сложной системой аутентификации Mongo. Вы можете добавить начальную учетную запись пользователя, установив переменные среды MONGO_INITDB_ROOT_USERNAME и MONGODB_INITDB_ROOT_PASSWORD при создании контейнера:

docker run -d 
    -p 27017:27017 
    --name example-mongo 
    -v mongo-data:/data/db 
    -e MONGODB_INITDB_ROOT_USERNAME=example-user 
    -e MONGODB_INITDB_ROOT_PASSWORD=example-pass 
    mongo:latest

Это запустит базу данных с новой учетной записью пользователя с именем example-user. Пользователю будет назначена роль root в базе данных проверки подлинности admin с предоставлением привилегий суперпользователя.

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

docker run -d 
    -p 27017:27017 
    --name example-mongo 
    -v mongo-data:/data/db 
    -e MONGODB_INITDB_ROOT_USERNAME=example-user 
    -e MONGODB_INITDB_ROOT_PASSWORD_FILE=/run/secrets/mongo-root-pw 
    mongo:latest

Добавление к переменным среды изображения суффикса _FILE указывает Mongo читать содержимое указанного файла, а не использовать значение как есть. Фактический путь к файлу произвольный — либо смонтируйте файл с вашего хост-компьютера, либо используйте секреты Docker. В любом случае ваш пароль не будет виден при использовании docker inspect для просмотра переменных контейнера.

Настройка вашего сервера

Самый простой способ предоставить пользовательские значения конфигурации Mongo — использовать флаги, предлагаемые двоичным файлом mongod. Образ Docker предварительно настроен для передачи флагов docker run в mongod.

Вот пример, когда Mongo настроен на прослушивание порта 9000 вместо стандартного 27017:

docker run -d 
    --name example-mongo 
    -v mongo-data:/data/db 
    mongo:latest --port 9000

Вы можете добавить файл конфигурации Mongo, смонтировав его в свой контейнер, а затем используя флаг --config, чтобы сообщить Mongo, где искать:

docker run -d 
    --name example-mongo 
    -v mongo-data:/data/db 
    -v ./mongo.conf:/etc/mongo/mongo.conf
    mongo:latest --config /etc/mongo/mongo.conf

Необходимо использовать флаг --config — по умолчанию Mongo не загружает настройки из любого пути к файлу.

Образ Docker предоставляет механизм заполнения вашей базы данных и запуска скриптов начальной загрузки при первом запуске. Любые файлы .sh или .js, помещенные в каталог /docker-entrypoint-initdb.d, будут выполняться в алфавитном порядке. Файлы .js будут рассматриваться как сценарии Mongo и запускаться в базе данных test. Вы можете изменить эту базу данных по умолчанию, задав для переменной среды MONGODB_INITDB_DATABASE имя пользовательской схемы.

Заключение

Запуск MongoDB в Docker обеспечивает изоляцию и переносимость вашей базы данных. Вы можете быстро запускать новые экземпляры без ручной установки сервера Mongo. Контейнеры ваших приложений могут напрямую подключаться к Mongo через общую сеть Docker.

Образ Mongo на Docker Hub имеет теги для всех активно поддерживаемых версий, включая 4.4 и 5.0. Тег latest всегда указывает на самую новую версию, в настоящее время 5.0, поэтому его использование подвергает вас риску получения нежелательных обновлений основной версии. Безопаснее указывать конкретную версию при запуске ваших контейнеров.

Официальный образ также можно использовать в качестве основы для предварительно настроенных пользовательских образов. Создание Dockerfile, который добавляет ваш файл конфигурации, переопределяет COMMAND для его включения и копирует его в сценарии заполнения, даст вам возможность создать новый экземпляр базы данных с меньшими затратами. Флаги docker run.