如何使用 NodeJs 连接到 docker compose 中的 postgres?

Posted

技术标签:

【中文标题】如何使用 NodeJs 连接到 docker compose 中的 postgres?【英文标题】:How to connect to postgres inside docker compose with NodeJs? 【发布时间】:2019-04-22 16:22:34 【问题描述】:

我已经使用 Docker 在云服务器中安装了 Mainflux。 Postgres DB 也是 在 Docker 容器中运行。我有一种情况要使用 Node.Js(以编程方式)连接到 PostgresDB。我发现“pg”模块连接到云 Postgres 数据库。但是,我无法连接到正在运行的 Postgres 码头集装箱。我在下面粘贴了我的代码,请让我知道连接“Docker Postgres”的场景。

  const pg = require('pg');
  const conStringPri = postgres://mainflux:mainflux@MYIP/mainflux-things-db;
  const Client = pg.Client;
  const client = new Client(connectionString: conStringPri);
  client.connect();
  client.query(CREATE DATABASE DB_Name)
  .then(() => client.end());

报错如下:

node:8084) UnhandledPromiseRejectionWarning: 错误: 连接 ECONNREFUSED MYIP:5432 在 TCPConnectWrap.afterConnect [as oncomplete] (net.js:1191:14) (节点:8084) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。 此错误源于在异步函数内部抛出 没有 catch 块或拒绝未处理的承诺 .catch()(拒绝 id:1) (节点:8084)[DEP0018] DeprecationWarning:未处理的承诺拒绝是 已弃用。将来,未处理的 Promise 拒绝将 终止 Node.js 进程 非零退出代码。 (节点:8084)UnhandledPromiseRejectionWarning:错误:连接 意外终止 在 Connection.con.once (D:\postgres_Nodejs\node_modules\pg\lib\client.js:200:9) 在 Object.onceWrapper (events.js:313:30) 在 emitNone (events.js:106:13) 在 Connection.emit (events.js:208:7) 在套接字。 (D:\postgres_Nodejs\node_modules\pg\lib\connection.js:76:10) 在 emitOne (events.js:116:13) 在 Socket.emit (events.js:211:7) 在 TCP._handle.close [as _onclose] (net.js:561:12)

【问题讨论】:

【参考方案1】:

如果您使用此处提供的 docker-compose 配置启动 Mainflux https://github.com/mainflux/mainflux/blob/master/docker/docker-compose.yml,那么您的 PostgreSQL 容器不会将端口暴露给主机。为了能够连接到数据库,你需要暴露这个端口。

这是 docker-compose 部分的外观示例,其中 things-db 容器的端口 5432(默认 PostgreSQL 端口)暴露

   things-db:                                                                                                                                                                
    image: postgres:10.2-alpine                                                                                                                                             
    container_name: mainflux-things-db                                                                                                                                      
    restart: on-failure                                                                                                                                                     
    environment:                                                                                                                                                            
      POSTGRES_USER: mainflux                                                                                                                                               
      POSTGRES_PASSWORD: mainflux                                                                                                                                           
      POSTGRES_DB: things                                                                                                                                                   
    networks:                                                                                                                                                               
      - mainflux-base-net                                                                                                                                                   
    ports:                                                                                                                                                                  
      - 5432:5432  

所以你需要修改你的 docker-compose.yml。 请注意 Mainflux docker compose 在 2 个容器中拥有 2 个 PostgreSQL 数据库:things-db 和 users-db。

【讨论】:

亲爱的萨瓦,感谢您的回答。我按照您上面的建议更新了我的“docker-compose.yml”文件。但是,我无法连接到在 Docker 上运行的“PostgresDB”。如果您有任何将与 Docker PostgresNodeJs 连接的文档/代码。请告诉我。 您需要执行 docker-compose down 和 docker-compose up 以创建新容器。请注意,此操作将破坏您当前的容器以及存储在其中的所有数据,因此只有在您不介意丢失这些数据时才执行此操作。 是的,我的问题解决了。非常感谢萨瓦。仅供参考(如果我们关闭和升级容器,我们的数据不会丢失。如果我们杀死或移除容器,只会丢失我们的数据。)仅供参考。

以上是关于如何使用 NodeJs 连接到 docker compose 中的 postgres?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PhpStorm / WebStorm 连接到远程 nodejs 调试会话?

使用 docker-compose 将 NodeJS-App 连接到 MongoDB

尝试通过 docker-compose 将 NodeJS 应用程序连接到 MySQL 映像时出现 ECONNREFUSED

Nginx 错误失败(111:连接被拒绝)同时连接到上游,docker-compose nodejs

将 NodeJS Docker 容器连接到 MySQL Docker 容器 - docker-compose 3

从 ECS 集群中的 docker nodejs EC2 容器连接到 Redis Elasticache 集群