最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

docker链接不与mongodb一起使用

IT培训 admin 5浏览 0评论

docker链接不与mongodb一起使用

有点长问题。已经调试了近两天了,我想我可能最终找到了2个可能的问题。

我正在尝试做的是使用mongoose使用graphql,express和mongo。听起来很简单?连接到mongo服务器和异步函数有一些问题,我相信它可能与docker-compose links有关?

首先,我正在玩的Docker-compose结构非常基本

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

您会注意到容器是一个'node-cli',这是我在keymetrics/pm2-docker-alpine:latest上运行的快速应用程序,有一个nginx,我现在根本就没有使用它;现在提到它,因为它有一些相关性,因为pm2没有bash to ssh。

我的快递应用:

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;

除了mongo连接之外,所有“看起来”都可以找到工作。在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:连接正常。然后我读了一些关于端口的东西,所以我检查了在docker中运行的mongodb命令,这是mongod --bind_ip_all并检查我可以使用127.0.0.1:27017从我的主机连接到数据库而且工作正常!

然后我想知道docker的链接是否关闭了,所以我在nginx容器上安装了mongodb并试图连接到数据库和Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused所以看起来从另一个容器连接到docker容器有问题?我用mysql和php容器构建了类似的设置,所以我不确定为什么在链接容器时我无法从另一个容器连接到mongo容器?

我目睹的另一个可能的问题可能是异步等待函数但是我没有与它们相关的错误,除了服务器挂起时请求如下所示的解决方案:

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;
                },

在pm2日志中,我在等待之前到达,然后它就在那里悬挂。 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

因为:くzxswい

包:

8.1.3

mongo docker(最新):{ "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" } }

我也刚刚在docker设置之外运行了应用程序,它完美无缺!还连接到数据库,所以它肯定与docker容器没有绑定

回答如下:

您不能使用节点应用程序中的https://hub.docker/_/mongo/连接到localhost容器。

检查mongo docker-compose网络功能。

默认情况下,Compose为您的应用设置单个网络。服务的每个容器都加入默认网络,并且该网络上的其他容器都可以访问它们,并且它们可以在与容器名称相同的主机名上发现。

您需要使用节点应用程序中的docs。

从主机连接的原因是因为您使用db:27017指定了port mappings。

docker链接不与mongodb一起使用

有点长问题。已经调试了近两天了,我想我可能最终找到了2个可能的问题。

我正在尝试做的是使用mongoose使用graphql,express和mongo。听起来很简单?连接到mongo服务器和异步函数有一些问题,我相信它可能与docker-compose links有关?

首先,我正在玩的Docker-compose结构非常基本

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

您会注意到容器是一个'node-cli',这是我在keymetrics/pm2-docker-alpine:latest上运行的快速应用程序,有一个nginx,我现在根本就没有使用它;现在提到它,因为它有一些相关性,因为pm2没有bash to ssh。

我的快递应用:

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;

除了mongo连接之外,所有“看起来”都可以找到工作。在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:连接正常。然后我读了一些关于端口的东西,所以我检查了在docker中运行的mongodb命令,这是mongod --bind_ip_all并检查我可以使用127.0.0.1:27017从我的主机连接到数据库而且工作正常!

然后我想知道docker的链接是否关闭了,所以我在nginx容器上安装了mongodb并试图连接到数据库和Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused所以看起来从另一个容器连接到docker容器有问题?我用mysql和php容器构建了类似的设置,所以我不确定为什么在链接容器时我无法从另一个容器连接到mongo容器?

我目睹的另一个可能的问题可能是异步等待函数但是我没有与它们相关的错误,除了服务器挂起时请求如下所示的解决方案:

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;
                },

在pm2日志中,我在等待之前到达,然后它就在那里悬挂。 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

因为:くzxswい

包:

8.1.3

mongo docker(最新):{ "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" } }

我也刚刚在docker设置之外运行了应用程序,它完美无缺!还连接到数据库,所以它肯定与docker容器没有绑定

回答如下:

您不能使用节点应用程序中的https://hub.docker/_/mongo/连接到localhost容器。

检查mongo docker-compose网络功能。

默认情况下,Compose为您的应用设置单个网络。服务的每个容器都加入默认网络,并且该网络上的其他容器都可以访问它们,并且它们可以在与容器名称相同的主机名上发现。

您需要使用节点应用程序中的docs。

从主机连接的原因是因为您使用db:27017指定了port mappings。

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论