Samouczek: konteneryzowanie aplikacji .NET

Z tego samouczka dowiesz się, jak konteneryzować aplikację platformy .NET przy użyciu platformy Docker. Kontenery mają wiele funkcji i korzyści, takich jak niezmienna infrastruktura, zapewniając przenośną architekturę i umożliwiająca skalowalność. Obraz może służyć do tworzenia kontenerów dla lokalnego środowiska deweloperskiego, chmury prywatnej lub chmury publicznej.

W tym samouczku zostały wykonane następujące czynności:

  • Tworzenie i publikowanie prostej aplikacji .NET
  • Tworzenie i konfigurowanie pliku Dockerfile dla platformy .NET
  • Kompilowanie obrazu platformy Docker
  • Tworzenie i uruchamianie kontenera platformy Docker

Zapoznasz się z zadaniami kompilacji i wdrażania kontenera platformy Docker dla aplikacji .NET. Platforma Docker używa aparatu platformyDocker do szybkiego kompilowania i tworzenia pakietów aplikacji jako obrazów platformy Docker. Te obrazy są zapisywane w formacie dockerfile do wdrożenia i uruchamiania w kontenerze warstwowym.

Uwaga

Ten samouczek nie dotyczy aplikacji ASP.NET Core. Jeśli używasz ASP.NET Core, zobacz samouczek Dowiedz się, jak konteneryzować aplikację ASP.NET Core.

Wymagania wstępne

Zainstaluj następujące wymagania wstępne:

  • Zestaw .NET 8+ SDK
    Jeśli masz zainstalowaną platformę dotnet --info .NET, użyj polecenia , aby określić, którego zestawu SDK używasz.
  • Docker Community Edition
  • Tymczasowy folder roboczy dla przykładowej aplikacji Dockerfile i .NET. W tym samouczku nazwa docker-working jest używana jako folder roboczy.
  • Zestaw .NET 7+ SDK
    Jeśli masz zainstalowaną platformę dotnet --info .NET, użyj polecenia , aby określić, którego zestawu SDK używasz.
  • Docker Community Edition
  • Tymczasowy folder roboczy dla przykładowej aplikacji Dockerfile i .NET. W tym samouczku nazwa docker-working jest używana jako folder roboczy.

Tworzenie aplikacji .NET

Potrzebna jest aplikacja .NET uruchomiona przez kontener platformy Docker. Otwórz terminal, utwórz folder roboczy, jeśli jeszcze tego nie zrobiono, i wprowadź go. W folderze roboczym uruchom następujące polecenie, aby utworzyć nowy projekt w podkatalogu o nazwie App:

dotnet new console -o App -n DotNet.Docker

Drzewo folderów wygląda następująco:

📁 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

Polecenie dotnet new tworzy nowy folder o nazwie App i generuje aplikację konsolową "Hello World". Zmień katalogi i przejdź do folderu App z poziomu sesji terminalu. dotnet run Użyj polecenia , aby uruchomić aplikację. Aplikacja jest uruchamiana i drukowana Hello World! poniżej polecenia:

cd App
dotnet run
Hello World!

Domyślny szablon tworzy aplikację, która jest drukowana w terminalu, a następnie natychmiast kończy działanie. W tym samouczku użyjesz aplikacji, która zapętla się w nieskończoność. Otwórz plik Program.cs w edytorze tekstów.

Napiwek

Jeśli używasz programu Visual Studio Code, z poprzedniej sesji terminalu wpisz następujące polecenie:

code .

Spowoduje to otwarcie folderu App zawierającego projekt w programie Visual Studio Code.

Program.cs powinny wyglądać podobnie do następującego kodu w języku C#:

Console.WriteLine("Hello World!");

Zastąp plik następującym kodem, który liczy liczby co sekundę:

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));
}

Zapisz plik i ponownie przetestuj program za pomocą polecenia dotnet run. Pamiętaj, że ta aplikacja działa na czas nieokreślony. Użyj polecenia anuluj Ctrl+C , aby go zatrzymać. Poniżej przedstawiono przykładowe dane wyjściowe:

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

