Итак, похоже, что при попытке следовать инструкциям по установке MongoDB на Debian файлы SysVInit не создаются и появляется сообщение об ошибке mongod: unrecognized service
. Итак, основной вопрос: действительно ли контейнеру Docker нужен демон-контроль с помощью SysVInit или systemd? Я не думаю, что это действительно нужно, и моя причина в том, что сам контейнер имеет единственную цель - разместить базу данных. В контейнере всегда должен быть запущен механизм базы данных. Помня об этой философии, я изменил Dockerfile, включив в него ENTRYPOINT
, который запускает mongod вместо того, чтобы полагаться на какую-либо систему управления демонами.
Чтобы база данных MongoDB была доступна вне контейнера, я настроил файл mongod.conf для привязки ко всем сетевым адаптерам, используя bindIp: 0.0.0.0
вместо bindIp: 127.0.0.1
. Я также выставляю порт 27017 в Dockerfile. Это означает, что если у вас установлен и запущен MongoDB на хост-компьютере с портом по умолчанию 27107, этот процесс необходимо будет остановить, чтобы передать порт в контейнер Docker.
Я получил некоторые ошибки в контейнере вокруг debconf, поэтому я также установил его как неинтерактивный. Установка Java дала мне припадки, поэтому я прокомментировал это. Если вам нужен java для этого контейнера, его все равно нужно будет обработать.
Dockerfile:
FROM debian:buster-slim
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
# Install necessary libs
RUN apt-get update && apt-get install -y apt-utils wget gnupg gnupg2 curl
# Install mongodb
RUN wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | apt-key add -
RUN echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-4.2.list
RUN apt-get update
RUN apt-get install -y mongodb-org
# BIND TO ALL ADAPTERS IN CONTAINER
RUN sed -i "s,\\(^[[:blank:]]*bindIp:\\) .*,\\1 0.0.0.0," /etc/mongod.conf
# Install jre 11
# RUN "apt-get install -y openjdk-11-jre"
EXPOSE 27017
ENTRYPOINT ["/usr/bin/mongod", "-f", "/etc/mongod.conf"]
Сборка:
Чтобы создать образ Docker, введите следующую команду ...
docker build --tag mongodb .
(обратите внимание на точку в команде - это обязательно).
Выполнить:
Чтобы создать контейнер Docker, используйте команду run
.
docker run --publish 27017:27017 --name mongodb -d mongodb
Обратите внимание на --publish для сопоставления хост-порта 27017 с портом контейнера 27017. Обратите внимание на --name toНазовите контейнер для более легкой ссылки, если нам нужно получить оболочку bash внутри контейнера. Запустите -d для отдельного режима, чтобы он работал в фоновом режиме, и, наконец, обратитесь к образу с именем mongodb.
Connect:
Предполагается, что MongoDB также установлен на хостебудет доступен бинарный файл mongo. Выполните команду оболочки mongo ...
mongo
Другие параметры не требуются. При установке MongoDB в контейнере авторизация не включена и поэтому не запрашивает имя пользователя или пароль. Порт по умолчанию 27107 используется контейнером и отображается механизмом докера. По умолчанию используется localhost.
Получить оболочку BASH контейнера:
Если вы хотите получить оболочку BASH внутри контейнера, введите следующую команду ...
docker exec -it mongodb bash