无法连接到Docker化的PostgreSQL服务器。

4

我遇到了用Node.js连接PostgreSQL数据库的问题。 我运行像这样的Docker化PostgreSQL服务器(https://docs.docker.com/engine/examples/postgresql_service/),可以使用pgadmin连接,但无法使用node连接。 我在该端口上没有看到任何进程。 我看到的错误是:

MacBook-Pro-Maxim:nodejs lucio$ docker logs 5cc44d01bf4ada729e5f1c71157e4eba5cb6fa9fd40122f384b423fbd1ae13a7
2019-12-28T12:38:53: PM2 log: Launching in no daemon mode
2019-12-28T12:38:53: PM2 log: App [index:0] starting in -fork mode-
2019-12-28T12:38:53: PM2 log: App [index:0] online
{ Error: connect ECONNREFUSED 127.0.0.1:32775
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1107:14)
  errno: 'ECONNREFUSED',

  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 32775 }

database.js

这是我的DataBase类的简单示例。只需构造连接参数和简单查询请求方法。

const {
  Pool,
  Client
} = require('pg')
const sqlQueryGenerator = require('sql-query-generator')
const sqlGenerator = require('sql')
sqlGenerator.setDialect('postgres')
sqlQueryGenerator.use('postgres')

class DataBase {
  constructor(params) {
    this.base = new Pool(params)
  }
  query(text) {
    return new Promise((resolve, reject) => {
      this.base.query(text, (err, res) => {
        if (err) reject(err)
        resolve(res)
      })
    })
  }
}

module.exports = DataBase

在我的api.js文件中使用这个模块

require('dotenv').config({ path: './.env' })
const DataBase = require('./database')
const db = new DataBase({
   user     : process.env.USER,
   host     : process.env.HOST,
   database : process.env.TABLE,
   password : process.env.PASSWORD,
   port     : process.env.PORT,
})

这是我的 .env 文件

HOST = localhost
USER = docker
TABLE = docker
PASSWORD = docker
PORT = 32775

在运行 Node.js API 容器之前,我要检查我的 PostgreSQL Docker 容器的实际端口。如何解决这个问题?感谢您的反馈。

我猜测Node运行在不同的容器中,因此您需要使用PostgreSQL容器的IP而不是127.0.0.1 - t.niese
@t-niese将我的主机更改为127.0.0.1,仍然无法连接。出现相同的错误。 - designervoid
3个回答

2

您不能使用 localhost 连接到 DB 容器,这里的 localhost 指的是 Nodejs 容器而不是 DB 容器。

{ Error: connect ECONNREFUSED 127.0.0.1:32775

在nodejs容器中寻找数据库连接。

要连接到数据库容器,您有两个选项。

  • 使用公共网络连接数据库和nodejs,并使用服务名称连接数据库。
HOST = db_container_name
USER = docker
TABLE = docker
PASSWORD = docker
PORT = 5432
  • 使用主机IP进行数据库连接。
HOST = HOST_IP
USER = docker
TABLE = docker
PASSWORD = docker
PORT = 32775

最好使用docker-compose来处理网络,它可以为您处理网络,并且您可以通过容器的名称来参考任何容器以进行连接。

不是与容器附加的接口。您可以链接nodejs容器或使用docker-compose。或者临时解决方法是复制DB容器IP并使用该IP。 docker inspect 3663ffa6607f 并获取IP,但它会经常更改。 - Adiii
你尝试过使用DB容器IP吗?docker inspect db_container - Adiii
在这个 JSON 中,哪个键是容器 IP?是 "IPAddress" 吗? - designervoid
请使用 172.17.0.2 这个IP地址,但请注意该地址会经常变化或在重启后发生变化,因此最好使用Docker网络。详情请参考:https://docs.docker.com/compose/networking/ - Adiii
1
使用容器IP时,应该使用暴露端口5432,而不是发布端口。 - Adiii
显示剩余3条评论

0

在 .env 文件中使用您的主机 IP:

HOST = x.x.x.x

将我的HOST更改为127.0.0.1和0.0.0.0,同时尝试更改我的Docker容器名称。但无法解决同样的问题。 错误:连接ECONNREFUSED 127.0.01:32775 错误:连接ECONNREFUSED 0.0.0.0:32775 - designervoid
1
0.0.0.0不是IP地址,如果您将0.0.0.0设置为任何侦听器的地址,则意味着您可以通过使用docker的任何可用网络接口连接到该侦听器。如果您需要检查与任何IP和端口的连通性,可以使用telnet客户端(telnet IP port)。首先获取容器ID: docker ps (第一列是容器ID) 使用容器ID运行: docker inspect <container ID> 在底部的“NetworkSettings”下,您可以找到“IPAddress”,或者只需执行: docker inspect <container id> | grep "IPAddress" - Kalum Umesh

0

你的 Node.js 应用程序正在使用 Docker 运行,对吗? 如果是这种情况,你必须将两个容器放在同一个网络中(最简单的解决方案),你可以使用 Docker Compose 来实现自动将所有容器放置在同一个网络中,然后通过名称联系另一个容器。 或者你可以使用以下命令检查 DB 容器:

 docker container inspect DB_CONTAINER

查找 NetworksSettings -> Networks --> 在这里你会找到网络名称

然后您可以将您的 Node.js 容器连接到同一网络

  docker network connect NETWORK_NAME NODE_CONTAINER_NAME

现在,您应该能够通过 DB 容器主机名(默认情况下为容器的 ID,但您可以在执行 docker run 命令时使用 --hostname 参数指定主机名)将节点容器连接到 DB。

希望这能帮助到您!


是的,我有两个容器。第一个是使用Node.js,第二个是使用Docker。我现在将尝试这个解决方案。 - designervoid
连接出现错误 从守护进程收到的错误响应:名为fervent_merkle的端点已经存在于网络桥中 - designervoid
@designervoid,也许你的第二个容器已经在同一个网络上了,请使用docker inspect命令来检查,并且在DB容器中检查主机名,你需要使用它来连接你的Node.js进程到数据库。请告诉我,希望能帮到你。 - pioardi
更新: 另一个解决方案是通过Docker的--network标志连接到Docker网络。 - designervoid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接