다음을 통해 공유


자습서: .NET 앱 컨테이너화

이 자습서에서는 Docker를 사용하여 .NET 애플리케이션을 컨테이너화하는 방법을 알아봅니다. 컨테이너에는 변경할 수 없는 인프라, 이식 가능한 아키텍처 제공 및 확장성 사용과 같은 많은 기능과 이점이 있습니다. 이미지를 사용하여 로컬 개발 환경, 프라이빗 클라우드 또는 퍼블릭 클라우드용 컨테이너를 만들 수 있습니다.

이 자습서에서는 다음을 수행합니다.

  • 간단한 .NET 앱 만들기 및 게시
  • .NET용 Dockerfile 만들기 및 구성
  • Docker 이미지 빌드
  • Docker 컨테이너 만들기 및 실행

Docker 컨테이너 빌드를 살펴보고 .NET 애플리케이션에 대한 작업을 배포합니다. Docker 플랫폼Docker 엔진을 사용하여 앱을 빠르게 빌드하고 패키지하여 Docker 이미지로 만듭니다. 이러한 이미지는 계층화된 컨테이너에서 배포 및 실행할 Dockerfile 형식으로 작성됩니다.

Docker 또는 Podman 없이 .NET 앱을 컨테이너로 게시하려는 경우 dotnet publish로 .NET 앱 컨테이너화,를 참조하세요.

메모

이 자습서 은(는) ASP.NET Core 앱에는이(가) 아닙니다. ASP.NET Core를 사용하는 경우, ASP.NET Core 애플리케이션을 컨테이너로 구축하는 방법 자습서를 확인하세요.

필수 구성 요소

다음 필수 구성 요소를 설치합니다.

  • .NET 8+ SDK.
    .NET이 설치된 경우 dotnet --info 명령을 사용하여 사용 중인 SDK를 확인합니다.
  • Docker Community Edition.
  • Dockerfile 및 .NET 예제 앱에 대한 임시 작업 폴더입니다. 이 자습서에서는 docker-working이라는 이름이 작업 폴더로 사용됩니다.

.NET 앱 만들기

Docker 컨테이너가 실행되는 .NET 앱이 필요합니다. 터미널을 열고, 아직 작업 폴더를 만들지 않은 경우 만든 다음 입력합니다. 작업 폴더에서 다음 명령을 실행하여 App이라는 하위 디렉터리에 새 프로젝트를 만듭니다.

dotnet new console -o App -n DotNet.Docker

폴더 트리는 다음 디렉터리 구조와 유사합니다.

📁 docker-working
    └──📂 App
        ├──DotNet.Docker.csproj
        ├──Program.cs
        └──📂 obj
            ├── DotNet.Docker.csproj.nuget.dgspec.json
            ├── DotNet.Docker.csproj.nuget.g.props
            ├── DotNet.Docker.csproj.nuget.g.targets
            ├── project.assets.json
            └── project.nuget.cache

dotnet new 명령은 App이라는 새 폴더를 만들고 "Hello World" 콘솔 애플리케이션을 생성합니다. 이제 디렉터리를 변경하고 터미널 세션에서 App 폴더로 이동합니다. dotnet run 명령을 사용하여 앱을 시작합니다. 애플리케이션이 실행되고 명령어 아래에 Hello World!을 인쇄합니다.

cd App
dotnet run
Hello World!

기본 템플릿은 터미널에 인쇄한 다음 즉시 종료되는 앱을 만듭니다. 이 자습서에서는 무기한 반복하는 앱을 사용합니다. 텍스트 편집기에서 Program.cs 파일을 엽니다.

Visual Studio Code를 사용하는 경우 이전 터미널 세션에서 다음 명령을 입력합니다.

code .

이 명령은 Visual Studio Code의 프로젝트가 포함된 App 폴더를 엽니다.

Program.cs 다음 C# 코드와 같이 표시됩니다.

Console.WriteLine("Hello World!");

1초마다 숫자를 계산하는 다음 코드로 파일을 바꿉니다.

var counter = 0;
var max = args.Length is not 0 ? Convert.ToInt32(args[0]) : -1;

while (max is -1 || counter < max)
{
    Console.WriteLine($"Counter: {++counter}");

    await Task.Delay(TimeSpan.FromMilliseconds(1_000));
}
var counter = 0;
var max = args.Length is not 0 ? Convert.ToInt32(args[0]) : -1;

