Я создаю веб-приложение с помощью Angular.js 2, Elasticsearch и Docker.Ошибка при получении http-запроса через связанные контейнеры докеров
Я пытаюсь получить доступ к Elasticsearch через свой REST API из моего приложения с угловым кодом, используя связанный URL-адрес «http://search:9200/_cat/health», но я получаю ошибку GET http://search:9200/_cat/health net::ERR_NAME_NOT_RESOLVED
.
Странно, что когда я делаю curl -XGET "http://search:9200/_cat/health"
из контейнера веб-приложения, все в порядке, и я получаю правильный ответ.
Вот мой соответствующий docker-compose.yml
файл
version: '2'
services:
search:
image: elasticsearch:latest
command: elasticsearch -Des.network.host=0.0.0.0
ports:
- "9200:9200"
- "9300:9300"
web:
build: .
command: npm start
volumes:
- .:/visfx
ports:
- "3000:3000"
links:
- search
также вот вызов службы elasticsearch
@Injectable()
export class ElasticsearchService {
private _esUrl = 'http://search:9200';
constructor(private http: Http) { }
getHealthString() {
let healthUrl = '/_cat/health';
return this.http.get(this._esUrl + healthUrl)
.map(res => <string>res.text())
.do(data => console.log(data))
.catch(this.handleError);
}
...
}
Если этот javascript работает на стороне клиента, вам нужно будет использовать реальное DNS-имя, которое направляется на хост докера, поскольку имена докеров разрешаются только с помощью внутреннего распознавателя докера. – tpbowden
Кроме того, docker compose автоматически создаст вашу частную сеть, поэтому вам не нужно явно указывать ссылки в конфиге. – tpbowden
различные мысли ... я предполагаю, что docker сделал запись/etc/hosts для контейнера поиска внутри вашего веб-контейнера ... вы можете выполнить ping в контейнере поиска? - это IP-адреса, которые имеют доступ к этим ресурсам? есть ли какие-либо брандмауэры? – danday74