2017-12-28 38 views
0

긴 문제입니다. 거의 2 일 동안이 문제를 디버깅 한 결과 나는 마침내 2 가지 문제를 발견했을 수도 있다고 생각합니다.docker 링크가 mongodb와 작동하지 않습니다.

제가하려는 것은 몽구스를 사용하여 graphql, express 및 mongo로 게임하는 것입니다. 충분히 간단하니? mongo 서버와 비동기 함수에 연결하는 데 몇 가지 문제가 있으며 도커와 관련이있을 수 있다고 생각합니다. links?

첫째 내가 가지고 노는거야 내 고정 표시기-작성 구조는

version: "3" 

services: 
    db: 
     build: 
      context: '.docker/mongo' 
     environment: 
      - MONGODB_USER="root" 
      - MONGODB_PASS="root" 
     volumes: 
      - ./.docker/mongo-data:/data/db 
     ports: 
      - 27017:27017 

    node-cli: 
     build: 
      context: '.docker/pm2' 
     working_dir: /var/www 
     volumes: 
      - ./:/var/www 
     environment: 
      - ENV=$ENV 
      - KEYMETRICS_PUBLIC=$KEYMETRICS_PUBLIC 
      - KEYMETRICS_SECRET=$KEYMETRICS_SECRET 
     links: 
      - db 
     ports: 
      - 3000:3000 
    nginx: 
     build: 
      context: '.docker/nginx' 
     ports: 
      - 80:80 
      - 43554:43554 
      - 443:443 
     environment: 
      - NGINX_HOST=$NGINX_HOST 
     links: 
      - db 
      - node-cli 

당신은 용기가가 keymetrics/pm2-docker-alpine:latest에서 실행 내 특급 응용 프로그램 '노드 CLI이'는 거기에있다 알 수 있습니다 아주 기본적인 것입니다 지금은 전혀 사용하지 않고있는 nginx; pm2에는 ssh에 대한 bash가 없으므로 관련성이 있으므로 지금 언급하십시오.

내 특급 응용 프로그램 :

import express from 'express'; 
import graphqlHTTP from 'express-graphql'; 
import schema from './schema'; 

// const root = { 
//  hello: 'heel', 
//  users: { 
//   id: 1, 
//   firstname: 'test', 
//   lastname: 'tester', 
//  }, 
// }; 

const app = express(); 

app.use('/', graphqlHTTP({ 
    schema: schema, 
    //rootValue: root, 
    graphiql: true, 
})); 

app.listen(3000,() => console.log('Running server on 3000')); 

내 DB 파일

import mongoose from 'mongoose'; 
import config from './config'; 

console.log('db config', config.config); 

mongoose.connect(config.url, config.config, (error, db) => { 

    if (error) { 
     console.error('db error', error); 
    } else { 
     console.log('db success'); 
    } 
}); 

mongoose.Promise = global.Promise; 

const db = mongoose.connection; 

export default db; 

이 모두가 몽고 연결을 제외하고 찾아 일을 '표시'. pm2 로그에서 나는 MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]을 볼 수 있습니다. 그래서 연결 문제가있는 것 같습니까? 내 호스트 컴퓨터에 mongodb를 설치하고 mongo --host mongodb://localhost:27017/test을 실행하고 붐 (boom)을 연결했습니다. 그런 다음 포트에 대해 읽은 다음 mockodb에 대한 도커에서 실행중인 명령을 확인하여 mongod --bind_ip_all이었고 대신 127.0.0.1:27017을 사용하여 호스트에있는 데이터베이스에 연결할 수 있는지 확인하고 정상적으로 작동했는지 확인했습니다. 고정 표시기에 대한 링크가 꺼져있는 경우

는 그때 궁금 그래서 nginx 용기에 MongoDB를 설치하고 데이터베이스에 연결을 시도하고 Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused는 그래서 다른 컨테이너에서 고정 표시기 컨테이너에 연결에 문제가있을 나타 납니까? mysql과 PHP 컨테이너와 비슷한 설정을 구축 했으므로 컨테이너가 링크되었을 때 왜 다른 컨테이너의 mongo 컨테이너에 연결할 수 없는지 잘 모르겠습니다. PM2 로그에

resolve: async (root, params, options, fieldASTs) => { 
        const projection = getProjection(fieldASTs); 

        console.log('select', projection); 

        console.log('before await'); 

        const results = await userModel.find() 
         .select(projection) 
         .exec((error, result) => { 
          console.log('hello!'); 
          console.log('error', error); 
          console.log('results', result); 
         }); 

        console.log('success'); 

        return results; 
       }, 

:

나는 아마도 비동기가 될 수 목격 한 또 다른 가능한 문제는 내가 다음과 같은 결의를 요청할 때 매달려 서버가 아닌 다른 그와 관련된 오류를 했어하지만 기능을 기다리고 있습니다 나는 기다리기 전에 도착한다, 그리고, 단지 거기에 앉아있다. Graphiql은 거기에 앉아 있습니다. 데이터베이스 연결이 없기 때문에이 프로세스가 실제로 닫히거나 종료되어야하기 때문일 수 있습니다.

버전 :

pm2god : 2.5.0

몽고 :

MongoDB shell version v3.6.0 
git version: a57d8e71e6998a2d0afde7edc11bd23e5661c915 
OpenSSL version: OpenSSL 1.0.1t 3 May 2016 
allocator: tcmalloc 
modules: none 
build environment: 
    distmod: debian81 
    distarch: x86_64 
    target_arch: x86_64 

노드 : 8.1.3

패키지 :

{ 
    "name": "testgql", 
    "version": "1.0.0", 
    "main": "dist/index.js", 
    "license": "MIT", 
    "scripts": { 
    "start": "webpack --config=webpack.config.js --progress --watch" 
    }, 
    "dependencies": { 
    "express": "^4.16.2", 
    "express-graphql": "^0.6.11", 
    "graphql": "^0.12.3", 
    "mongoose": "^4.13.7" 
    }, 
    "devDependencies": { 
    "babel-polyfill": "^6.26.0", 
    "babel-preset-env": "^1.6.1", 
    "webpack": "^3.10.0" 
    } 
} 

mongo docker (최신) : https://hub.docker.com/_/mongo/

도커 설정 외부에서 응용 프로그램을 실행 했으므로 완벽하게 작동합니다! 또한 데이터베이스에 연결하여 바인드되지 않은 도커 컨테이너와 확실히 연결합니다.

답변

0

노드 응용 프로그램의 localhost을 사용하여 mongo 컨테이너에 연결할 수 없습니다.

네트워크 기능에 대한 docker-composedocs을 확인하십시오.

기본적으로 작성은 앱의 단일 네트워크를 설정합니다. 서비스의 각 컨테이너는 기본 네트워크에 연결되며 해당 네트워크의 다른 컨테이너에서 연결할 수 있으며 컨테이너 이름과 동일한 호스트 이름에서 검색 할 수 있습니다.

노드 응용 프로그램에서 db:27017을 사용해야합니다.

ports을 사용하여 port mappings을 지정했기 때문에 호스트와의 연결이 작동하는 이유가 있습니다.