빠른 시작: Visual Studio의 Docker

Visual Studio를 사용하여 컨테이너화된 NET, ASP.NET 및 ASP.NET Core 앱을 쉽게 빌드, 디버그, 실행하고 Azure Container Registry, Docker Hub, Azure App Service 또는 사용자 고유 컨테이너 레지스트리에 게시할 수 있습니다. 이 문서에서는 Azure Container Registry에 ASP.NET Core 앱을 게시합니다.

필수 조건

설치 및 설정

Docker 데스크탑을 설치하려면 우선 Windows용 Docker: 설치하기 전에 알아야 할 사항의 정보를 검토하세요. 다음으로 Docker Desktop을 설치합니다.

Docker 컨테이너에 프로젝트 추가

  1. ASP.NET Core 웹앱 템플릿을 사용하여 새 프로젝트를 만들거나 .NET Core 대신 .NET Framework를 사용하려는 경우 ASP.NET 웹 애플리케이션(.NET Framework)을 선택합니다.

  2. 새 웹 애플리케이션 만들기 화면에서 Docker 지원 사용 확인란이 선택되어 있는지 확인합니다.

    Docker 지원 사용 확인란의 스크린샷.

    스크린샷은 .NET Core를 보여줍니다. .NET Framework를 사용하는 경우 약간 다르게 보입니다.

  3. 원하는 컨테이너 유형(Windows 또는 Linux)을 선택하고, 만들기를 클릭합니다.

Dockerfile 개요

최종 Docker 이미지를 만들기 위한 레시피인 Dockerfile은 프로젝트에 생성됩니다. 그 안의 명령을 이해하려면 Dockerfile 참조를 참조하세요.

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /src
COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"]
RUN dotnet restore "WebApplication1/WebApplication1.csproj"
COPY . .
WORKDIR "/src/WebApplication1"
RUN dotnet build "WebApplication1.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "WebApplication1.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WebApplication1.dll"]

위의 Dockerfilemicrosoft/aspnetcore 이미지를 기반으로 하며, 프로젝트를 빌드하고 컨테이너에 추가하여 기본 이미지를 수정하는 방법을 포함하고 있습니다. .NET Framework를 사용하는 경우 기본 이미지가 달라집니다.

새 프로젝트 대화 상자의 HTTPS에 대한 구성 확인란이 선택되면 Dockerfile은 두 개의 포트를 노출합니다. 한 포트는 HTTP 트래픽에 사용되고 다른 포트는 HTTPS에 사용됩니다. 이 확인란을 선택하지 않으면 단일 포트(80)가 HTTP 트래픽에 노출됩니다.

디버그

툴바의 디버그 드롭다운 목록에서 Docker를 선택하고 앱에서 디버깅을 시작합니다. 인증서 신뢰 요청 메시지가 표시될 수 있습니다. 계속하려면 인증서를 신뢰하도록 선택하세요.

출력 창의 컨테이너 도구 옵션에 실행 중인 작업이 표시됩니다. 처음에는 기본 이미지를 다운로드하는 데 시간이 걸릴 수 있지만 이후 실행은 훨씬 더 빠릅니다.

참고

디버깅을 위해 포트를 변경해야 하는 경우 launchSettings. json 파일에서 변경하면 됩니다. 컨테이너 시작 설정을 참조하세요.

컨테이너 창

Visual Studio 2019 버전 16.4 이상을 사용하는 경우 컨테이너 창을 사용하여 머신에서 실행 중인 컨테이너와 사용할 수 있는 이미지를 확인할 수 있습니다.

IDE에서 검색 상자를 사용하여(사용하려면 Ctrl+Q를 누름) 컨테이너 창을 열고 container를 입력한 후 목록에서 컨테이너 창을 선택합니다.

컨테이너 창을 움직여서 창 배치 안내선에 따라 편집기 아래 등 편리한 위치에 탑재할 수 있습니다.

창에서 컨테이너를 찾고 각 탭을 단계별로 진행하여 환경 변수, 포트 매핑, 로그 및 파일 시스템을 확인합니다.

컨테이너 창의 스크린샷

자세한 내용은 컨테이너 창 사용을 참조하세요.

Docker 이미지 게시

앱의 개발 및 디버그 주기가 완료되면 앱의 프로덕션 이미지를 만들 수 있습니다.

  1. 구성 드롭다운 목록을 릴리스로 변경하고 앱을 빌드합니다.

  2. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 게시를 선택합니다.

  3. 게시 대화 상자에서 Docker 컨테이너 레지스트리 탭을 선택합니다.

    게시 대화 상자 - Docker 컨테이너 레지스트리 선택 스크린샷

  4. 새 Azure Container Registry 만들기를 선택합니다.

    게시 대화 상자 - 새 Azure Container Registry 만들기 선택 스크린샷.

  5. 새 Azure Container Registry 만들기에 원하는 값을 채웁니다.

    설정 제안 값 설명
    DNS 접두사 전역적으로 고유한 이름 컨테이너 레지스트리를 고유하게 식별하는 이름입니다.
    구독 구독 선택 사용할 Azure 구독입니다.
    리소스 그룹 myResourceGroup 컨테이너 레지스트리를 만들 리소스 그룹의 이름입니다. 새로 만들기를 선택하여 새 리소스 그룹을 만듭니다.
    SKU 표준 컨테이너 레지스트리의 서비스 계층
    레지스트리 위치 가까운 위치 사용자 또는 컨테이너 레지스트리를 사용할 기타 서비스에 가까운 지역의 위치를 선택합니다.

    Visual Studio의 Azure Container Registry 만들기 대화 상자의 스크린샷

  6. 만들기를 클릭합니다. 이제 게시 대화 상자에 생성된 레지스트리가 표시됩니다.

    생성된 Azure Container Registry를 보여 주는 게시 대화 상자의 스크린샷

  7. 마침을 선택하여 Azure에서 새로 만든 레지스트리에 컨테이너 이미지를 게시하는 프로세스를 완료합니다.

    성공적인 게시를 보여 주는 스크린샷.

