.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": "*"
}
我正在尝试将 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": "*"
}