Jeśli przekażesz liczbę w wierszu polecenia do aplikacji, będzie ona liczyć tylko tę kwotę, a następnie zakończyć działanie. Spróbuj liczyć do dotnet run -- 5 pięciu.

Ważne

Wszystkie parametry po -- nie są przekazywane do dotnet run polecenia i zamiast tego są przekazywane do aplikacji.

Publikowanie aplikacji .NET

Przed dodaniem aplikacji .NET do obrazu platformy Docker najpierw należy ją opublikować. Najlepiej, aby kontener uruchamiał opublikowaną wersję aplikacji. Aby opublikować aplikację, uruchom następujące polecenie:

dotnet publish -c Release

To polecenie kompiluje aplikację do folderu publikowania. Ścieżka do folderu publikowania z folderu roboczego powinna mieć wartość .\App\bin\Release\net8.0\publish\.

To polecenie kompiluje aplikację do folderu publikowania. Ścieżka do folderu publikowania z folderu roboczego powinna mieć wartość .\App\bin\Release\net7.0\publish\.

Z folderu App pobierz listę katalogów folderu publikowania, aby sprawdzić, czy plik DotNet.Docker.dll został utworzony.

dir .\bin\Release\net8.0\publish\

    Directory: C:\Users\default\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
dir .\bin\Release\net7.0\publish\

    Directory: C:\Users\default\App\bin\Release\net7.0\publish

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---           2/13/2023  1:52 PM            431 DotNet.Docker.deps.json
-a---           2/13/2023  1:52 PM           6144 DotNet.Docker.dll
-a---           2/13/2023  1:52 PM         153600 DotNet.Docker.exe
-a---           2/13/2023  1:52 PM          11052 DotNet.Docker.pdb
-a---           2/13/2023  1:52 PM            253 DotNet.Docker.runtimeconfig.json

Tworzenie pliku Dockerfile

Plik Dockerfile jest używany przez docker build polecenie w celu utworzenia obrazu kontenera. Ten plik jest plikiem tekstowym o nazwie Dockerfile , który nie ma rozszerzenia.

Utwórz plik o nazwie Dockerfile w katalogu zawierającym plik csproj i otwórz go w edytorze tekstów. W tym samouczku jest używany obraz środowiska uruchomieniowego platformy ASP.NET Core (który zawiera obraz środowiska uruchomieniowego platformy .NET) i odpowiada aplikacji konsolowej platformy .NET.

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
WORKDIR /App

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

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

Uwaga

Obraz środowiska uruchomieniowego ASP.NET Core jest używany celowo, chociaż mcr.microsoft.com/dotnet/runtime:8.0 obraz mógł zostać użyty.

Napiwek

Ten plik Dockerfile używa kompilacji wieloetapowych, co optymalizuje ostateczny rozmiar obrazu przez warstwowanie kompilacji i pozostawienie tylko wymaganych artefaktów. Aby uzyskać więcej informacji, zobacz Docker Docs: kompilacje wieloetapowe.

Słowo FROM kluczowe wymaga w pełni kwalifikowanej nazwy obrazu kontenera platformy Docker. Microsoft Container Registry (MCR, mcr.microsoft.com) to syndykat usługi Docker Hub, który hostuje publicznie dostępne kontenery. Segment dotnet to repozytorium kontenerów, natomiast sdk segment or aspnet to nazwa obrazu kontenera. Obraz jest oznaczony tagiem 8.0, który jest używany do przechowywania wersji. mcr.microsoft.com/dotnet/aspnet:8.0 W związku z tym jest to środowisko uruchomieniowe platformy .NET 8.0. Upewnij się, że ściągasz wersję środowiska uruchomieniowego zgodną ze środowiskiem uruchomieniowym przeznaczonym dla zestawu SDK. Na przykład aplikacja utworzona w poprzedniej sekcji używa zestawu SDK platformy .NET 8.0, a obraz podstawowy, do którego odwołuje się plik Dockerfile , jest oznaczony tagiem 8.0.

Ważne

