无法从我的 Node.js 应用连接到 Cassandra Docker 容器
Can't connect to Cassandra Docker container from my Node.js app
我通过 运行 以下命令设置了 Cassandra 容器:
这将从 docker 集线器中拉取 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 的经验,所以我不确定为什么我的应用程序没有连接到数据库,可能是端口没有对传入请求开放,但是我不知道如何检查或更改它。
我在这里看到两个问题:
1) documentation 说 --publish-all=true|false .. 是一个笼统的操作,它在图像的 Docker 文件或 --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
我通过 运行 以下命令设置了 Cassandra 容器:
这将从 docker 集线器中拉取 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 的经验,所以我不确定为什么我的应用程序没有连接到数据库,可能是端口没有对传入请求开放,但是我不知道如何检查或更改它。
我在这里看到两个问题:
1) documentation 说 --publish-all=true|false .. 是一个笼统的操作,它在图像的 Docker 文件或 --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