【问题标题】:Docker doesn't start MONGODB, and IPAddress doesn't appear, when started with other servicesDocker 不启动 MONGODB,IPAddress 不出现,与其他服务一起启动
【发布时间】:2014-08-20 07:00:54
【问题描述】:

我已经在 serverfault.com 上问过这个问题。我也在这里问这个问题,因为我在这两个网站上看到了不同的问题集(看起来他们有不同的数据库)。

我一直在尝试从 Fedora 构建操作系统映像以启动以下操作,但未成功:

  1. 系统化
  2. 固态混合硬盘
  3. RabbitMQ
  4. MongoDB

我可以让前 3 个(Systemd、SSHD 和 RabbitMQ-Server)工作。我还可以让 MongoDB 在容器中工作。但是,我无法让 MongoDB 与其他 3 个服务一起工作。

此外,当我尝试“dockerize”MongoDB 时,IP 地址不显示。

我是否遗漏了 Dockerfile 中的某些内容?

这是我的 dockerfile:

FROM fedora:20
MAINTAINER “Ashfaque” <ashfaque@email.com>
ENV container docker
RUN yum -y update; yum clean all
RUN yum -y install systemd; yum clean all; \
(cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;

# Dockerizing SSH - is working
RUN yum -y install openssh-server
RUN yum -y install openssh-clients
RUN mkdir /var/run/sshd
RUN systemctl enable sshd.service
RUN echo 'root:mypassword' |chpasswd
EXPOSE 22

# Dockerizing RabbitMQ - is working
RUN yum -y install rabbitmq-server
EXPOSE 5672 15672
RUN systemctl enable rabbitmq-server

# Dockerizing MongoDB - is NOT WORKING
RUN yum -y install mongodb-server
RUN yum -y install boost
RUN yum -y install scons
# Create the MongoDB data directory
RUN mkdir -p /data/db /var/log/mongodb /var/run/mongodb
RUN sed -i 's/dbpath =\/var\/lib\/mongodb/dbpath =\/data\/db/' /etc/mongodb.conf
# Expose port 27017 from the container to the host
EXPOSE 27017
# Set usr/bin/mongod as the dockerized entry-point application
ENTRYPOINT ["/usr/bin/mongod"]
#CMD ["--port", "27017", "--dbpath", "/data/db", "--smallfiles", "--fork", "--syslog"]
#RUN /usr/bin/mongod --smallfiles --port 27017 --dbpath /data/db --fork --syslog

VOLUME ["/sys/fs/cgroup", "/data/db", "/var/log/mongodb", "/usr/bin"]
CMD ["/usr/sbin/init"]

用于构建的 Docker 命令有:

(1)docker build -t rabbitmq_mongo_heisenbug .

(2)docker run --privileged -d -e 'container=docker' -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 29022:22 -p 29672:15672 -p 29017:27017 rabbitmq_mongo_heisenbug

或.. (3) docker run --privileged -ti -e 'container=docker' -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 29022:22 -p 29672:15672 -p 29017:27017 rabbitmq_mongo_heisenbug

【问题讨论】:

  • 一些关于在运行/启动 MongoDB 时究竟是什么失败的信息将有助于提出任何建议。任何日志都指向这一点?您是否能够安装 MongoDB,然后无法启动它或以其他方式启动它。
  • 当我在交互模式下运行时,它会抛出一个错误:“无效命令:/usr/sbin/init”。在更多的守护进程中,我无法通过 SSH 进入容器(因为它不会启动并且 IP 地址不会被占用)。

标签: mongodb rabbitmq docker sshd systemd


【解决方案1】:

您在 Dockerfile 中同时使用了 ENTRYPOINTCMD。这意味着,docker 将使用默认参数/usr/sbin/init 运行/usr/bin/mongod。我很确定这不是你想要的。

只要您指定的命令正在运行,Docker 就会运行。我不确定/usr/bin/mongod,但如果它以守护程序模式运行(即生成一个进程并返回),那么容器将立即停止运行。生成的进程将被终止。 /usr/sbin/init 或您指定的任何其他命令也是如此。您可以编写一个小的 shell 脚本,它会生成进程并在前台运行一个,或者您可以使用 runit 或一些类似的工具。

另外,您可能不需要在容器中运行sshd。见here为什么。

【讨论】:

  • 感谢您提供信息丰富的回复。 SSH:我需要 SSH,因为我希望我的 3 个守护程序在容器中运行(以及 rabbitmq/etc),然后在登录后运行 2 个其他应用程序。我在这里有一个问题 - 这不是正确的运行方法吗几个守护进程? MongoDB:我确实尝试过使用 CMD(它被注释掉以指示我尝试过的一些试错方案。例如,我有 1 个用逗号分隔的 CMD) CMD ["/usr/sbin/init"] [" /usr/sbin/init"、"--port"、"27017"、"--dbpath"、"/data/db"、"--smallfiles"、"--fork"、"--syslog"] 是这种情况有正确的方法吗?
  • 其实你的回答回答了我的问题。谢谢!我可以在阅读您的回复后进行设置。这是我所做的: 1. 注释掉 ENTRYPOINT 2. 在容器中运行以下命令: chown mongod:mongod /data/db chmod 0755 /data/db useradd mongodb groupadd mongodb chown mongod:mongod /data/db systemctl start mongod .service touch /data/db/mongod.lock chown mongod:mongod /data/db/mongod.lock /usr/bin/mongod --smallfiles 我从容器的历史记录中提取了这个。有些可能是多余的,没有必要;无论如何他们都会抛出一个错误。
猜你喜欢
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 2019-11-15
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
相关资源
最近更新 更多