【问题标题】:Mongodb on debian docker image - unable to standDebian docker镜像上的Mongodb - 无法站立
【发布时间】:2019-10-23 20:45:48
【问题描述】:

晚上好。 我是 docker 的新手,并尝试学习一点。目前正在编写与 mongodb 集成的简单 java 应用程序,但我坚持使用 dockerfile。基本上问题出在 mongodb start 上。这是我的 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 installation on debian

在“真正的”debian/ubuntu 机器上安装期间,它可以工作。 当尝试从 docker hub 的官方 mongodb 映像构建 docker 映像时,它也不起作用,我的意思是 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

我预料到了,因为 mongo 无法站立……不知何故。

有什么想法吗?

【问题讨论】:

  • 您遇到了多个问题。首先,让 mongo 运行 - 请参阅@rok 的回答。另一个问题是您的 docker 文件尚未公开端口 27017,因此即使 mongo 正在运行,除非在 docker 容器本身上,否则您无法进入 - 根据您的需要,这可能没问题。另一个问题是关于持久卷。如果您继续按原样使用 dockerfile,如果您松开容器,保存的所有数据都将丢失。根据您的需要,这也可能没问题。

标签: mongodb docker containers


【解决方案1】:

因此,似乎在尝试按照说明在 Debian 上安装 MongoDB 时,未创建 SysVInit 文件并且错误消息 mongod: unrecognized service。所以一个基本问题:一个 docker 容器真的需要使用 SysVInit 或 systemd 来控制守护进程吗?我不认为它真的需要它,我的理由是因为容器本身只有一个目的——托管数据库。容器应始终运行数据库引擎。考虑到这一理念,我更改了 Dockerfile 以包含一个 ENTRYPOINT 来启动 mongod,而不是依赖任何守护进程管理系统。

为了让 MongoDB 数据库在容器外可用,我调整了 mongod.conf 文件以使用 bindIp: 0.0.0.0 而不是 bindIp: 127.0.0.1 绑定到所有网络适配器。我还在 Dockerfile 中公开了端口 27017。这意味着如果您使用默认端口 27107 在主机上安装并运行 MongoDB,则需要暂停该进程以将端口提供给 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。如果我们需要在容器内获取 bash shell,请注意 --name 来命名容器以便于参考。分离模式运行 -d 使其在后台运行,最后引用名为 mongodb 的镜像。

连接:

假设 MongoDB 也安装在主机上,mongo shell 二进制文件将可用。发出一个 mongo shell 命令...

mongo

不需要其他参数。在容器中安装 MongoDB 没有启用授权,因此不需要用户名或密码。默认端口 27107 由容器使用并由 docker 引擎映射。默认使用 localhost。

获取容器的 BASH shell:

如果您想在容器中获取 BASH shell,请发出以下命令...

docker exec -it mongodb bash

【讨论】:

  • 它有效。感谢您的帮助。我不知道EXPOSEENTRYPOINT 是必需的。你帮了我很多,尤其是通过例子。再次感谢。
【解决方案2】:

在构建自定义镜像之前,尝试运行 mongodb docker 容器并使用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

【讨论】:

  • 另外,如果您可以使用docker exec -it <container id> bash 进入容器,您可以查看/var/log/mongodb/mongod.log 中的日志文件
  • 我认为没有在 docker 容器中创建任何用户,因此命令 mongo -u mongoadmin -p secret --authenticationDatabase admin 可能更适合简单地使用 mongo
猜你喜欢
  • 1970-01-01
  • 2017-03-07
  • 2019-05-14
  • 2016-01-31
  • 2017-09-15
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多