.NET Core 5.0 无法通过 Docker 连接 ElasticSearch

.NET Core 5.0 Cant Connect ElasticSearch Via Docker

我正在尝试将 ElasticSearch 与我的 .NET Core 项目连接起来。如果我手动 运行 我的项目,我可以发送请求并创建数据。但是如果我尝试使用 docker 构建它会抛出 500 错误。我无法创建数据。它也不会创建 elasticSearch 索引。当我手动创建索引并发送请求时,它也不会创建数据。

Docker 文件

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /app
EXPOSE 80

COPY ./*.csproj /app

RUN dotnet restore ./*.csproj
COPY . .
RUN dotnet publish ./*.csproj -c Release -o out 

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS runtime
WORKDIR /app
COPY --from=build /app/out .
ENV ASPNETCORE_URLS http://*:7000
ENV ASPNETCORE_ENVIRONMENT docker
EXPOSE 7000
ENTRYPOINT ["dotnet","ElasticDocker.dll"]

DockerCompose 文件

version: "3.8"
services:
  elasticdocker:
   container_name: orhanelasticdeneme
   restart: always
   build:
    context: .
    dockerfile: ./Dockerfile
   ports: 
    - "7000:7000"
   depends_on:
    - elasticsearch
   networks:
    - es-network

  elasticsearch:
   image: docker.elastic.co/elasticsearch/elasticsearch:8.0.0
   container_name: elasticsearch
   restart: always
   environment:
    - cluster.name=docker-cluster
    - xpack.security.enabled=false
    - discovery.type=single-node
   ulimits:
      memlock:
        soft: -1
        hard: -1
   ports:
    - "9200:9200"
   networks:
    - es-network

  kibana:
    container_name: kibana
    image: docker.elastic.co/kibana/kibana:8.0.0
    restart: always
    environment:
     SERVER_NAME: kibana.example.org
     ELASTICSEARCH_URL: http://elasticsearch:9200
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
    networks:
    - es-network

networks:
  es-network:
   driver: bridge
  
  

顺便说一句,我也可以连接 Kibana。

Startup.cs

services.AddSingleton<IElasticClient>(
           p =>
           {
               var elastic = new ElasticClient(new ConnectionSettings(new Uri(Configuration["elasticsearchserver:Host"]))
               .BasicAuthentication(Configuration["elasticsearchserver:Username"], Configuration["elasticsearchserver:Password"]));
               var userIndex = elastic.Indices.Exists(Configuration["elasticsearchserver:Orhan"].ToString());
               if (!userIndex.Exists)
               {
                   elastic.Indices.Create(Configuration["elasticsearchserver:Orhan"].ToString(), ci => ci.Index(Configuration["elasticsearchserver:Orhan"].ToString()).UserMapping().Settings(s => s.NumberOfShards(3).NumberOfReplicas(1)));
               }               
               return elastic;
           });

AppConfig.json

{
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
        }
    },
    "elasticsearchserver": {
        "Host": "http://localhost:9200",
        "Username": "guest",
        "Password": "guest",
        "Orhan": "orhan"
    },
    "AllowedHosts": "*"
}

Controller.cs

  private readonly IElasticClient _elasticClient;

        public UserController(IElasticClient elasticClient)
        {
            _elasticClient = elasticClient;
        }
        [HttpPost]
        public async Task<IActionResult> Create(User user)
       {
            var response = await _elasticClient.CreateAsync(user, x => x.Index("orhan").Id(user.Id));
            return Ok(response);           
        }
        [HttpGet]
        public async Task<IActionResult> GetAll()
        {
            var response = await _elasticClient.SearchAsync<User>(x =>
           x.Index("orhan")
           .From(0)
           .Size(2000)
           );
            return Ok(response.Documents.ToList());
        }
        [HttpGet("/a")]
        public async Task<IActionResult> Get()
        {
            return Ok("sadgasfdgasd");
        }

这是cmd中的错误。

如果您想将 elasticsearch 与 docker 连接,请将您的主机更改为容器名称。

{
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
        }
    },
    "elasticsearchserver": {
        "Host": "http://elasticsearch:9200",
        "Username": "guest",
        "Password": "guest",
        "Orhan": "orhan"
    },
    "AllowedHosts": "*"
}