无法从我的Node.js应用程序连接到Cassandra Docker容器

时间:2017-07-16 02:07:31

标签: node.js docker cassandra cassandra-3.0

我通过运行以下命令来设置Cassandra容器:

这将从docker hub中拉出cassandra docker镜像并启动一个带cassandra的容器

docker run --name cassandraDb -d --publish-all=true cassandra:3.11

我可以通过运行以下命令来设置它:

docker images
docker ps -a
docker exec -i -t cassandraDb sh -c 'nodetool status'

这是我的Node.js路由的代码,当我点击它时,我收到了正在进行的错误:

res.send(client.connect()
        .then(() => {
            console.log('Connected');
            console.log(Object.keys(client.metadata.keyspaces));
            return client.shutdown();
        })
        /* tslint:disable-next-line */
        .catch((err): any => {
            console.error('There was an error when connecting', err);
            return client.shutdown();
        }));

错误:

There was an error when connecting { [Error: All host(s) tried for query failed. First host tried, 172.17.0.2:9042: Error: Connection timeout. See innerErrors.]
  innerErrors:
   { '172.17.0.2:9042':
      { [Error: Connection timeout]
        message: 'Connection timeout',
        info: 'Cassandra Driver Error' } },
  info: 'Represents an error when a query cannot be performed because no host is available or could be reached by the driver.',
  message: 'All host(s) tried for query failed. First host tried, 172.17.0.2:9042: Error: Connection timeout. See innerErrors.' }

我对Cassandra或Docker没有多少经验,所以我不确定为什么我的应用程序没有连接到数据库,也许这些端口没有对收到的请求开放,但我不知道#39;我不知道如何检查或改变它。

1 个答案:

答案 0 :(得分:2)

我在这里看到两个问题:

1)documentation表示--publish-all = true | false ..是一个一揽子操作,它在图像的Dockerfile或--expose命令行标志中用EXPOSE行标识每个端口并将其映射到主机端口在短暂的端口范围内

相反,--publish-all将映射到随机端口docker run --name cassandraDb -d -p 7199:7199 -p 7000:7000 -p 9042:9042 -p 9160:9160 -p7001:7001 cassandra:3.11。您可以在docker ps输出中看到差异:

$ docker run --name cassandraDb -d -p 7199:7199 -p 7000:7000 -p 9042:9042 -p 
   9160:9160 -p7001:7001 cassandra:3.11 
$ docker ps
  ... PORTS   
      0.0.0.0:7000-7001->7000-7001/tcp, 0.0.0.0:7199->7199/tcp, 
      0.0.0.0:9042->9042/tcp, 0.0.0.0:9160->9160/tcp   cassandraDb

$ docker run --name cassandraDb -d --publish-all=true cassandra:3.11 
$ docker ps
... PORTS                                                                                                                         
    0.0.0.0:32782->7000/tcp, 0.0.0.0:32781->7001/tcp, 
    0.0.0.0:32780->7199/tcp, 0.0.0.0:32779->9042/tcp, 0.0.0.0:32778->9160/tcp 

2)Docker ip可能不是172.17.0.2。它是localhost或尝试docker-machine ip