为什么我的dockerized Node.js应用程序会看到localhost?

为什么我的dockerized Node.js应用程序会看到localhost?,node.js,docker,docker-compose,pixi.js,parceljs,Node.js,Docker,Docker Compose,Pixi.js,Parceljs,我有两个应用程序在同一个docker网络上运行的容器中运行 一个应用程序通过其web api提供一些JSON数据,而另一个应用程序则读取这些数据。正在进行读取的应用程序是一个node.js应用程序,它使用绑定器(parcel.js)。两个应用程序都在同一个网络中运行,我可以使用它们的名称从另一个容器ping一个容器 好的,现在当我定义api端点url时,我希望将url域部分设置为docker服务名称,但是我只在将域设置为localhost:时得到响应 这不仅是可能的,而且也是我能够阅读API的唯

我有两个应用程序在同一个docker网络上运行的容器中运行

一个应用程序通过其web api提供一些JSON数据,而另一个应用程序则读取这些数据。正在进行读取的应用程序是一个node.js应用程序,它使用绑定器(parcel.js)。两个应用程序都在同一个网络中运行,我可以使用它们的名称从另一个容器ping一个容器

好的,现在当我定义api端点url时,我希望将url域部分设置为docker服务名称,但是我只在将域设置为localhost:时得到响应

这不仅是可能的,而且也是我能够阅读API的唯一原因!为什么必须从本地主机读取

我猜这与parcel.js捆绑的应用程序以及在我的浏览器中运行的应用程序有关

docker-compose.yml:

version: "3.1"

services:
  prometheus:
    image: prom/prometheus:latest
    ports:
    - 9090:9090
    volumes:
    - ./SimpleMicroService/prometheus.yml:/etc/prometheus/prometheus.yml
    networks:
      - my_app_network
      
  pixi:
    build: ./Visualizer
    image: pixi:latest
    ports:
      - 7001:1234
      - 1235:1235
    environment:
      - "CHOKIDAR_USEPOLLING=1"
    networks:
      - my_app_network
    volumes:
    - ./Visualizer/src:/usr/src/app/src

networks:
  my_app_network:
    driver: bridge
package.json:

{
  "name": "pixitest",
  "version": "1.0.0",
  "description": "",
  "scripts": {
    "test": "jest",
    "start": "npm run clean && parcel src/index.html --hmr-port 1235",
    "build": "npm run clean && parcel build src/index.html --public-url ./",
    "build_serve": "npm run build && http-server ./dist",
    "clean": "rimraf ./dist ./.cache"
  },
  "author": "Llorenç Pujol Ferriol",
  "license": "MIT",
  "dependencies": {
    "pixi.js": "~5.3.3"
  },
  "devDependencies": {
    "@types/jest": "~26.0.15",
    "@types/pixi.js": "^5.0.0",
    "babel-preset-es2015": "~6.24.1",
    "http-server": "~0.12.3",
    "jest": "~26.6.3",
    "parcel-bundler": "~1.12.4",
    "rimraf": "~2.6.2",
    "ts-jest": "~26.4.4",
    "typescript": "~4.0.5"
  }
}
如何读取API数据:

add()
first param是用来存储加载的资源(“foo”)和url作为第二个参数的名称。
load()
param是读取所有数据时的回调函数

this.loader
            .add("foo", "http://localhost:9090/api/v1/query?query=rate(application_request_sent_total[1m])*60")
            .load((loader, resources) => {console.log(resources.foo)}); // works, but why??

我认为您混淆了浏览器的localhost v/s和代码localhost。当你让JS代码打开它的浏览器时,它的本地主机仍然是你的主机,你也在这里映射
prometheus
服务。这就是为什么要使用反向代理解决方案,比如
nginx
Ok,假设我使用的是两个asp.net应用程序,都在docker中,都向我的主机公开一个端口。如果我想让它们进行通信,我不能将其中一个设置为通过主机的localhost读取另一个,因为docker容器无权访问主机的localhost。这是预期的docker行为。这里,这个原则被打破了,但我不明白为什么要重申@TarunLalwani所说的:您的代码没有在Docker中运行。容器内的
http服务器
将代码提供给浏览器,您的代码在浏览器中运行,在Docker之外。正如@DavidMaze所说,对于运行在Docker上下文之外的UI代码和服务器端代码,您将使用服务名称