代码之家  ›  专栏  ›  技术社区  ›  benjaminplanche

Docker-Node.js+MongoDB-“错误:无法连接到[localhost:27017]”

  •  4
  • benjaminplanche  · 技术社区  · 11 年前

    我正在尝试为我的 节点 应用程序。此应用程序使用 MongoDB数据库 以确保一定的数据持久性。 所以我创造了这个 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"]
    

    然后我通过以下方式构建并启动整个过程:

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

    但机器显示以下错误:

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

    知道我做错了什么吗?谢谢

    2 回复  |  直到 11 年前
        1
  •  1
  •   jpetazzo    11 年前

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

    如果你想在一个容器中运行多个进程,你需要一个进程管理器(如Supervisor、god、monit),或者从脚本在后台启动进程;例如。:

    #!/bin/sh
    mongod &
    node myapp.js &
    wait
    
        2
  •  1
  •   user1859465    10 年前

    按如下方式重新定义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