Как запустить 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
.