为什么我的dockerized Node.js应用程序会看到localhost?
我有两个应用程序在同一个docker网络上运行的容器中运行 一个应用程序通过其web api提供一些JSON数据,而另一个应用程序则读取这些数据。正在进行读取的应用程序是一个node.js应用程序,它使用绑定器(parcel.js)。两个应用程序都在同一个网络中运行,我可以使用它们的名称从另一个容器ping一个容器 好的,现在当我定义api端点url时,我希望将url域部分设置为docker服务名称,但是我只在将域设置为localhost:时得到响应 这不仅是可能的,而且也是我能够阅读API的唯一原因!为什么必须从本地主机读取 我猜这与parcel.js捆绑的应用程序以及在我的浏览器中运行的应用程序有关 docker-compose.yml:为什么我的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的唯
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代码和服务器端代码,您将使用服务名称