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

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

这将从docker集线器中拉出cassandradocker图像,并用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没有多less经验,所以我不确定为什么我的应用程序没有连接到数据库,可能是端口没有打开传入的请求,但我不知道如何检查或改变它。

我在这里看到两个问题:

1) 文档说–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)dockerIP可能不是172.17.0.2。 它是localhost或尝试docker-machine ip