W przypadku korzystania z obrazów kontenerów opartych na systemie Windows należy określić tag obrazu poza elementem 8.0, na przykład mcr.microsoft.com/dotnet/aspnet:8.0-nanoserver-1809 zamiast mcr.microsoft.com/dotnet/aspnet:8.0. Wybierz nazwę obrazu na podstawie tego, czy używasz systemu operacyjnego Nano Server, czy Windows Server Core oraz której wersji systemu operacyjnego. Pełną listę wszystkich obsługiwanych tagów można znaleźć na stronie . Strona usługi Docker Hub platformy Docker platformy NET.

Zapisz plik Dockerfile. Struktura katalogów folderu roboczego powinna wyglądać następująco. Niektóre pliki i foldery na wyższym poziomie zostały pominięte, aby zaoszczędzić miejsce w artykule:

📁 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
            └──...
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build-env
WORKDIR /App

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

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

Uwaga

Obraz środowiska uruchomieniowego ASP.NET Core jest używany celowo, chociaż mcr.microsoft.com/dotnet/runtime:7.0 obraz mógł zostać użyty.

Napiwek

Ten plik Dockerfile używa kompilacji wieloetapowych, co optymalizuje ostateczny rozmiar obrazu przez warstwowanie kompilacji i pozostawienie tylko wymaganych artefaktów. Aby uzyskać więcej informacji, zobacz Docker Docs: kompilacje wieloetapowe.

Słowo FROM kluczowe wymaga w pełni kwalifikowanej nazwy obrazu kontenera platformy Docker. Usługa Microsoft Container Registry (MCR, mcr.microsoft.com) to syndykat usługi Docker Hub, który hostuje publicznie dostępne kontenery. Segment dotnet to repozytorium kontenerów, natomiast sdk segment or aspnet to nazwa obrazu kontenera. Obraz jest oznaczony tagiem 7.0, który jest używany do przechowywania wersji. mcr.microsoft.com/dotnet/aspnet:7.0 W związku z tym jest to środowisko uruchomieniowe platformy .NET 7.0. Upewnij się, że ściągasz wersję środowiska uruchomieniowego zgodną ze środowiskiem uruchomieniowym przeznaczonym dla zestawu SDK. Na przykład aplikacja utworzona w poprzedniej sekcji używa zestawu SDK platformy .NET 7.0, a obraz podstawowy, do którego odwołuje się plik Dockerfile , jest oznaczony tagiem 7.0.

Zapisz plik Dockerfile. Struktura katalogów folderu roboczego powinna wyglądać następująco. Niektóre pliki i foldery na wyższym poziomie zostały pominięte, aby zaoszczędzić miejsce w artykule:

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

W terminalu uruchom następujące polecenie:

docker build -t counter-image -f Dockerfile .

Platforma Docker przetworzy każdy wiersz w pliku Dockerfile. W . poleceniu docker build ustawia kontekst kompilacji obrazu. Przełącznik -f jest ścieżką do pliku Dockerfile. To polecenie kompiluje obraz i tworzy lokalne repozytorium o nazwie counter-image , które wskazuje na ten obraz. Po zakończeniu tego polecenia uruchom polecenie docker images , aby wyświetlić listę zainstalowanych obrazów:

docker images
REPOSITORY                         TAG       IMAGE ID       CREATED          SIZE
counter-image                      latest    2f15637dc1f6   10 minutes ago   217MB

Repozytorium counter-image jest nazwą obrazu. Tag latest to tag używany do identyfikowania obrazu. Jest 2f15637dc1f6 to identyfikator obrazu. Jest 10 minutes ago to czas utworzenia obrazu. Jest 217MB to rozmiar obrazu. Ostatnimi krokami pliku Dockerfile jest utworzenie kontenera na podstawie obrazu i uruchomienie aplikacji, skopiowanie opublikowanej aplikacji do kontenera i zdefiniowanie punktu wejścia.

FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /App
COPY --from=build-env /App/out .
ENTRYPOINT ["dotnet", "DotNet.Docker.dll"]
docker images
REPOSITORY                         TAG       IMAGE ID       CREATED          SIZE
counter-image                      latest    2f15637dc1f6   10 minutes ago   208MB

Repozytorium counter-image jest nazwą obrazu. Tag latest to tag używany do identyfikowania obrazu. Jest 2f15637dc1f6 to identyfikator obrazu. Jest 10 minutes ago to czas utworzenia obrazu. Jest 208MB to rozmiar obrazu. Ostatnimi krokami pliku Dockerfile jest utworzenie kontenera na podstawie obrazu i uruchomienie aplikacji, skopiowanie opublikowanej aplikacji do kontenera i zdefiniowanie punktu wejścia.

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

Polecenie COPY informuje platformę Docker o skopiowaniu określonego folderu na komputerze do folderu w kontenerze. W tym przykładzie folder publikowania jest kopiowany do folderu o nazwie App/out w kontenerze.

Polecenie WORKDIR zmienia bieżący katalog wewnątrz kontenera na App.

Następne polecenie informuje platformę Docker o ENTRYPOINTskonfigurowaniu kontenera do uruchamiania jako pliku wykonywalnego. Po uruchomieniu kontenera ENTRYPOINT polecenie zostanie uruchomione. Po zakończeniu tego polecenia kontener zostanie automatycznie zatrzymany.

Napiwek

Przed użyciem platformy .NET 8 kontenery skonfigurowane do uruchamiania jako tylko do odczytu mogą zakończyć się niepowodzeniem.Failed to create CoreCLR, HRESULT: 0x8007000E Aby rozwiązać ten problem, określ zmienną środowiskową DOTNET_EnableDiagnostics jako 0 (tuż przed krokiem ENTRYPOINT ):

ENV DOTNET_EnableDiagnostics=0

Aby uzyskać więcej informacji na temat różnych zmiennych środowiskowych platformy .NET, zobacz Zmienne środowiskowe platformy .NET.

Uwaga

Program .NET 6 standardizuje prefiks DOTNET_ zamiast COMPlus_ zmiennych środowiskowych, które konfigurują zachowanie czasu wykonywania platformy .NET. COMPlus_ Jednak prefiks będzie nadal działać. Jeśli używasz poprzedniej wersji środowiska uruchomieniowego platformy .NET, nadal należy użyć prefiksu COMPlus_ dla zmiennych środowiskowych.

Tworzenie kontenera

Teraz, gdy masz obraz zawierający aplikację, możesz utworzyć kontener. Kontener można utworzyć na dwa sposoby. Najpierw utwórz nowy kontener, który jest zatrzymany.

docker create --name core-counter counter-image

To docker create polecenie tworzy kontener na podstawie obrazu counter-image . Dane wyjściowe tego polecenia pokazują identyfikator KONTENERa (twój będzie inny) utworzonego kontenera:

d0be06126f7db6dd1cee369d911262a353c9b7fb4829a0c11b4b2eb7b2d429cf

Aby wyświetlić listę wszystkich kontenerów, użyj docker ps -a polecenia :

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

Zarządzanie kontenerem

Kontener został utworzony o określonej nazwie core-counter, ta nazwa jest używana do zarządzania kontenerem. W poniższym przykładzie docker start użyto polecenia , aby uruchomić kontener, a następnie użyj docker ps polecenia , aby wyświetlić tylko uruchomione kontenery:

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 Podobnie polecenie zatrzymuje kontener. W poniższym przykładzie docker stop użyto polecenia , aby zatrzymać kontener, a następnie użyj docker ps polecenia , aby pokazać, że żadne kontenery nie są uruchomione:

docker stop core-counter
core-counter

docker ps
CONTAINER ID    IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES

Połączenie do kontenera

Po uruchomieniu kontenera możesz nawiązać z nim połączenie, aby wyświetlić dane wyjściowe. docker start Użyj poleceń idocker attach, aby uruchomić kontener i zajrzeć do strumienia wyjściowego. W tym przykładzie naciśnięcie klawiszy Ctrl+C jest używane do odłączania od uruchomionego kontenera. To naciśnięcie klawiszy kończy proces w kontenerze, chyba że określono inaczej, co spowoduje zatrzymanie kontenera. Parametr --sig-proxy=false zapewnia, że klawisze Ctrl+C nie zatrzymają procesu w kontenerze.

