如何使用 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 Postgres 和 NodeJs 连接的文档/代码。请告诉我。 您需要执行 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