Docker – Node.js + MongoDB – “错误:无法连接到”

我正在尝试为我的Node应用程序创build一个容器。 这个应用程序使用MongoDB来确保一些数据持久性。 所以我创build了这个Dockerfile

FROM ubuntu:latest # --- Installing MongoDB # Add 10gen official apt source to the sources list RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 RUN echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee /etc/apt/sources.list.d/10gen.list # Hack for initctl not being available in Ubuntu RUN dpkg-divert --local --rename --add /sbin/initctl RUN ln -s /bin/true /sbin/initctl # Install MongoDB RUN apt-get update RUN apt-get install mongodb-10gen # Create the MongoDB data directory RUN mkdir -p /data/db CMD ["usr/bin/mongod", "--smallfiles"] # --- Installing Node.js RUN apt-get update RUN apt-get install -y python-software-properties python python-setuptools ruby rubygems RUN add-apt-repository ppa:chris-lea/node.js # Fixing broken dependencies ("nodejs : Depends: rlwrap but it is not installable"): RUN echo "deb http://archive.ubuntu.com/ubuntu precise universe" >> /etc/apt/sources.list RUN echo "deb http://us.archive.ubuntu.com/ubuntu/ precise universe" >> /etc/apt/sources.list RUN apt-get update RUN apt-get install -y nodejs # Removed unnecessary packages RUN apt-get purge -y python-software-properties python python-setuptools ruby rubygems RUN apt-get autoremove -y # Clear package repository cache RUN apt-get clean all # --- Bundle app source ADD . /src # Install app dependencies RUN cd /src; npm install EXPOSE 8080 CMD ["node", "/src/start.js"] 

然后,我通过以下方式构build和发布整个事情:

 $ sudo docker build -t aldream/myApp $ sudo docker run aldream/myApp 

但机器显示以下错误:

 [error] Error: failed to connect to [localhost:27017] 

任何想法我做错了什么? 谢谢!

你真的docker run aldream/myApp ? 在这种情况下,使用您提供的Dockerfile,它应该运行MongODB,但不是您的应用程序。 是否有另一个CMD命令,或另一个Dockerfile,或者你运行docker run aldream/myApp <somethingelse> ? 在后一种情况下,它将覆盖CMD指令,MongoDB将不会启动。

如果你想在一个容器中运行多个进程,你需要一个进程pipe理器(比如Supervisor,God,Monit),或者通过脚本启动后台进程。 例如:

 #!/bin/sh mongod & node myapp.js & wait 

重新定义你的Dockerfile如下;

 COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf # ENTRYPOINT should not be used as it wont allow commands from run to be executed # Define mountable directories. VOLUME ["/data/db"] # Expose ports. # - 27017: process # - 28017: http # - 9191: web app EXPOSE 27017 28017 9191 ENTRYPOINT ["/usr/bin/supervisord"] 

supervisord.conf将包含以下内容;

 [supervisord] nodaemon=true [program:mongod] command=/usr/bin/mongod --smallfiles stdout_logfile=/var/log/supervisor/%(program_name)s.log stderr_logfile=/var/log/supervisor/%(program_name)s.log autorestart=true [program:nodejs] command=nodejs /opt/app/server/server.js