2017-05-14 60 views
3

我有問題將作爲docker容器運行的nodeJS應用程序連接到mongoDB。讓我解釋我到目前爲止做了什麼:如何將nodeJS docker容器連接到mongoDB

$ docker ps 

CONTAINER ID IMAGE  COMMAND     CREATED  STATUS  PORTS  NAMES 
3a3732cc1d90 mongo:3.4 "docker-entrypoint..." 3 weeks ago Up 3 weeks 27017/tcp mongo_live 

正如你所看到的,已經有一個mongo docker容器在運行。

現在我跑我的應用程序的NodeJS泊塢窗容器(這是從meteorJS構建):通過運行

$ docker run -it 0b422defbd59 /bin/bash 

在此泊塢窗容器我想要運行的應用程序:

$ node main.js 

現在我得到錯誤

Error: MONGO_URL must be set in environment 

我已經嘗試設置MONGO_URL通過設置:

ENV MONGO_URL mongodb://mongo_live:27017/ 

但是,這並不工作:

MongoError: failed to connect to server [mongo_live:27017] on first connect 

所以我的問題是如何連接到一個數據庫,這是 - 據我瞭解 - 運行容器的「外部」。另外如何設置一個新的數據庫到這個容器?

回答

5

有幾種方法可以做到這一點。

  • 運行在同一網絡作爲您的MongoDB中的應用:

    docker run --net container:mongo_live your_app_docker_image 
    
    # then you can use mongodb in your localhost 
    $ ENV MONGO_URL mongodb://localhost:27017/ 
    
  • 您也可以鏈接兩個容器:

    docker run --link mongo_live:mongo_live you_app_image .. 
    # Now mongodb is accessible via mongo_live 
    
  • 使用MongoDB的容器IP地址:

    docker inspect -f '{{.NetworkSettings.IPAddress}}' mongo_live 
    # you will get you container ip here 
    
    $ docker run -it 0b422defbd59 /bin/bash 
    # ENV MONGO_URL mongodb://[ip from previous command]:27017/ 
    
  • 您可以將您的MongoDB端口綁定到你的主機和使用主機的主機名,在你的應用程序

  • 您可以使用docker network,並在同一網絡中同時運行的應用程序

  • 你可以通過--add-host mongo_live:<ip of mongo container>到碼頭工人運行你的應用程序然後用mongo_live MongoDB的URL

  • 您還可以使用docker compose,使您的生活更輕鬆;)

...

+0

我使用泊塢窗撰寫,但不是本案件。讓我解釋一下:這裏是CI工作流程的一部分。因此,我使用dockerfile運行docker build:docker build -t $ CI_REGISTRY_IMAGE:test -f Dockerfile.test。所以我不知道如何在這個設置中使用docker撰寫... – user3142695

+0

Docker撰寫也可以構建一個圖像,您也可以調用運行與撰寫,這可能有助於運行測試。還有'--abort-on-container-exit'選項,對於在CI中運行測試也很有用。例如:https://github.com/mobilityhouse/prometheus-bridge/blob/master/Jenkinsfile#L78 – Boynux

+0

我已經發布了一個docker-compose解決方案,我相信你可以使用它作爲參考並找出它 –

1

當您運行容器時,每個容器在獨立網絡中工作。因爲一個容器無法連接到其他點到點。

的3種方法network magic

  • 連接容器通過本地主機容器

    1. 具有低級別的碼頭工人有點小題大做連接。每個容器必須公開本地主機上的端口(作爲你的mongo_live)。但您需要添加到本地主機上的主機ile 127.0.0.1 mongo_live這是最簡單的方式
    2. 使用docker-compose。它是將多個容器一起工作的便利工具。 (這是正確的方式

    將mongodb添加到應用程序容器是不是碼頭方式。

  • 0

    請使用下面的代碼片段爲您的docker-compose.yml文件,用您的實際數據替換註釋。應該解決你的問題。

    version: '2' 
        services: 
         db: 
         build: <image for mongoDB> 
         ports: 
          - "27017:27017" # whatever port u r using 
         environment: 
          #you can specify mondo db username and stuff here 
         volumes: 
          - #load default config for mondodb from here 
          - "db-data-store:/data/db" # path depends on which image you use 
         networks: 
          - network 
        nodejs: 
         build: #image for node js 
         expose: 
          - # mention port for nodejs 
         volumes: 
          - #mount project code on container 
         networks: 
          - network 
         depends_on: 
          - db 
    
    networks: 
        network: 
        driver: bridge 
    

    請使用參考以下鏈接:
    1)NodeJs Docker
    2)MongoDb docker
    3)docker-compose tutorial

    祝您好運

    相關問題