TL; DR: ¿Por qué una aplicación central de aspnet se ejecuta en el puerto 80 desde una imagen de Docker, pero 5000 fuera de una imagen de Docker?
Elaborar
Revisé el tutorial de aspnet core/docker que se encuentra aquí: https://docs.microsoft.com/en-us/dotnet/core/docker/building-net-docker-images
A la mitad de la página, empiezo la aplicación con lo siguiente según lo prescrito:
dotnet runEntre otras cosas, esto imprime esto:
Now Listening on: http://localhost:5000Genial. Eso es lo que esperaba. Lo siguiente en el tutorial es iniciar exactamente la misma aplicación desde una imagen de Docker.
docker build -t aspnetapp . docker run -it --rm -p 5000:80 --name aspnetcore_sample aspnetappEsto resulta en
Now listening on: http://[::]:80Esperar. ¿Qué? ¿Por qué la aplicación principal de aspnet se ejecuta en el puerto 80? Se estaba ejecutando en el puerto 5000 cuando lo ejecuté directamente desde la máquina. No hubo cambios en el archivo de configuración.
Sospecho que tiene algo que ver con las imágenes base de la ventana acoplable, pero aún no soy lo suficientemente hábil en la ventana acoplable para rastrear esto.
El contenedor microsoft/aspnetcore-build se construye sobre el contenedor microsoft/aspnetcore . La página de dockerhub para eso dice:
Una nota sobre los puertos
Esta imagen establece la variable de entorno ASPNETCORE_URLS en http://+:80 , lo que significa que si no ha establecido explícitamente una URL en su aplicación, a través de app.UseUrl en su Program.cs, por ejemplo, su aplicación estará escuchando en el puerto. 80 dentro del contenedor.
Entonces, este es el contenedor que establece activamente el puerto en 80. Puede anularlo, si lo desea, haciendo esto en su Dockerfile :
ENV ASPNETCORE_URLS= http://+:5000
Además, vale la pena señalar que debido al comando docker que está utilizando, aún podrá acceder a la aplicación en http://localhost:5000 , ya sea que esté ejecutando la aplicación directamente o en un contenedor.
Si usa .NET Core 2.2 o superior, debe usar otra imagen: mcr.microsoft.com/dotnet/core/aspnet:2.2 . En ese caso, especificar ENV ASPNETCORE_URLS=http://+:5000 no ayuda. Todavía puede obligar a la aplicación a escuchar el puerto 5000 usando UseUrls("http://*:5000") en el archivo Programs.cs.
sin dockerfile, puede configurar cualquier puerto fuera del contenedor docker. ( .NET Core 3.1 , .NET 5 ) con argumentos acoplables
docker run -it --rm -p 5000:80 -p 5001:443 -e ASPNETCORE_HTTPS_PORT=https://+:5001 -e ASPNETCORE_URLS=http://+:5000 --name aspnetcore_sample aspnetappmás detalles :
La limitación de pila de redes de Windows juega duro en Windows Docker Container. Vídeo de referencia
docker run -it --rm -p {Puerto de la computadora host}:{Puerto del contenedor} --name {nombre del contenedor} {nombre de la imagen} docker run -it --rm -p 5000:8090 --name dockerwebapp9172020c dockerwebapp9172020
Lo que significa el comando anterior: el puerto de su máquina (5000) está asignado al puerto del contenedor (8090). No significa que la aplicación se ejecute en el contenedor escuchando en el PUERTO: 8090. Consulte el archivo acoplable a continuación sobre cómo asignar el puerto del contenedor al puerto de la aplicación.
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-nanoserver-1903 AS base WORKDIR /app EXPOSE 8090 FROM mcr.microsoft.com/dotnet/core/sdk:3.1-nanoserver-1903 AS build WORKDIR /src COPY ["DockerWebApp/DockerWebApp.csproj", "DockerWebApp/"] RUN dotnet restore "DockerWebApp/DockerWebApp.csproj" COPY . . WORKDIR "/src/DockerWebApp" RUN dotnet build "DockerWebApp.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "DockerWebApp.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENV ASPNETCORE_URLS http://*:8090 ENTRYPOINT ["dotnet", "DockerWebApp.dll"]Probar la limitación de pila de red de Windows no permitirá ejecutar el siguiente comando directamente.
http://localhost:5000Sigamos con la primera solución. Solución alternativa: 1 Golpee directamente el contenedor. (Debajo del comando en PowerShell o Símbolo del sistema)
ps c:/>docker inspect f31e8add55af
Encuentre la dirección IP de un contenedor desde el nodo "REDES" al final y ejecute el comando en el navegador.
http://{container IP}:8090Workaroud-2 desde el host de Windows
Primero encontremos la dirección IP de su máquina.
c:\>ipconfigUna vez que encuentre la IP de su máquina, ejecute el siguiente comando.
http://{Your Machine IP}:5000ya que 5000 está asignado al puerto del contenedor (8090) y la aplicación principal de asp.net también está escuchando el puerto 8090 dentro del contenedor.