while (max is -1 || counter < max)
{
    Console.WriteLine($"Counter: {++counter}");

    await Task.Delay(TimeSpan.FromMilliseconds(1_000));
}

파일을 저장하고 dotnet run사용하여 프로그램을 다시 테스트합니다. 이 앱은 무기한 실행됩니다. 취소 명령 Ctrl+C 사용하여 중지합니다. 다음 예제 출력을 고려합니다.

dotnet run
Counter: 1
Counter: 2
Counter: 3
Counter: 4
^C

명령줄에서 숫자를 앱에 입력하면, 횟수가 이 수로 제한되고 그 후 종료합니다. dotnet run -- 5 사용하여 5로 계산해 보세요.

중요하다

-- 이후의 모든 매개 변수는 dotnet run 명령에 전달되지 않고 대신 애플리케이션에 전달됩니다.

.NET 앱 게시

앱이 이미지 생성에 적합하려면 컴파일해야 합니다. dotnet publish 명령은 앱을 빌드하고 게시하기 때문에 가장 적합합니다. 자세한 내용을 보려면 dotnet builddotnet publish 명령어에 대한 설명서를 참조하세요.

dotnet publish -c Release

Docker 없이 .NET 앱을 컨테이너로 게시하려는 경우 dotnet 게시사용하여 .NET 앱 컨테이너화 참조하세요.

dotnet publish 명령은 앱을 게시 폴더로 컴파일합니다. 작업 폴더에서 게시 폴더의 경로는 ./App/bin/Release/<TFM>/publish/입니다.

App 폴더에서 게시 폴더의 디렉터리 목록을 가져와 DotNet.Docker.dll 파일이 생성되었는지 확인합니다.

dir .\bin\Release\net9.0\publish\

    Directory: C:\Users\default\docker-working\App\bin\Release\net9.0\publish

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----          1/6/2025  10:11 AM            431 DotNet.Docker.deps.json
-a----          1/6/2025  10:11 AM           6144 DotNet.Docker.dll
-a----          1/6/2025  10:11 AM         145408 DotNet.Docker.exe
-a----          1/6/2025  10:11 AM          11716 DotNet.Docker.pdb
-a----          1/6/2025  10:11 AM            340 DotNet.Docker.runtimeconfig.json
dir .\bin\Release\net8.0\publish\

    Directory: C:\Users\default\docker-working\App\bin\Release\net8.0\publish

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           9/22/2023  9:17 AM            431 DotNet.Docker.deps.json
-a---           9/22/2023  9:17 AM           6144 DotNet.Docker.dll
-a---           9/22/2023  9:17 AM         157696 DotNet.Docker.exe
-a---           9/22/2023  9:17 AM          11688 DotNet.Docker.pdb
-a---           9/22/2023  9:17 AM            353 DotNet.Docker.runtimeconfig.json

Dockerfile 만들기

Dockerfile 파일은 docker build 명령에서 컨테이너 이미지를 만드는 데 사용됩니다. 이 파일은 확장명이 없는 Dockerfile 텍스트 파일입니다.

.csproj 포함하는 디렉터리에 Dockerfile 파일을 만들고 텍스트 편집기에서 엽니다. 이 자습서에서는 ASP.NET Core 런타임 이미지(.NET 런타임 이미지 포함)를 사용하고 .NET 콘솔 애플리케이션에 해당합니다.

FROM mcr.microsoft.com/dotnet/sdk:9.0@sha256:3fcf6f1e809c0553f9feb222369f58749af314af6f063f389cbd2f913b4ad556 AS build
WORKDIR /App

# Copy everything
COPY . ./
# Restore as distinct layers
RUN dotnet restore
# Build and publish a release
RUN dotnet publish -o out

# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:9.0@sha256:b4bea3a52a0a77317fa93c5bbdb076623f81e3e2f201078d89914da71318b5d8
WORKDIR /App
COPY --from=build /App/out .
ENTRYPOINT ["dotnet", "DotNet.Docker.dll"]

메모

ASP.NET Core 런타임 이미지는 mcr.microsoft.com/dotnet/runtime:9.0 이미지를 대신 사용할 수 있지만 여기서는 의도적으로 사용됩니다.

FROM mcr.microsoft.com/dotnet/sdk:8.0@sha256:35792ea4ad1db051981f62b313f1be3b46b1f45cadbaa3c288cd0d3056eefb83 AS build
WORKDIR /App

# Copy everything
COPY . ./
# Restore as distinct layers
RUN dotnet restore
# Build and publish a release
RUN dotnet publish -o out

# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:8.0@sha256:6c4df091e4e531bb93bdbfe7e7f0998e7ced344f54426b7e874116a3dc3233ff
WORKDIR /App
COPY --from=build /App/out .
ENTRYPOINT ["dotnet", "DotNet.Docker.dll"]

메모

ASP.NET Core 런타임 이미지는 mcr.microsoft.com/dotnet/runtime:8.0 이미지를 대신 사용할 수 있지만 여기서는 의도적으로 사용됩니다.

중요하다

Dockerfile 이미지 태그 다음에 SHA(보안 해시 알고리즘)를 포함하는 것이 가장 좋습니다. 이렇게 하면 이미지가 변조되지 않으며, 기대하는 이미지와 동일하다는 것을 보장합니다. SHA는 이미지의 고유 식별자입니다. 자세한 내용은 Docker Docs: 다이제스트이미지를 끌어오기.를 참조하세요.

Dockerfile 빌드를 계층화하고 필요한 아티팩트만 남겨 이미지의 최종 크기를 최적화하는 다단계 빌드를 사용합니다. 자세한 내용은 Docker Docs: 다단계 빌드참조하세요.

FROM 키워드에는 정규화된 Docker 컨테이너 이미지 이름이 필요합니다. MCR(Microsoft Container Registry, mcr.microsoft.com)은 공개적으로 액세스할 수 있는 컨테이너를 호스트하는 Docker Hub의 신디케이트입니다. dotnet 세그먼트는 컨테이너 리포지토리인 반면 sdk 또는 aspnet 세그먼트는 컨테이너 이미지 이름입니다. 이미지에는 버전 관리용으로 사용되는 9.0태그가 지정됩니다. 따라서 mcr.microsoft.com/dotnet/aspnet:9.0 .NET 9.0 런타임입니다. SDK가 대상으로 하는 런타임과 일치하는 런타임 버전을 확보해야 합니다. 예를 들어, 이전 섹션에서 만든 앱은 .NET 9.0 SDK를 사용했고, Dockerfile에 참조된 기본 이미지는 9.0태그가 지정되었습니다.

중요하다

Windows 기반 컨테이너 이미지를 사용하는 경우 mcr.microsoft.com/dotnet/aspnet:9.0대신 mcr.microsoft.com/dotnet/aspnet:9.0-nanoserver-1809 같이 단순히 9.0넘어 이미지 태그를 지정해야 합니다. Nano Server 또는 Windows Server Core를 사용하는지 여부와 해당 OS의 버전을 기준으로 이미지 이름을 선택합니다. .NET의 Docker Hub 페이지에서 지원되는 모든 태그의 전체 목록을 찾을 수 있습니다.

Dockerfile 파일을 저장합니다. 작업 폴더의 디렉터리 구조는 다음과 같습니다. 문서의 공간을 절약하기 위해 일부 심층 수준 파일 및 폴더는 생략됩니다.

📁 docker-working
    └──📂 App
        ├── Dockerfile
        ├── DotNet.Docker.csproj
        ├── Program.cs
        ├──📂 bin
        │   └───📂 Release
        │        └───📂 net9.0
        │             ├───📂 publish
        │             │    ├─── DotNet.Docker.deps.json
        │             │    ├─── DotNet.Docker.dll
        │             │    ├─── DotNet.Docker.exe
        │             │    ├─── DotNet.Docker.pdb
        │             │    └─── DotNet.Docker.runtimeconfig.json
        │             ├─── DotNet.Docker.deps.json
        │             ├─── DotNet.Docker.dll
        │             ├─── DotNet.Docker.exe
        │             ├─── DotNet.Docker.pdb
        │             └─── DotNet.Docker.runtimeconfig.json
        └──📁 obj
            └──...

FROM 키워드에는 정규화된 Docker 컨테이너 이미지 이름이 필요합니다. MCR(Microsoft Container Registry, mcr.microsoft.com)은 공개적으로 액세스할 수 있는 컨테이너를 호스트하는 Docker Hub의 신디케이트입니다. dotnet 세그먼트는 컨테이너 리포지토리인 반면 sdk 또는 aspnet 세그먼트는 컨테이너 이미지 이름입니다. 이미지에는 버전 관리용으로 사용되는 8.0태그가 지정됩니다. 따라서 mcr.microsoft.com/dotnet/aspnet:8.0 .NET 8.0 런타임입니다. SDK가 대상으로 하는 런타임과 일치하는 런타임 버전을 가져와야 합니다. 예를 들어, 이전 섹션에서 만든 앱은 .NET 8.0 SDK를 사용했으며, Dockerfile에 참조된 기본 이미지는 8.0태그가 지정되어 있습니다.

