ElasticSearch、ElasticSearch.Net 和 dockercompose 出现错误无法分配请求的地址站点
ElasticSearch, ElasticSearch.Net and dockercompose with error cannot assign requested address site
我正在尝试使用 .Net 核心 Web 应用程序、.Net 核心 API 和 ElasticSearch 创建示例应用程序。每个都在自己的 docker 容器中。我无法让 API 与 ElasticSearch docker 容器通信。
这是我的 docker-compose 文件:
version: '3.4'
services:
webfrontend:
image: ${DOCKER_REGISTRY-}webfrontend
build:
context: .
dockerfile: WebFrontEnd/Dockerfile
depends_on:
- mywebapi
networks:
- esnetwork
mywebapi:
image: ${DOCKER_REGISTRY-}mywebapi
build:
context: .
dockerfile: MyWebAPI/Dockerfile
depends_on:
- es01
networks:
- esnetwork
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.7.1
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data01:/usr/share/elasticsearch/data
ports:
- 9200:9200
- 9300:9300
networks:
- esnetwork
volumes:
data01:
driver: local
networks:
esnetwork:
driver: bridge
我使用的API代码是:
[HttpGet]
public string Get()
{
//var settings = new ConnectionConfiguration(
// new Uri("http://localhost:9200"));
var settings = new ConnectionConfiguration();
var lowlevelClient = new ElasticLowLevelClient(settings);
var indices = lowlevelClient.Cat.Health<BytesResponse>();
//string responseStream = indices.Body;
return $"Number of cats = ";
}
我得到的错误是 "cannot assign requested address site"。
我可以在 cmd 中使用以下命令访问 ElasticSearch:
curl -X GET http://localhost:9200/_cat/health
我做错了什么?
docker compose 中的所有服务默认连接到一个公共网络(在您的情况下,它们甚至连接到一个公共网络 esnetwork
)。服务名称是一个 DNS 名称,可用于从一个容器连接到另一个容器。在您的情况下,您必须将 webapi 配置为连接到 http://es01:9200
而不是本地主机。您可以使用环境变量或任何对您方便的方式来设置它。例如:
var uri = new Uri("http://es01:9200");
var settings = new ConnectionConfiguration(uri);
或
string elasticHost = Environment.GetEnvironmentVariable("ELASTIC_HOST");
var uri = new Uri(elasticHost);
var settings = new ConnectionConfiguration(uri);
并在 docker-compose 中为您的 webapi 服务设置环境变量 ELASTIC_HOST
:
environment:
- ELASTIC_HOST=es01
我正在尝试使用 .Net 核心 Web 应用程序、.Net 核心 API 和 ElasticSearch 创建示例应用程序。每个都在自己的 docker 容器中。我无法让 API 与 ElasticSearch docker 容器通信。
这是我的 docker-compose 文件:
version: '3.4'
services:
webfrontend:
image: ${DOCKER_REGISTRY-}webfrontend
build:
context: .
dockerfile: WebFrontEnd/Dockerfile
depends_on:
- mywebapi
networks:
- esnetwork
mywebapi:
image: ${DOCKER_REGISTRY-}mywebapi
build:
context: .
dockerfile: MyWebAPI/Dockerfile
depends_on:
- es01
networks:
- esnetwork
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.7.1
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data01:/usr/share/elasticsearch/data
ports:
- 9200:9200
- 9300:9300
networks:
- esnetwork
volumes:
data01:
driver: local
networks:
esnetwork:
driver: bridge
我使用的API代码是:
[HttpGet]
public string Get()
{
//var settings = new ConnectionConfiguration(
// new Uri("http://localhost:9200"));
var settings = new ConnectionConfiguration();
var lowlevelClient = new ElasticLowLevelClient(settings);
var indices = lowlevelClient.Cat.Health<BytesResponse>();
//string responseStream = indices.Body;
return $"Number of cats = ";
}
我得到的错误是 "cannot assign requested address site"。
我可以在 cmd 中使用以下命令访问 ElasticSearch:
curl -X GET http://localhost:9200/_cat/health
我做错了什么?
docker compose 中的所有服务默认连接到一个公共网络(在您的情况下,它们甚至连接到一个公共网络 esnetwork
)。服务名称是一个 DNS 名称,可用于从一个容器连接到另一个容器。在您的情况下,您必须将 webapi 配置为连接到 http://es01:9200
而不是本地主机。您可以使用环境变量或任何对您方便的方式来设置它。例如:
var uri = new Uri("http://es01:9200");
var settings = new ConnectionConfiguration(uri);
或
string elasticHost = Environment.GetEnvironmentVariable("ELASTIC_HOST");
var uri = new Uri(elasticHost);
var settings = new ConnectionConfiguration(uri);
并在 docker-compose 中为您的 webapi 服务设置环境变量 ELASTIC_HOST
:
environment:
- ELASTIC_HOST=es01