簡體   English   中英

“ConnectionError:connect ECONNREFUSED”,無法使用 Docker Compose 連接 Node.js 應用程序和 Elasticsearch 數據庫

[英]"ConnectionError: connect ECONNREFUSED", cannot connect Node.js app and Elasticsearch database with Docker Compose

當我在 Docker 中的同一個橋接網絡上運行時,我試圖讓我的 Node.js 應用程序與我的 Elasticsearch 數據庫對話。 我使用 docker-compose.yml 文件進行配置。 這是相關的位和我收到的錯誤消息。

docker-compose.yml

version: '3'

services:
  express-app:
    build: /path/to/app
    container_name: my_app
    depends_on:
      - 'elasticsearch'
    environment:
     - NODE_ENV=local
     - ES_HOST=elasticsearch
     - PORT=3000
    ports:
      - 3000:3000
    networks:
      - backend

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.6.0
    container_name: es-master
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    volumes:
      - esdata:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
      - 9300:9300
    networks:
      - backend

volumes:
  esdata:
    driver: local

networks:
  backend:

我想這兩個服務( express-appelasticsearch是指被創建,“my_app_backend”,與他們的服務名稱泊塢橋網絡上發現的,官方泊塢窗文件指出,“服務是主機名到達。”我的意圖是在地址“ http://elasticsearch:9200 ”處訪問服務elasticsearch。

Node.js 應用程序中的數據庫連接定義 (server/db/index.js)

const { Client } = require('@elastic/elasticsearch');
const hostname = process.env.ES_HOST || 'localhost';
const client = new Client({
  node: `http://${hostname}:9200`,
  log: 'error'
});

async function checkConnection () {
  let isConnected = false;
  console.log('Connecting to host', hostname);
  try {
    const health = await client.cluster.health({});
    console.log(health);
    isConnected = true;
  } catch (err) {
    console.log('process.env.ES_HOST', process.env.ES_HOST);
    console.log('Connection Failed\n', err);
  }
}

checkConnection();

module.exports.client = client;

下面的消息顯示了 Node.js 應用程序嘗試通過 process.env.ES_HOST 變量“elasticsearch”(在 docker-compose.yml 文件中定義)連接到 Elasticsearch 並在容器運行時執行的結果。 錯誤消息顯示了我用來檢查變量是否具有正確值的幾個控制台日志。

ECONNREFUSED 后顯示的 IP 地址是 Docker 引擎替換“elasticsearch”的地址。 當我運行docker network inspect my_app_backend輸出容器的網絡地址時,也可以找到這一點。

... (redacted)
"MacAddress": "02:42:ac:14:00:03",
                "IPv4Address": "172.20.0.3/16",
                "IPv6Address": ""

錯誤信息

> NODE_ENV=production node ./server/index.js

Connecting to host elasticsearch
Server listening on port 3000!
process.env.ES_HOST elasticsearch
Connection Failed
 ConnectionError: connect ECONNREFUSED 172.20.0.3:9200
    at onResponse (/src/app/node_modules/@elastic/elasticsearch/lib/Transport.js:214:13)
    at ClientRequest.<anonymous> (/src/app/node_modules/@elastic/elasticsearch/lib/Connection.js:98:9)
    at ClientRequest.emit (events.js:311:20)
    at Socket.socketErrorListener (_http_client.js:426:9)
    at Socket.emit (events.js:311:20)
    at emitErrorNT (internal/streams/destroy.js:92:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  name: 'ConnectionError',
  meta: {
    body: null,
    statusCode: null,
    headers: null,
    warnings: null,
    meta: {
      context: null,
      request: [Object],
      name: 'elasticsearch-js',
      connection: [Object],
      attempts: 3,
      aborted: false
    }
  }
}

另外,我想指出應用程序在啟動時連接失敗,但是當我通過docker exec -it express-app sh進入應用程序容器並編輯數據庫連接代碼並硬編碼數據庫的 IP 地址時(172.20.0.3 ),然后重新啟動node app,app成功連接數據庫。

在嘗試通過 docker-compose 實現完全自動化時,我做錯了什么? 這是 Elasticsearch 的一個怪癖還是我遺漏了一些非常明顯的東西? 預先感謝您的幫助!

使用container_name : es-master ,而不是elasticsearch作為ES_HOST ENV中express_app變量

ES_HOST : es-master

我認為你應該鏈接 elasticsearch 容器

version: '3'

services:
  express-app:
    build: /path/to/app
    container_name: my_app
    restart: always
    depends_on:
      - 'elasticsearch'
    environment:
     - NODE_ENV=local
     - ES_HOST=elasticsearch
     - PORT=3000
    ports:
      - 3000:3000
    networks:
      - backend
    links: 
        - elasticsearch

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.6.0
    container_name: es-master
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    volumes:
      - esdata:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
      - 9300:9300
    networks:
      - backend

volumes:
  esdata:
    driver: local

networks:
  backend:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM