如何在 docker 中从一个容器获取数据到另一个容器?我收到 ECONNREFUSED 错误

Posted

技术标签:

【中文标题】如何在 docker 中从一个容器获取数据到另一个容器?我收到 ECONNREFUSED 错误【英文标题】:How can I get data from one container to another in docker? I am getting ECONNREFUSED error 【发布时间】:2018-11-26 21:43:21 【问题描述】:

我一直在尝试使用 docker 从 postgres 容器获取信息到节点容器。我使用了下面提供的 docker-compose 文件:

version: "3"
services:
  postgres:
    image: postgres:latest
    volumes:
      - ./pgdata:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    networks:
      - webnet
    environment: 
      POSTGRES_USER: 'postgres'
      POSTGRES_PASSWORD: 'root'
      POSTGRES_DB: 'tweets1'
      PGDATA: '/tmp'
  web:
    image: node-app
    ports:
      - "4556:3000"
    depends_on:
      - "postgres"
    links:
      - postgres
    networks:
      - webnet
    command: ["./wait-for-it.sh","postgres:5432","--","node","dashboard.js"]
networks:
  webnet:

在我运行 docker-compose up 之后,日志中的所有内容看起来都很好。 Postgres 首先启动,我实际上可以使用

访问数据库
psql -h localhost -p 3030 -U postgres tweets1

当我在浏览器中加载 node-web 应用程序时,除了应该从数据库中检索的信息之外,所有内容都可以完美加载。我在容器的日志中收到以下错误:

错误:连接 ECONNREFUSED 127.0.0.1:5432 at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1158:14) 代码:'ECONNREFUSED', 系统调用:'连接', 地址:'127.0.0.1', 端口:5432

我一直在尝试在我的 PG 配置变量中使用 host.docker.internal,但它也不起作用。当我通过 docker container ps 检查我的容器时。两者都已启动并正在运行。

提前非常感谢您!

【问题讨论】:

【参考方案1】:

你的第一个命令:

psql -h localhost -p 3030 -U postgres tweets1

在您的 主机 上工作,因为您在声明 postgres 容器时添加了端口绑定。但是端口绑定不适用于其他容器。

容器 -> 容器连接需要常规的网络连接。

您会发现,链接的容器通常是由 docker 使用您分配给容器的名称在容器的 /etc/hosts 中声明的。

所以,在web 容器中尝试:

psql -h postgres -p 3030 -U postgres tweets1

最后:

在您的代码中,您应该连接到 postgres 主机而不是 localhost。

【讨论】:

非常感谢!这实际上是我遇到的问题,并通过连接到 postgres 而不是 localhost 得到了解决。

以上是关于如何在 docker 中从一个容器获取数据到另一个容器?我收到 ECONNREFUSED 错误的主要内容,如果未能解决你的问题,请参考以下文章

将带有数据的 Docker 容器克隆到另一个主机

如何在 Docker 容器中从 WordPress(联系表格)发送电子邮件?

如何在 docker 中拍摄容器快照

我可以在我的 docker 容器中获取 IP 地址吗?

如何在不同主机之间移动 Docker 容器?

如何从片段获取数据到另一个活动? (不是容器活动)[重复]