Я создал две сети в 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 (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
Просматривая журналы веб-приложений, я могу подтвердить, что они работают должным образом без каких-либо проблем. См. Ниже журналы для одного из контейнеров веб-приложений:
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 Service Unavailable. (Нет доступных серверов для обработки этого запроса.)
Я выполнил следующую команду в одном из веб-приложений и проверил, что порт для 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
Но если я запустил ту же команду для одного из веб-приложений:
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: После помощи Майкла Хэмптона мне удалось открыть порт 5000 для контейнеров моего веб-приложения. Журналы для контейнеров моих веб-приложений теперь выглядят следующим образом:
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
И теперь я могу переходить к своим веб-приложениям, как и ожидалось.
В ваших журналах говорится, что приложение прослушивает порт 5000, но вы настроили haproxy, чтобы попытаться подключиться к нему через порт 80! Это не сработает. Перенастройте haproxy для подключения к правильному порту.
server mvc1 productapp1:5000
server mvc2 productapp2:5000
server mvc3 productapp3:5000
В ваших журналах также говорится, что веб-приложение слушает только localhost, поэтому оно будет принимать соединения только из своего собственного контейнера, а не из других контейнеров в модуле. Как вы это исправите, зависит от специфики приложения. Я думаю, тебе стоит посмотреть на Properties/launchSettings.json
если вы используете образец приложения ASP.NET Core.