Po odłączeniu od kontenera dołącz ponownie, aby sprawdzić, czy nadal działa i zliczasz.

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

Usuwanie kontenera

W tym artykule nie chcesz, aby kontenery wisiały, które nie robią nic. Usuń utworzony wcześniej kontener. Jeśli kontener jest uruchomiony, zatrzymaj go.

docker stop core-counter

Poniższy przykład zawiera listę wszystkich kontenerów. Następnie używa docker rm polecenia do usunięcia kontenera, a następnie sprawdza drugi raz dla wszystkich uruchomionych kontenerów.

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

Pojedyncze uruchomienie

Platforma Docker udostępnia docker run polecenie służące do tworzenia i uruchamiania kontenera jako pojedynczego polecenia. To polecenie eliminuje konieczność uruchomienia docker create polecenia , a następnie docker start. Możesz również ustawić to polecenie, aby automatycznie usunąć kontener po zatrzymaniu kontenera. Na przykład użyj polecenia docker run -it --rm , aby najpierw wykonać dwie czynności, automatycznie użyj bieżącego terminalu, aby nawiązać połączenie z kontenerem, a następnie po zakończeniu działania kontenera usuń go:

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

Kontener przekazuje również parametry do wykonywania aplikacji .NET. Aby poinstruować aplikację .NET, aby liczyła się tylko do trzech, przekaż wartość 3.

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

Za pomocą docker run -itpolecenia Ctrl+C zatrzymuje proces uruchomiony w kontenerze, co z kolei zatrzymuje kontener. --rm Ponieważ parametr został podany, kontener jest automatycznie usuwany po zatrzymaniu procesu. Sprawdź, czy nie istnieje:

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

Zmienianie PUNKTU WEJŚCIA

Polecenie docker run pozwala również zmodyfikować ENTRYPOINT polecenie z pliku Dockerfile i uruchomić coś innego, ale tylko dla tego kontenera. Na przykład użyj następującego polecenia, aby uruchomić bash polecenie lub cmd.exe. Edytuj polecenie zgodnie z potrzebami.

W tym przykładzie ENTRYPOINT zmieniono wartość na cmd.exe. Naciśnij klawisze Ctrl+C , aby zakończyć proces i zatrzymać kontener.

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

Podstawowe polecenia

Platforma Docker ma wiele różnych poleceń, które tworzą kontenery i obrazy oraz zarządzają nimi oraz współdziałają z nimi. Te polecenia platformy Docker są niezbędne do zarządzania kontenerami:

Czyszczenie zasobów

W tym samouczku utworzono kontenery i obrazy. Jeśli chcesz, usuń te zasoby. Użyj następujących poleceń, aby

  1. Wyświetlanie listy wszystkich kontenerów

    docker ps -a
    
  2. Zatrzymaj kontenery, które są uruchomione według ich nazwy.

    docker stop core-counter
    
  3. Usuwanie kontenera

    docker rm core-counter
    

Następnie usuń wszystkie obrazy, które nie są już potrzebne na maszynie. Usuń obraz utworzony przez plik Dockerfile , a następnie usuń obraz platformy .NET, na podstawie którego został utworzony plik Dockerfile . Możesz użyć identyfikatora OBRAZU lub ciągu w formacie REPOSITORY:TAG.

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

docker images Użyj polecenia , aby wyświetlić listę zainstalowanych obrazów.

Napiwek

Pliki obrazów mogą być duże. Zazwyczaj można usunąć tymczasowe kontenery utworzone podczas testowania i tworzenia aplikacji. Zwykle obrazy podstawowe są instalowane przy użyciu środowiska uruchomieniowego, jeśli planujesz kompilowanie innych obrazów na podstawie tego środowiska uruchomieniowego.

Następne kroki