다음 단계

이제 레지스트리에서 Docker 이미지를 실행할 수 있는 모든 호스트로 컨테이너를 끌어올 수 있습니다(예: Azure Container Instances).

Visual Studio를 사용하여 컨테이너화된 NET, ASP.NET 및 ASP.NET Core 앱을 쉽게 빌드, 디버그, 실행하고 Azure Container Registry, Docker Hub, Azure App Service 또는 사용자 고유 컨테이너 레지스트리에 게시할 수 있습니다. 이 문서에서는 Azure Container Registry에 ASP.NET Core 앱을 게시합니다.

필수 조건

설치 및 설정

Docker 데스크탑을 설치하려면 우선 Windows용 Docker: 설치하기 전에 알아야 할 사항의 정보를 검토하세요. 다음으로 Docker Desktop을 설치합니다.

Docker 컨테이너에 프로젝트 추가

  1. Visual Studio 프로젝트를 만들기 전에 Docker Desktop에서 Visual Studio 프로젝트에서 사용하려는 컨테이너 유형(Windows 또는 Linux)을 실행하고 있는지 확인합니다.

    Docker 바탕화면에서 사용된 컨테이너 형식을 변경하려면 태스크바의 Docker 아이콘(고래)을 마우스 오른쪽 단추로 클릭하고 Linux 컨테이너로 전환 또는 Windows 컨테이너로 전환을 선택합니다.

    Warning

    Visual Studio 프로젝트를 만든 후 컨테이너 유형을 전환하면 Docker 이미지 파일이 로드되지 않을 수 있습니다.

  2. ASP.NET Core 웹앱 템플릿을 사용하여 새 프로젝트를 만들거나 .NET Core 대신 .NET Framework를 사용하려는 경우 ASP.NET 웹 애플리케이션(.NET Framework)을 선택합니다.

  3. 새 웹 애플리케이션 만들기 화면에서 Docker 지원 사용 확인란이 선택되어 있는지 확인합니다.

    Docker 지원 사용 확인란의 스크린샷.

    스크린샷은 .NET 8.0의 최신 릴리스를 보여줍니다. .NET Framework를 사용하는 경우 대화 상자가 약간 다르게 보입니다.

  4. 원하는 컨테이너 유형(Windows 또는 Linux)을 선택하고 만들기를 선택합니다.

Dockerfile 개요

Visual Studio는 프로젝트에 최종 Docker 이미지를 만드는 방법에 대한 레시피를 제공하는 Dockerfile 을 만듭니다. 자세한 내용은 Dockerfile에서 사용되는 명령에 대한 자세한 내용은 Dockerfile 참조 를 참조하세요.

#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.

#Depending on the operating system of the host machines(s) that will build or run the containers, the image specified in the FROM statement may need to be changed.
#For more information, please see https://aka.ms/containercompat

FROM mcr.microsoft.com/dotnet/aspnet:8.0-nanoserver-1809 AS base
WORKDIR /app
EXPOSE 8080
EXPOSE 8081

FROM mcr.microsoft.com/dotnet/sdk:8.0-nanoserver-1809 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["MyWepApp/MyWebApp.csproj", "MyWebApp/"]
RUN dotnet restore "./MyWebApp/./MyWebApp.csproj"
COPY . .
WORKDIR "/src/MyWebApp"
RUN dotnet build "./MyWebApp.csproj" -c %BUILD_CONFIGURATION% -o /app/build

FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./MyWebApp.csproj" -c %BUILD_CONFIGURATION% -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyWebApp.dll"]

위의 Dockerfile은MCR(Microsoft Container Registry) .NET 8 이미지를 기반으로 하며, MyWebApp 라는 이름의 프로젝트를 빌드하고 컨테이너에 추가하여 기본 이미지를 수정하는 방법을 포함하고 있습니다. .NET Framework를 사용하는 경우 기본 이미지가 달라집니다.

새 프로젝트 대화 상자의 HTTPS에 대한 구성 확인란이 선택되면 Dockerfile은 두 개의 포트를 노출합니다. 한 포트는 HTTP 트래픽에 사용되고 다른 포트는 HTTPS에 사용됩니다. 이 확인란을 선택하지 않으면 단일 포트(80)가 HTTP 트래픽에 노출됩니다.

