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