docker - ElasticSearch、ElasticSearch.Net 和 docker 组合错误无法分配请求的地址站点

标签 docker elasticsearch docker-compose elasticsearch.net

我正在尝试使用 .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 = ";
}

我得到的错误是“无法分配请求的地址站点”。

我可以在 cmd 中使用以下命令点击 ElasticSearch:
curl -X GET http://localhost:9200/_cat/health

我究竟做错了什么?

最佳答案

默认情况下,docker compose 中的所有服务都连接到公共(public)网络(在您的情况下,它们甚至连接到公共(public)网络 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);

并设置环境变量ELASTIC_HOST在 docker-compose 中为您的 webapi 服务:
environment:
      - ELASTIC_HOST=es01

关于docker - ElasticSearch、ElasticSearch.Net 和 docker 组合错误无法分配请求的地址站点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62300323/

相关文章:

当容器中存在文件时,docker-compose 不产生 "No Such File or Directory"

csv - 尽管Logstash发生了聚集,但ElasticSearch中的条目重复

docker - 将Artifactory配置为位于http://some.domain:port而不是http://some.domain:port/artifactory/

macos - Mac 上的 Boot2Docker - 访问本地文件

node.js - Docker 运行失败 "return process.dlopen(module, path.toNamespacedPath(filename));"

elasticsearch - 单节点或多节点 Elasticsearch 内部如何计算聚合?

angular - docker容器中的前端和后端

docker - 在 docker-compose.yml 中添加插件到 Kibana 镜像

docker - 环境变量和 docker-compose

indexing - titan elasticsearch 不使用索引