Fra*_*sco 42 c# elasticsearch docker .net-core docker-compose
我正在尝试使用 docker-compose 文件运行许多服务。首先,我们假设 Docker 版本 20.10.3 在 Red Hat Enterprise Linux 版本 8.3 上运行。
这是 docker-compose 文件:
version: "3.8"
services:
projmssql:
image: "mcr.microsoft.com/mssql/server:2019-latest"
container_name: proj-core-sqlserver
environment:
SA_PASSWORD: "mypassword"
ACCEPT_EULA: "Y"
ports:
- "1401:1433"
volumes:
- type: bind
source: ./data-mssql
target: /var/opt/mssql/data
- type : bind
source: ./log-mssql
target: /var/opt/mssql/log
restart: always
projelastic:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
container_name: proj-core-elastic
environment:
- node.name=es01
- cluster.name=proj-docker-cluster
- discovery.type=single-node
- bootstrap.memory_lock=false
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
- path.repo=/usr/share/elasticsearch/backup
- path.logs=/usr/share/elasticsearch/logs
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- type: bind
source: ./data-es01
target: /usr/share/elasticsearch/data
- type : bind
source: ./_backup-es01
target: /usr/share/elasticsearch/backup
- type : bind
source: ./logs-es01
target: /usr/share/elasticsearch/logs
ports:
- 9220:9200
- 9320:9300
projcerebro:
image: lmenezes/cerebro
container_name: proj-core-cerebro
ports:
- "9020:9000"
command:
- -Dhosts.0.host=http://projelastic:9200
projapi:
image: proj/projcoreapp
depends_on:
- projmssql
container_name: proj-core-api
ports:
- "8080:80"
restart: always
#Specify Environment Variables for the Api Service
environment:
- ASPNETCORE_ENVIRONMENT=Docker
Run Code Online (Sandbox Code Playgroud)
projApi 服务来自我使用以下 Dockerfile 构建的本地映像 (proj/projcoreapp):
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build-env
WORKDIR /app
COPY . ./
RUN dotnet publish proj.api.net -c Release -o out
FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "Proj.Api.dll"]
Run Code Online (Sandbox Code Playgroud)
在我的 .net core 应用程序中,我有一个专用的 appsettings.Docker.json 文件
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"Elasticsearch": {
"Server": "http://projelastic:9200",
"DebugMode": true,
"UpdateMapping": false
},
"ConnectionStrings": {
"DatabaseConnection": "Server=projmssql;Database=PROJ-NET;Persist Security Info=False;User ID=sa;Password=mypassword;MultipleActiveResultSets=True;TrustServerCertificate=False;Connection Timeout=30;"
}
}
Run Code Online (Sandbox Code Playgroud)
.csproj
API .net core 项目的
version: "3.8"
services:
projmssql:
image: "mcr.microsoft.com/mssql/server:2019-latest"
container_name: proj-core-sqlserver
environment:
SA_PASSWORD: "mypassword"
ACCEPT_EULA: "Y"
ports:
- "1401:1433"
volumes:
- type: bind
source: ./data-mssql
target: /var/opt/mssql/data
- type : bind
source: ./log-mssql
target: /var/opt/mssql/log
restart: always
projelastic:
image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
container_name: proj-core-elastic
environment:
- node.name=es01
- cluster.name=proj-docker-cluster
- discovery.type=single-node
- bootstrap.memory_lock=false
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
- path.repo=/usr/share/elasticsearch/backup
- path.logs=/usr/share/elasticsearch/logs
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- type: bind
source: ./data-es01
target: /usr/share/elasticsearch/data
- type : bind
source: ./_backup-es01
target: /usr/share/elasticsearch/backup
- type : bind
source: ./logs-es01
target: /usr/share/elasticsearch/logs
ports:
- 9220:9200
- 9320:9300
projcerebro:
image: lmenezes/cerebro
container_name: proj-core-cerebro
ports:
- "9020:9000"
command:
- -Dhosts.0.host=http://projelastic:9200
projapi:
image: proj/projcoreapp
depends_on:
- projmssql
container_name: proj-core-api
ports:
- "8080:80"
restart: always
#Specify Environment Variables for the Api Service
environment:
- ASPNETCORE_ENVIRONMENT=Docker
Run Code Online (Sandbox Code Playgroud)
.csproj
域库的
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build-env
WORKDIR /app
COPY . ./
RUN dotnet publish proj.api.net -c Release -o out
FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "Proj.Api.dll"]
Run Code Online (Sandbox Code Playgroud)
.csproj
过滤器库的
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"Elasticsearch": {
"Server": "http://projelastic:9200",
"DebugMode": true,
"UpdateMapping": false
},
"ConnectionStrings": {
"DatabaseConnection": "Server=projmssql;Database=PROJ-NET;Persist Security Info=False;User ID=sa;Password=mypassword;MultipleActiveResultSets=True;TrustServerCertificate=False;Connection Timeout=30;"
}
}
Run Code Online (Sandbox Code Playgroud)
在我的 .net core 启动中,我有以下配置
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ProjdbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DatabaseConnection"))
);
services.AddScoped<IProjUserService, ProjUserService>();
services.AddSingleton<IProjEntitiesService>(s =>
new ProjEntitiesService
(
Configuration.GetValue<string>("Elasticsearch:Server"),
Configuration.GetValue<bool>("Elasticsearch:DebugMode"),
Configuration.GetValue<bool>("Elasticsearch:UpdateMapping")
));
services.AddControllers();
services.AddSwaggerGen(c =>
{
Run Code Online (Sandbox Code Playgroud)
现在让我们来谈谈这个问题:一旦我运行 docker-compose 文件,所有服务都会正确运行,并且我可以从主机与所有服务进行交互。API 服务能够在内部连接到数据库,但是当我运行一些 API 来与 elasticsearch 服务交互时,我收到以下错误:
Elasticsearch.Net.UnexpectedElasticsearchClientException: The information requested is unavailable on the current platform.
---> System.PlatformNotSupportedException: The information requested is unavailable on the current platform.
at System.Net.NetworkInformation.StringParsingHelpers.ParseActiveTcpConnectionsFromFiles(String tcp4ConnectionsFile, String tcp6ConnectionsFile)
at System.Net.NetworkInformation.LinuxIPGlobalProperties.GetActiveTcpConnections()
at Elasticsearch.Net.Diagnostics.TcpStats.GetStates()
at Elasticsearch.Net.HttpConnection.Request[TResponse](RequestData requestData)
at Elasticsearch.Net.RequestPipeline.CallElasticsearch[TResponse](RequestData requestData)
at Elasticsearch.Net.Transport`1.Request[TResponse](HttpMethod method, String path, PostData data, IRequestParameters requestParameters)
--- End of inner exception stack trace ---
Run Code Online (Sandbox Code Playgroud)
正如我所说,所有服务都工作正常,甚至 Cerebro 服务也能够在内部连接到 elasticsearch 服务,因此它看起来像是仅与 .net core 服务有关的问题。
我找不到有关上述问题的任何主题,因此我希望这里有人可以帮助我解决这个问题。
PS:.NET Core API 本地部署在 Windows 计算机(Kestrel Web 服务器)上,可以正确连接到数据库和 Elasticsearch,并且两者都在 Docker 上运行。
更新:
我忘了提及该机器是在公司代理后面运行的。记住这一点,我想检查我的 API 服务是否能够到达 Elasticsearch 服务端点:http://projelastic:9200
。为此,我在 API 服务容器上执行了交互式 bash shell:
docker exec -it proj-core-api /bin/bash
。在这里我注意到我的容器无法访问互联网
root@8e7c81f98455:/app# apt-get update
Err:1 http://security.debian.org/debian-security buster/updates InRelease
Could not connect to security.debian.org:80 (111: Connection refused)
Run Code Online (Sandbox Code Playgroud)
因此,我在 docker-compose 文件中添加了代理服务器的变量,包括 Elasticsearch 服务域的 no_proxy 变量。
projapi:
image: proj/projcoreapp
depends_on:
- projmssql
container_name: proj-core-api
ports:
- "8080:80"
restart: always
#Specify Environment Variables for the Api Service
environment:
- ASPNETCORE_ENVIRONMENT=Docker
- http_proxy=http://user:pwd@address
- https_proxy=http://user:pwd@address
- no_proxy=projelastic
Run Code Online (Sandbox Code Playgroud)
通过上述更改,我能够在 API 容器中安装 curl 并执行初始测试:
root@0573a44a6836:/app# curl -X GET http://projelastic:9200
{
"name" : "es01",
"cluster_name" : "proj-docker-cluster",
"cluster_uuid" : "j7mdpxkrSRKxpHnktvnZIw",
"version" : {
"number" : "7.10.1",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "1c34507e66d7db1211f66f3513706fdf548736aa",
"build_date" : "2020-12-05T01:00:33.671820Z",
"build_snapshot" : false,
"lucene_version" : "8.7.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
Run Code Online (Sandbox Code Playgroud)
无论如何,添加代理变量并没有修复初始错误,因此作为最终测试,我将源代码放在Windows 10 machine
运行 aDocker version 20.10.7
并且没有 proxy 的地方。我构建了 API 映像并运行 docker-compose。所有服务都工作正常,所以我仍然认为在 Linux 机器上代理在我当前的问题上发挥着重要作用。
更新 2: 由于@AndrewSilver 的建议,我能够解决这个问题。也非常感谢@kha 提供更多详细信息。
只是为了确保上述问题是一个有用的问题,我在这里编写了帮助我和其他人解决问题的解决方案,那就是禁用TcpStats。
@kha 还补充道:确切的命令是connectionSettings.EnableTcpStats(false);
。请记住,如果您使用 DebugMode,则会启用 TcpStats,因此请确保在建立连接之前将其作为最后一个参数添加到连接设置中。
归档时间: |
|
查看次数: |
1761 次 |
最近记录: |