无法连接到dockerized postgresql服务器

时间:2019-12-28 12:54:50

标签: javascript node.js postgresql api docker

我无法通过node.js连接到我的Postgresql数据库 这样运行dockerized postgresql服务器(https://docs.docker.com/engine/examples/postgresql_service/)。可以与pgadmin连接,但不能与节点连接。在此端口上没有看到任何进程。我看到什么错误:

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 这是我的数据库类的简单示例。只是用于连接和简化查询请求方法的参数构造器。

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容器的实际端口。 如何解决我的问题?感谢反馈

3 个答案:

答案 0 :(得分:1)

您无法使用localhost连接到数据库容器,这里的localhost表示Nodejs容器而不是数据库容器。

{ Error: connect ECONNREFUSED 127.0.0.1:32775

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

要与数据库容器连接,您有两个选择。

  • 为DB和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为您处理网络,您可以使用容器名称引用任何容器进行连接。

答案 1 :(得分:0)

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

HOST = x.x.x.x

答案 2 :(得分:0)

您的node js应用程序正在使用docker运行吗? 如果是这种情况,则必须将两个容器放在同一网络上(最简单的解决方案),可以使用docker compose来做到这一点,后者会自动将所有容器放入同一网络,然后您可以通过其名称联系另一个容器。 或者,您可以使用以下命令检查数据库容器:

 docker container inspect DB_CONTAINER

找到NetworksSettings-> Networks->在这里您将找到网络名称

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

  docker network connect NETWORK_NAME NODE_CONTAINER_NAME

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

希望这对您有帮助!