Mongodb на образе докера Debian - не может стоять - PullRequest
0 голосов
/ 23 октября 2019

Добрый вечер. Я новичок в докере и пытаюсь научиться этому немного. В настоящее время пишу простое Java-приложение, интегрированное с mongodb, но я остановился на dockerfile. В основном проблема в запуске mongodb. Вот мой файл Docker:

FROM  debian:buster-slim

# 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
RUN systemctl enable mongod.service
RUN service mongod start

# Install jre 11
RUN apt-get install -y openjdk-11-jre

Вот вывод терминала (только последний шаг):

Setting up mongodb-org-shell (4.2.1) ...
Setting up mongodb-org-tools (4.2.1) ...
Setting up mongodb-org-mongos (4.2.1) ...
Setting up mongodb-org (4.2.1) ...
Removing intermediate container 7491080bfe9f
 ---> bbcf5b2ccb13
Step 7/11 : RUN service mongod start
 ---> Running in 46a66989ade2
mongod: unrecognized service
The command '/bin/sh -c service mongod start' returned a non-zero code: 1

Забавно, что я следовал официальному руководству по установке mongodb: Установка Mongodb на Debian

Во время установки на «настоящий» компьютер Debian / Ubuntu это работает. Он также не работает при попытке создать образ docker из официального образа mongodb из docker hub, я имею в виду FROM mongo:4.2-bionic

После входа в контейнер и попытки запустить mongo он возвращает:

root@8cc1d270a262:~# mongo
MongoDB shell version v4.2.0
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
2019-10-23T20:39:44.728+0000 E  QUERY    [js] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed: SocketException: Error connecting to 127.0.0.1:27017 :: caused by :: Connection refused :
connect@src/mongo/shell/mongo.js:341:17
@(connect):2:6
2019-10-23T20:39:44.729+0000 F  -        [main] exception: connect failed
2019-10-23T20:39:44.729+0000 E  -        [main] exiting with code 1

Я ожидал, что монго не может стоять ... Как-то.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Попробуйте запустить докерский контейнер mongodb и подключиться к нему с помощью mongo клиента перед созданием пользовательских образов:

docker run --name some-mongo -e MONGO_INITDB_ROOT_USERNAME=mongoadmin -e MONGO_INITDB_ROOT_PASSWORD=secret -d mongo

docker exec -it some-mongo bash

mongo -u mongoadmin -p secret --authenticationDatabase admin

0 голосов
/ 24 октября 2019

Итак, похоже, что при попытке следовать инструкциям по установке 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...