У меня есть 2 приложения, работающие в контейнерах, работающих в одной сети докеров.
Одно приложение предоставляет некоторые данные JSON через свой веб-API, а другое читает их. Приложение, выполняющее чтение, - это приложение node.js, которое использует сборщик (parcel.js). Оба приложения работают в одной сети, и я могу пинговать один контейнер из другого, используя их имена.
Хорошо, теперь, когда я определяю URL-адрес конечной точки api, откуда следует читать данные, я ожидал установить часть домена URL-адреса в качестве имени службы докеров, но вместо этого я получаю ответ только при установке домена как localhost: <docker_exposed_port >!
Это не только возможно, но и единственное, почему я могу читать API! Почему я читаю должен с localhost?
Я предполагаю, что это как-то связано с приложением, которое связывается с 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() - это имя, под которым будет храниться загруженный ресурс ("foo"), и URL-адрес в качестве второго параметра.
Параметр load() - это обратный вызов, когда все данные были прочитаны
this.loader
.add("foo", "http://localhost:9090/api/v1/query?query=rate(application_request_sent_total[1m])*60")
.load((loader, resources) => {console.info(resources.foo)}); // works, but why??
Хорошо, допустим, я использую 2 приложения asp.net, оба в докере и оба открывают порт для моей хост-машины. Если бы я хотел, чтобы они обменивались данными, я не могу просто настроить один на чтение другого через локальный хост моего хоста, поскольку контейнеры докеров не имеют доступа к локальному хосту хоста. Это ожидаемое поведение докеров. Здесь этот принцип нарушен, но я не понимаю, почему
Чтобы повторить то, что сказал @TarunLalwani: ваш код не работает в Docker. http-server внутри контейнера передает код браузеру, и ваш код работает в браузере вне Docker.
Как сказал @DavidMaze, он будет отличаться для кода пользовательского интерфейса, который выходит за рамки контекста докера, и для кода на стороне сервера вы будете использовать имена служб





Я думаю, вы путаете между localhost браузера и кодом localhost. Когда у вас есть JS-код, откройте его в браузере, он по-прежнему является вашим хост-компьютером, и на нем вы также выполняете сопоставление портов службы
prometheus. По этой причине используются решения обратного прокси, такие какnginx.