Visual Studio 2022 버전 17.7 이상을 사용하면 .NET 8을 대상으로 지정할 수 있습니다. 이 경우 상승된 권한보다는 일반 사용자로서 앱을 더 안전하게 실행할 수 있다는 이점이 있습니다. Visual Studio for .NET 8 프로젝트에서 생성된 기본 Dockerfile은 일반 사용자로 실행되도록 구성됩니다. 기존 프로젝트에서 이 동작을 사용하도록 설정하려면 기본 이미지의 Dockerfile에 줄을 USER app 추가합니다. 또한 포트 80은 일반 사용자에 대해 제한되므로 80 및 443 대신 포트 8080 및 8081을 노출합니다. (8080 포트는 HTTP 트래픽에 사용되고, 8081 포트는 HTTPS에 사용됩니다.) 일반 사용자로 실행하려면 컨테이너가 .NET 8 기본 이미지를 사용해야 하며 앱은 .NET 8 앱으로 실행되어야 합니다. 올바르게 구성된 경우 Dockerfile에는 다음 예제와 같이 코드가 포함되어야 합니다.

FROM mcr.microsoft.com/dotnet/aspnet:8.0-preview AS base
USER app
WORKDIR /app
EXPOSE 8080
EXPOSE 8081

디버그

툴바의 디버그 드롭다운 목록에서 Docker를 선택하고 앱에서 디버깅을 시작합니다. 인증서 신뢰 요청 메시지가 표시될 수 있습니다. 계속하려면 인증서를 신뢰하도록 선택하세요.

출력 창의 컨테이너 도구 옵션에 실행 중인 작업이 표시됩니다. 처음에는 기본 이미지를 다운로드하는 데 시간이 걸릴 수 있지만 이후 실행은 더 빠릅니다.

빌드가 완료되면 브라우저가 열리고 앱의 홈페이지가 표시됩니다. 브라우저의 주소 표시줄에서 디버깅을 위한 localhost URL 및 포트 번호를 볼 수 있습니다.

참고

디버깅을 위해 포트를 변경해야 하는 경우 launchSettings.json 파일에서 변경하면 됩니다. 컨테이너 시작 설정을 참조하세요.

컨테이너 창

컨테이너 창을 사용하여 머신에서 실행 중인 컨테이너와 사용할 수 있는 다른 이미지를 확인할 수 있습니다.

IDE에서 검색 상자를 사용하여(사용하려면 Ctrl+Q를 누름) 컨테이너 창을 열고 container를 입력한 후 목록에서 컨테이너 창을 선택합니다.

컨테이너 창을 움직여서 창 배치 안내선에 따라 편집기 아래 등 편리한 위치에 탑재할 수 있습니다.

창에서 컨테이너를 찾고 각 탭을 단계별로 진행하여 환경 변수, 포트 매핑, 로그 및 파일 시스템을 확인합니다.

컨테이너 창의 스크린샷

자세한 내용은 컨테이너 창 사용을 참조하세요.

Docker 이미지 게시

앱의 개발 및 디버그 주기가 완료되면 앱의 프로덕션 이미지를 만들 수 있습니다.

  1. 구성 드롭다운 목록을 릴리스로 변경하고 앱을 빌드합니다.

  2. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 게시를 선택합니다.

  3. 게시 대화 상자에서 Docker 컨테이너 레지스트리 탭을 선택합니다.

    게시 대화 상자 - Docker 컨테이너 레지스트리 선택 스크린샷

  4. 새 Azure Container Registry 만들기를 선택합니다.

    게시 대화 상자 - 새 Azure Container Registry 만들기 선택 스크린샷.

  5. 새 Azure Container Registry 만들기에 원하는 값을 채웁니다.

    설정 제안 값 설명
    DNS 접두사 전역적으로 고유한 이름 컨테이너 레지스트리를 고유하게 식별하는 이름입니다.
    구독 구독 선택 사용할 Azure 구독입니다.
    리소스 그룹 myResourceGroup 컨테이너 레지스트리를 만들 리소스 그룹의 이름입니다. 새로 만들기를 선택하여 새 리소스 그룹을 만듭니다.
    SKU 표준 컨테이너 레지스트리의 서비스 계층
    레지스트리 위치 가까운 위치 사용자 또는 컨테이너 레지스트리를 사용할 기타 서비스에 가까운 지역의 위치를 선택합니다.

    Visual Studio의 Azure Container Registry 만들기 대화 상자의 스크린샷

  6. 만들기를 실행합니다. 이제 게시 대화 상자에 생성된 레지스트리가 표시됩니다.

    생성된 Azure Container Registry를 보여 주는 게시 대화 상자의 스크린샷

  7. 마침을 선택하여 Azure에서 새로 만든 레지스트리에 컨테이너 이미지를 게시하는 프로세스를 완료합니다.

    성공적인 게시를 보여 주는 스크린샷.

다음 단계

이제 레지스트리에서 Docker 이미지를 실행할 수 있는 모든 호스트로 컨테이너를 끌어올 수 있습니다(예: Azure Container Instances).

추가 리소스