중요하다

Windows 기반 컨테이너 이미지를 사용하는 경우 mcr.microsoft.com/dotnet/aspnet:8.0대신 mcr.microsoft.com/dotnet/aspnet:8.0-nanoserver-1809 같이 단순히 8.0넘어 이미지 태그를 지정해야 합니다. Nano Server 또는 Windows Server Core를 사용하는지 여부와 해당 OS의 버전을 기준으로 이미지 이름을 선택합니다. .NET의 Docker Hub 페이지에서 지원되는 모든 태그의 전체 목록을 찾을 수 있습니다.

Dockerfile 파일을 저장합니다. 작업 폴더의 디렉터리 구조는 다음과 같습니다. 문서의 공간을 절약하기 위해 일부 심층 수준 파일 및 폴더는 생략됩니다.

📁 docker-working
    └──📂 App
        ├── Dockerfile
        ├── DotNet.Docker.csproj
        ├── Program.cs
        ├──📂 bin
        │   └──📂 Release
        │       └──📂 net8.0
        │           └──📂 publish
        │               ├── DotNet.Docker.deps.json
        │               ├── DotNet.Docker.exe
        │               ├── DotNet.Docker.dll
        │               ├── DotNet.Docker.pdb
        │               └── DotNet.Docker.runtimeconfig.json
        └──📁 obj
            └──...

ENTRYPOINT 명령은 DotNet.Docker.dll호스트로 dotnet 설정합니다. 그러나 OS를 앱 호스트로 사용하여 ENTRYPOINT 앱 실행 파일 자체로 정의할 수 있습니다.

ENTRYPOINT ["./DotNet.Docker"]

이로 인해 앱은 dotnet없이 직접 실행되며, 대신 앱 호스트와 기본 OS에 의존하게 됩니다. 플랫폼 간 이진 파일 배포에 대한 자세한 내용은 플랫폼 간 이진 파일 생성을 참조하세요.

컨테이너를 빌드하려면 터미널에서 다음 명령을 실행합니다.

docker build -t counter-image -f Dockerfile .

Docker는 Dockerfile각 줄을 처리합니다. docker build 명령의 .가 이미지의 빌드 컨텍스트를 설정합니다. -f 스위치는 Dockerfile대한 경로입니다. 이 명령은 이미지를 빌드하고 해당 이미지를 가리키는 카운터 이미지 명명된 로컬 리포지토리를 만듭니다. 이 명령이 완료되면 docker images 실행하여 설치된 이미지 목록을 확인합니다.

REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
counter-image    latest    1c1f1433e51d   32 seconds ago   223MB
docker images
REPOSITORY       TAG       IMAGE ID       CREATED          SIZE
counter-image    latest    2f15637dc1f6   10 minutes ago   217MB

counter-image 리포지토리는 이미지의 이름입니다. 또한 이미지 태그, 이미지 식별자, 크기 및 생성된 시간은 모두 출력의 일부입니다. Dockerfile 마지막 단계는 이미지에서 컨테이너를 만들고 앱을 실행하고, 게시된 앱을 컨테이너에 복사하고, 진입점을 정의하는 것입니다.

FROM mcr.microsoft.com/dotnet/aspnet:9.0
WORKDIR /App
COPY --from=build /App/out .
ENTRYPOINT ["dotnet", "DotNet.Docker.dll"]
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /App
COPY --from=build /App/out .
ENTRYPOINT ["dotnet", "DotNet.Docker.dll"]

FROM 명령은 사용할 기본 이미지와 태그를 지정합니다. WORKDIR 명령은 컨테이너 내의 현재 디렉터리를 로 변경합니다.

COPY 명령은 지정된 원본 디렉터리를 대상 폴더에 복사하도록 Docker에 지시합니다. 이 예제에서 build 계층의 게시 콘텐츠는 App/out폴더에 출력되므로 복사할 원본입니다. App/out 디렉터리에 게시된 모든 콘텐츠는 현재 작업 디렉터리(App)로 복사됩니다.

다음 명령인 ENTRYPOINTDocker에 실행 파일로 실행되도록 컨테이너를 구성하도록 지시합니다. 컨테이너가 시작되면 ENTRYPOINT 명령이 실행됩니다. 이 명령이 종료되면 컨테이너가 자동으로 중지됩니다.

