使用 Docker 在 NodeJS 上请求外部 API 很慢

使用 Docker 在 NodeJS 上请求外部 API 很慢

我正在尝试让 NodeJS 服务器响应来自外部 API 的数据。考虑index.js文件:

const express = require('express');
const axios = require('axios');
const app = express();

app.get('/api', async function (req, res) {

  url = 'http://freegeoip.app/json/';

  // external API request
  var ax = axios.get(url)
    .then(function(data) {
      res.json(data.data)
    })
    .catch(function(err) {
      res.status(404);
    })

})

app.listen(3000);

当我访问http://localhost:3000/apiJSON 数据来自http://freegeoip.app/json/在 500 毫秒内呈现并加载。

问题是我的生产中的 NodeJS 服务器在 Docker 容器中运行。在我的 Docker 容器中运行完全相同的代码大约需要 5 秒钟才能加载。我怀疑这是 Docker 容器的 DNS 解析问题。有没有办法显示使用 axios 的外部 API 请求所花费的时间?如果这是 DNS 问题,它似乎只会影响 NodeJS,因为我可以从另一个 Docker 容器中使用 curl。

以下是供参考Dockerfiledocker-compose.yml

FROM node:15.14.0-alpine3.13
WORKDIR /backend
RUN npm install express
RUN npm install axios
RUN npm install -g nodemon
COPY . .
CMD ["nodemon", "/backend/index.js"]
version: '3'

services:

  backend:
    restart: always
    build: ./backend
    volumes:
      - ./backend:/backend
      - /backend/node_modules
    ports:
      - "3000:3000"

答案1

这是 DNS 问题。偶然发现此 Stack Overflow 帖子,可以在 docker-compose.yml 文件中指定 DNS 服务器。API 数据现在的加载速度与浏览器一样快。

version: '3'

services:

  backend:
    restart: always
    build: ./backend
    volumes:
      - ./backend:/backend
      - /backend/node_modules
    ports:
      - "3000:3000"
    dns:
      - 8.8.8.8

相关内容