programing

왜 도커 내에서 포트 80에서 aspnet core가 시작됩니까?

megabox 2023. 5. 14. 10:31
반응형

왜 도커 내에서 포트 80에서 aspnet core가 시작됩니까?

TL;DR: 왜 aspnet 코어 앱은 도커 이미지 내에서 포트 80에서 실행되지만 도커 이미지 외부에서는 5000에서 실행됩니까?

정교한

저는 여기에 있는 aspnet core/docker 튜토리얼을 살펴보았습니다. https://learn.microsoft.com/en-us/dotnet/core/docker/building-net-docker-images

페이지 중간에 다음과 같이 신청을 시작합니다.

dotnet run

무엇보다도, 이것은 다음을 인쇄합니다.

Now Listening on: http://localhost:5000

좋습니다. 제가 예상했던 대로입니다.튜토리얼의 다음 단계는 도커 이미지 내에서 동일한 응용 프로그램을 시작하는 것입니다.

docker build -t aspnetapp .
docker run -it --rm -p 5000:80 --name aspnetcore_sample aspnetapp

이것은 결과적으로

Now listening on: http://[::]:80

잠깐만, 뭐라고요?포트 80에서 aspnet 코어 앱이 실행되는 이유는 무엇입니까?기계에서 직접 실행했을 때 포트 5000에서 실행되고 있었습니다.구성 파일이 변경되지 않았습니다.

저는 그것이 베이스 도커 이미지와 관련이 있다고 생각하지만, 아직 도커를 추적할 만큼 숙련되지 않았습니다.

microsoft/aspnetcore-build위에 구축된 컨테이너 microsoft/aspnetcore컨테이너.도커 허브 페이지에는 다음과 같이 표시됩니다.

포트에 대한 주의사항

이 이미지는 ASPNETCORE_URLS 환경 변수를 http://+:80으로 설정합니다. 즉, 앱을 통해 애플리케이션에 URL을 설정합니다.예를 들어 Program.cs 에서 Url을 사용하면 응용 프로그램이 컨테이너 내부의 포트 80에서 수신합니다.

이 컨테이너는 포트를 80으로 설정합니다.원하는 경우 이 작업을 사용하여 오버라이드할 수 있습니다.Dockerfile:

ENV ASPNETCORE_URLS=http://+:5000

또한, 당신이 사용하고 있는 도커 명령 때문에, 당신은 여전히 응용 프로그램에 접근할 수 있을 것입니다.http://localhost:5000응용프로그램을 직접 실행하든 컨테이너에서 실행하든 상관 없습니다.

도커 파일 없이 도커 컨테이너의 모든 포트를 설정할 수 있습니다.NET Core 3.1, .NET 5, .NET 6, .NET 7+)(도커 인수 포함)

docker run -it --rm -p 5000:80 -p 5001:443 -e ASPNETCORE_HTTPS_PORT=https://+:5001
           -e ASPNETCORE_URLS=http://+:5000 --name aspnetcore_sample aspnetapp

자세한 정보:

https://github.com/dotnet/dotnet-docker/blob/17c1eec582e84ba9cbea5641cd9cc13fe1a41c39/samples/run-aspnetcore-https-development.md?plain=1#L85

https://github.com/dotnet/dotnet-docker/blob/5926a01d44bd47b6202ba71e30f9faa08fad1aec/samples/run-in-sdk-container.md?plain=1#L109

사용하는 경우.NET Core 2.2 이상인 경우 다른 이미지인 mcr.microsoft.com/dotnet/core/aspnet:2.2 을 사용해야 합니다.이 경우 다음과 같이 지정합니다.ENV ASPNETCORE_URLS=http://+:5000도움이 되지 않습니다. 히여을사앱이포트용 5000전도강제를 사용하여 할 수 .UseUrls("http://*:5000")Programs.cs 파일에 있습니다.

다른 답변의 일부 링크는 이전 버전에 대한 링크이거나 더 이상 존재하지 않습니다.다음은 v6에 적용됩니다.

든모.mcr.microsoft.com/dotnet/aspnet이미지가 여기 있습니다.알파인 버전을 사용하고 있다고 가정합니다.

aspnet이미지는 다음을 기반으로 합니다.runtime이미지, 여기에 표시된 것처럼

runtime이미지는 다음을 기반으로 합니다.runtime-deps이미지, 여기에 표시된 것처럼

runtime-deps이미지는 다음을 기반으로 합니다.amd64/alpine이미지(이전 버전이지만 구조는 동일함)를 표시합니다.그리고 그것은 정해집니다.ENV ASPNETCORE_URLS=http://+:80여기에 표시된 것처럼 컨테이너가 포트 80에서 수신 중임을 의미합니다.

Windows 네트워킹 스택 제한은 Windows Docker 컨테이너에서 제대로 작동하지 않습니다.참조 비디오

docker run -it --rm -p ${host_computer_port}:${container_port} --name ${container_name} ${image_name}

명령의 예:

docker run -it --rm -p 5000:8090 --name dockerwebapp9172020c dockerwebapp9172020

위의 명령은 무엇을 의미합니까?

컴퓨터 포트(5000)가 컨테이너 포트(8090)에 매핑됩니다.이것은 8090 포트에서 수신 대기 중인 컨테이너에서 실행 중인 응용 프로그램을 의미하지 않습니다.컨테이너 포트를 응용 프로그램 포트에 매핑하는 방법은 아래 도커 파일을 참조하십시오.

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"]

테스트

Windows 네트워킹 스택 제한에서는 다음 명령을 직접 실행할 수 없습니다.

http://localhost:5000

먼저 해결 방법을 알아보겠습니다.해결 방법-1 컨테이너를 직접 누릅니다. (PowerShell 또는 명령 프롬프트의 아래 명령)

ps c:/>docker inspect f31e8add55af

맨 끝에 있는 "NETWORKS" 노드에서 컨테이너의 IP 주소를 찾고 브라우저에서 명령을 실행합니다.

http://{container IP}:8090

Windows 호스트에서 작업-2

먼저 컴퓨터 IP 주소를 찾습니다.

c:\>ipconfig

컴퓨터 IP를 찾으면 다음 명령을 실행합니다.

http://{Your Machine IP}:5000

5000은 컨테이너 포트(8090)에 매핑되고 asp.net 코어 애플리케이션도 컨테이너 내에서 8090 포트를 수신하고 있기 때문입니다.

참조:Windows 컨테이너 및 도커: 101

언급URL : https://stackoverflow.com/questions/48669548/why-does-aspnet-core-start-on-port-80-from-within-docker

반응형