.NET 8 이전에는 읽기 전용으로 실행되도록 구성된 컨테이너가 Failed to create CoreCLR, HRESULT: 0x8007000E오류와 함께 실패할 수 있었습니다. 이 문제를 해결하려면 DOTNET_EnableDiagnostics 환경 변수를 0 지정합니다(ENTRYPOINT 단계 바로 앞).

ENV DOTNET_EnableDiagnostics=0

다양한 .NET 환경 변수에 대한 자세한 내용은.NET 환경 변수 참조하세요.

메모

.NET 6은 .NET 런타임 동작을 구성하는 환경 변수에 대해 접두사를 COMPlus_에서 DOTNET_으로 표준화합니다. 그러나 COMPlus_ 접두사는 계속 작동합니다. 이전 버전의 .NET 런타임을 사용하는 경우에도 환경 변수에 COMPlus_ 접두사를 사용해야 합니다.

컨테이너 만들기

이제 앱이 포함된 이미지가 있으므로 컨테이너를 만들 수 있습니다. 두 가지 방법으로 컨테이너를 만들 수 있습니다. 먼저 중지된 새 컨테이너를 만듭니다.

docker create --name core-counter counter-image

docker create 명령은 카운터 이미지 이미지를 기반으로 컨테이너를 만듭니다. docker create 명령의 출력은 컨테이너의 CONTAINER ID를 보여줍니다 (여러분의 식별자는 다를 수 있습니다).

d0be06126f7db6dd1cee369d911262a353c9b7fb4829a0c11b4b2eb7b2d429cf

모든 컨테이너의 목록을 보려면 명령을 사용하세요.

docker ps -a
CONTAINER ID   IMAGE           COMMAND                  CREATED          STATUS    PORTS     NAMES
d0be06126f7d   counter-image   "dotnet DotNet.Docke…"   12 seconds ago   Created             core-counter

컨테이너 관리

컨테이너는 core-counter특정 이름으로 만들어졌습니다. 이 이름은 컨테이너를 관리하는 데 사용됩니다. 다음 예제에서는 docker start 명령을 사용하여 컨테이너를 시작한 다음 docker ps 명령을 사용하여 실행 중인 컨테이너만 표시합니다.

docker start core-counter
core-counter

docker ps
CONTAINER ID   IMAGE           COMMAND                  CREATED          STATUS          PORTS     NAMES
cf01364df453   counter-image   "dotnet DotNet.Docke…"   53 seconds ago   Up 10 seconds             core-counter

마찬가지로 docker stop 명령은 컨테이너를 중지합니다. 다음 예제에서는 docker stop 명령을 사용하여 컨테이너를 중지한 다음 docker ps 명령을 사용하여 실행 중인 컨테이너가 없음을 보여 줍니다.

docker stop core-counter
core-counter

docker ps
CONTAINER ID    IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES

컨테이너에 연결

컨테이너가 실행되면 컨테이너에 연결하여 출력을 볼 수 있습니다. docker startdocker attach 명령을 사용하여 컨테이너를 시작하고 출력 스트림을 살펴봅니다. 이 예제에서는 Ctrl+C 키 입력을 사용하여 실행 중인 컨테이너에서 분리합니다. 이 키 입력은 달리 지정하지 않는 한 컨테이너에서 프로세스를 종료합니다. 그러면 컨테이너가 중지됩니다. --sig-proxy=false 매개 변수는 Ctrl+C 컨테이너의 프로세스를 중지하지 않도록 합니다.

컨테이너에서 분리한 후 다시 연결하여 계속 실행 중이고 계산 중인지 확인합니다.

docker start core-counter
core-counter

docker attach --sig-proxy=false core-counter
Counter: 7
Counter: 8
Counter: 9
^C

docker attach --sig-proxy=false core-counter
Counter: 17
Counter: 18
Counter: 19
^C

컨테이너 삭제

이 기사에서는 아무 일도 하지 않는 컨테이너가 남아 있는 것을 피하고자 합니다. 이전에 만든 컨테이너를 삭제합니다. 컨테이너가 실행 중이면 중지합니다.

docker stop core-counter

다음 예제에서는 모든 컨테이너를 나열합니다. 그런 다음 docker rm 명령을 사용하여 컨테이너를 삭제한 다음 실행 중인 컨테이너에 대해 두 번째로 확인합니다.

