我在 podman 中创建了两个网络,“backend”和“frontend”。
NAME VERSION PLUGINS
podman 0.4.0 bridge,portmap,firewall,tuning
backend 0.4.0 bridge,portmap,firewall,dnsname
frontend 0.4.0 bridge,portmap,firewall,dnsname
我有一个在“后端”网络中运行的 MS Sql Server 容器,使用以下命令:
podman run -d -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=TestS01Pass' --name mssqlserver -v sqlvolume:/var/opt/mssql --network backend mcr.microsoft.com/mssql/server:2019-latest
我还有三个 .netcore Web 应用程序(productapp1、productapp2、productapp3),它们被分配给“后端”和“前端”网络。请参阅以下 dockerfile 的内容:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
COPY dist /app
WORKDIR /app
EXPOSE 80/tcp
ENTRYPOINT [ "dotnet", "DockerSample.dll" ]
这些是我用来创建它们的命令:
podman create --name productapp1 --network backend,frontend docker-sample
podman create --name productapp2 --network backend,frontend docker-sample
podman create --name productapp3 --network backend,frontend docker-sample
我还有一个 haproxy 容器,使用以下命令将其分配给“前端”网络:
podman run -d --name loadbalancer --network frontend --volume $(pwd)/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg -p 3000:80 --privileged haproxy:latest
haproxy的配置如下:
defaults
timeout connect 5000
timeout client 50000
timeout server 50000
frontend localnodes
bind *:80
mode http
default_backend mvc
stats enable
stats uri /stats
stats refresh 1s
backend mvc
mode http
balance roundrobin
server mvc1 productapp1:80
server mvc2 productapp2:80
server mvc3 productapp3:80
通过查看 Web 应用的日志,我可以确认它们按预期运行,没有任何问题。请参阅以下某个 Web 应用容器的日志:
warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60]
Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed.
Applying Migrations...
Seed Data Not Required...
info: Microsoft.Hosting.Lifetime[0]
Now listening on: http://localhost:5000
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
Content root path: /app
问题是当我导航到 http://localhost:3000 时,我收到 503 服务不可用消息。 (没有可用的服务器来处理此请求。)
我在其中一个 webapps 上运行了以下命令,并验证了 mssqlserver 的端口可以访问:
podman exec -it productapp1 /bin/nc -zvw3 mssqlserver 1433
结果是:
DNS fwd/rev mismatch: mssqlserver != mssqlserver.dns.podman
mssqlserver [10.89.1.55] 1433 (?) open
但是如果我对某个Web应用运行相同的命令:
podman exec -it productapp1 /bin/nc -zvw3 productapp2 80
podman exec -it productapp1 /bin/nc -zvw3 productapp2 5000
两者都返回连接被拒绝消息:
DNS fwd/rev mismatch: productapp2 != productapp2.dns.podman
productapp2 [10.89.1.57] 80 (?) : Connection refused
DNS fwd/rev mismatch: productapp2 != productapp2.dns.podman
productapp2 [10.89.1.57] 5000 (?) : Connection refused
我想知道是否有人可以阐明这一点,因为我已经搜索和阅读了很多内容,但却无法弄清楚为什么这么简单的事情不起作用。
非常感谢。
谢谢。
更新 1:我忘了说我也尝试过使用以下配置的 haproxy:
defaults
timeout connect 5000
timeout client 50000
timeout server 50000
frontend localnodes
bind *:80
mode http
default_backend mvc
stats enable
stats uri /stats
stats refresh 1s
backend mvc
mode http
balance roundrobin
server mvc1 productapp1:5000
server mvc2 productapp2:5000
server mvc3 productapp3:5000
更新 2:以下是我的launchSettings.json的内容
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:30113",
"sslPort": 44371
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"DockerSample": {
"commandName": "Project",
"launchBrowser": true,
"applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
我也尝试使用 -e ASPNETCORE_URLS=http://+:5000 创建容器,但仍然出现相同的错误。
更新 3:将 launchSettings.json 更新为:
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:30113",
"sslPort": 44371
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"DockerSample": {
"commandName": "Project",
"launchBrowser": true,
"applicationUrl": "https://+:5001;http://+:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
更新 4:在 Michael Hampton 的帮助下,我成功为我的 Web 应用容器打开了端口 5000。我的 Web 应用容器的日志现在如下所示:
warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60]
Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed.
info: Microsoft.Hosting.Lifetime[0]
Now listening on: http://[::]:5000
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
Content root path: /app
我还可以从其他容器中通过 netcat 来访问这个端口:
DNS fwd/rev mismatch: productapp2 != productapp2.dns.podman
productapp2 [10.89.1.82] 5000 (?) open
现在我可以按预期导航到我的网络应用程序了。
答案1
您的日志显示该应用程序正在监听端口 5000,但您已将 haproxy 配置为尝试在端口 80 上连接它!这行不通。重新配置 haproxy 以连接到正确的端口。
server mvc1 productapp1:5000
server mvc2 productapp2:5000
server mvc3 productapp3:5000
您的日志还显示 Web 应用程序仅监听本地主机,因此它只接受来自其自身容器的连接,而不接受来自 pod 中其他容器的连接。如何修复此问题取决于应用程序的具体情况。我想您应该查看Properties/launchSettings.json
是否正在使用 ASP.NET Core 示例应用程序。