docker ps -a
CONTAINER ID    IMAGE            COMMAND                   CREATED          STATUS                        PORTS    NAMES
2f6424a7ddce    counter-image    "dotnet DotNet.Dock…"    7 minutes ago    Exited (143) 20 seconds ago            core-counter

docker rm core-counter
core-counter

docker ps -a
CONTAINER ID    IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES

단일 실행

Docker는 컨테이너를 만들고 단일 명령으로 실행하는 docker run 명령을 제공합니다. 이 명령은 docker create을 실행한 후 docker start을 실행할 필요가 없습니다. 컨테이너가 중지되면 컨테이너를 자동으로 삭제하도록 이 명령을 설정할 수도 있습니다. 예를 들어 docker run -it --rm 사용하여 두 가지 작업을 수행합니다. 먼저 현재 터미널을 자동으로 사용하여 컨테이너에 연결한 다음 컨테이너가 완료되면 제거합니다.

docker run -it --rm counter-image
Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5
^C

또한 컨테이너는 .NET 앱의 실행에 매개 변수를 전달합니다. .NET 앱에 3개만 계산하도록 지시하려면 3을 전달합니다.

docker run -it --rm counter-image 3
Counter: 1
Counter: 2
Counter: 3

docker run -it을(를) 사용하면 Ctrl+C 명령이 컨테이너에서 실행되는 프로세스를 멈추게 하며, 결국 컨테이너 자체도 중지시킵니다. --rm 매개 변수가 제공되었으므로 프로세스가 중지되면 컨테이너가 자동으로 삭제됩니다. 존재하지 않는지 확인합니다.

docker ps -a
CONTAINER ID    IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES

ENTRYPOINT을 변경

docker run 명령을 사용하면 DockerfileENTRYPOINT 명령을 수정하고 해당 컨테이너에 대해서만 다른 항목을 실행할 수 있습니다. 예를 들어 다음 명령을 사용하여 bash 또는 cmd.exe실행합니다. 필요에 따라 명령을 편집합니다.

이 예제에서는 ENTRYPOINTcmd.exe로 변경됩니다. Ctrl+C 눌러 프로세스를 종료하고 컨테이너를 중지합니다.

docker run -it --rm --entrypoint "cmd.exe" counter-image

Microsoft Windows [Version 10.0.17763.379]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\>dir
 Volume in drive C has no label.
 Volume Serial Number is 3005-1E84

 Directory of C:\

04/09/2019  08:46 AM    <DIR>          app
03/07/2019  10:25 AM             5,510 License.txt
04/02/2019  01:35 PM    <DIR>          Program Files
04/09/2019  01:06 PM    <DIR>          Users
04/02/2019  01:35 PM    <DIR>          Windows
               1 File(s)          5,510 bytes
               4 Dir(s)  21,246,517,248 bytes free

C:\>^C

메모

이 예제는 Windows 컨테이너에서만 작동합니다. Linux 컨테이너에는 cmd.exe없습니다.

필수 명령

Docker에는 컨테이너 및 이미지를 만들고 관리하고 상호 작용하는 다양한 명령이 있습니다. 이러한 Docker 명령은 컨테이너를 관리하는 데 필수적입니다.

리소스 정리

이 자습서에서는 컨테이너 및 이미지를 만들었습니다. 원하는 경우 이러한 리소스를 삭제합니다. 다음 명령을 사용하여

  1. 모든 컨테이너 나열

    docker ps -a
    
  2. 이름으로 실행되는 컨테이너를 중지합니다.

    docker stop core-counter
    
  3. 컨테이너 삭제

    docker rm core-counter
    

다음으로, 컴퓨터에서 더 이상 원하지 않는 이미지를 삭제합니다. Dockerfile로 생성된 이미지를 삭제한 다음, Dockerfile을 기반으로 한 .NET 이미지를 삭제하세요. IMAGE ID 또는 REPOSITORY:TAG 형식 문자열을 사용할 수 있습니다.

docker rmi counter-image:latest
docker rmi mcr.microsoft.com/dotnet/aspnet:9.0
docker rmi counter-image:latest
docker rmi mcr.microsoft.com/dotnet/aspnet:8.0

docker images 명령을 사용하여 설치된 이미지 목록을 확인합니다.

이미지 파일은 클 수 있습니다. 일반적으로 앱을 테스트하고 개발하는 동안 만든 임시 컨테이너를 제거합니다. 일반적으로 해당 런타임에 따라 다른 이미지를 빌드하려는 경우 런타임이 설치된 기본 이미지를 유지합니다.

다음 단계