Kontejnerizujte aplikaci .NET pomocí příkazu dotnet publish
Kontejnery mají mnoho funkcí a výhod, jako je neměnná infrastruktura, poskytuje přenosnou architekturu a umožňuje škálovatelnost. Image se dá použít k vytvoření kontejnerů pro místní vývojové prostředí, privátní cloud nebo veřejný cloud. V tomto kurzu se naučíte kontejnerizovat aplikaci .NET pomocí příkazu dotnet publish bez použití souboru Dockerfile. Dále se dozvíte, jak nakonfigurovat image kontejneru a spuštění a jak vyčistit prostředky.
Spropitné
Pokud vás zajímá použití souboru Dockerfile ke kontejnerizaci aplikace .NET, přečtěte si Kurz: Kontejnerizace aplikace .NET.
Požadavky
Nainstalujte následující požadavky:
-
.NET 8 nebo novější sady SDK
Pokud máte nainstalovanou technologii .NET, pomocí příkazudotnet --info
určete, kterou sadu SDK používáte.
Pokud plánujete spuštění kontejneru místně, potřebujete modul runtime kontejneru kompatibilní s open container Initiative (OCI), například:
- Docker Desktop: Nejběžnější běhové prostředí kontejneru.
- Podman: otevřená alternativa k Dockeru bez démona.
Důležitý
Sada .NET SDK vytvoří image kontejneru bez Dockeru. Docker nebo Podman jsou potřeba jenom v případě, že chcete image spustit místně. Když ve výchozím nastavení publikovat aplikaci .NET jako image kontejneru, která se nasdílí do místního modulu runtime kontejneru. Alternativně můžete obraz uložit jako tarball nebo jej odeslat přímo do registru kontejnerů bez použití jakéhokoli běhového prostředí kontejneru.
Kromě těchto požadavků se doporučuje, abyste se seznámili se službami pracovních procesů v .NET, protože ukázkový projekt je pracovní proces.
Vytvoření aplikace .NET
K kontejnerizaci potřebujete aplikaci .NET, takže začněte vytvořením nové aplikace ze šablony. Otevřete terminál, vytvořte pracovní složku (sample-directory), pokud jste to ještě neudělali, a změňte adresáře tak, abyste v něm byli. Spuštěním následujícího příkazu v pracovní složce vytvořte nový projekt v podadresáři s názvem Worker:
dotnet new worker -o Worker -n DotNet.ContainerImage
Strom složek vypadá podobně jako v následujícím adresáři:
📁 sample-directory
└──📂 Worker
├──appsettings.Development.json
├──appsettings.json
├──DotNet.ContainerImage.csproj
├──Program.cs
├──Worker.cs
├──📂 Properties
│ └─── launchSettings.json
└──📂 obj
├── DotNet.ContainerImage.csproj.nuget.dgspec.json
├── DotNet.ContainerImage.csproj.nuget.g.props
├── DotNet.ContainerImage.csproj.nuget.g.targets
├── project.assets.json
└── project.nuget.cache
Příkaz dotnet new
vytvoří novou složku s názvem Worker a vygeneruje pracovní službu, která, když je spuštěná, zapíše každou sekundu do protokolu zprávu. V relaci terminálu změňte adresáře a přejděte do složky Worker. Ke spuštění aplikace použijte příkaz dotnet run
.
dotnet run
Using launch settings from ./Worker/Properties/launchSettings.json...
Building...
info: DotNet.ContainerImage.Worker[0]
Worker running at: 01/06/2025 13:37:28 -06:00
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
Content root path: .\Worker
info: DotNet.ContainerImage.Worker[0]
Worker running at: 01/06/2025 13:37:29 -06:00
info: DotNet.ContainerImage.Worker[0]
Worker running at: 01/06/2025 13:37:30 -06:00
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
Šablona pracovního procesu se trvale smyčuje. Pomocí příkazu zrušit Ctrl+C ho zastavte.
Nastavení názvu image kontejneru
Při publikování aplikace jako kontejneru jsou k dispozici různé možnosti konfigurace. Ve výchozím nastavení je název image kontejneru AssemblyName
projektu. Pokud je tento název neplatný jako název image kontejneru, můžete ho přepsat zadáním ContainerRepository
, jak je znázorněno v následujícím souboru projektu:
<Project Sdk="Microsoft.NET.Sdk.Worker">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UserSecretsId>dotnet-DotNet.ContainerImage-2e40c179-a00b-4cc9-9785-54266210b7eb</UserSecretsId>
<ContainerRepository>dotnet-worker-image</ContainerRepository>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.1" />
</ItemGroup>
</Project>
Pro více informací viz ContainerRepository
.
Publikování aplikace .NET
Pokud chcete aplikaci .NET publikovat jako kontejner, použijte následující příkaz dotnet publish:
dotnet publish --os linux --arch x64 /t:PublishContainer
Předchozí příkaz .NET CLI publikuje aplikaci jako kontejner:
- Cílení na Linux jako operační systém (
--os linux
). - Určení architektury x64 (
--arch x64
).
Důležitý
Pokud chcete kontejner publikovat místně, musíte mít spuštěný aktivní proces démon kompatibilní s OCI. Pokud není spuštěný při pokusu o publikování aplikace jako kontejneru, dojde k chybě podobné následující:
..\build\Microsoft.NET.Build.Containers.targets(66,9): error MSB4018:
The "CreateNewImage" task failed unexpectedly. [..\Worker\DotNet.ContainerImage.csproj]
Příkaz dotnet publish
vytvoří výstup podobný ukázkovém výstupu:
Restore complete (0.2s)
DotNet.ContainerImage succeeded (2.6s) → bin\Release\net9.0\linux-x64\publish\
Tento příkaz zkompiluje vaši pracovní aplikaci do složky publish a ve výchozím nastavení odešle image kontejneru do místního démonu Docker. Pokud používáte Podman, můžete použít alias
Publikování aplikace .NET do tarballu
Tarball (nebo soubor tar) je soubor, který obsahuje jiné soubory. Obvykle končí *.tar.gz složenou příponou souboru, která pomáhá indikovat, že se jedná o komprimovaný archiv. Tyto typy souborů se používají k distribuci softwaru nebo k vytváření záloh. V tomto případě se tarball vytvoří pro distribuci image kontejneru.
Pokud chcete publikovat aplikaci .NET jako kontejner do tarballu, použijte následující příkaz:
dotnet publish --os linux --arch x64 \
/t:PublishContainer \
-p ContainerArchiveOutputPath=./images/container-image.tar.gz
Předchozí příkaz publikuje aplikaci jako kontejner do tarballu:
- Cílení na Linux jako operační systém (
--os linux
). - Určení architektury x64 (
--arch x64
). - Nastavení vlastnosti
ContainerArchiveOutputPath
na./images/container-image.tar.gz
.
Příkaz nevyžaduje spuštěnou OCI-kompatibilní službu. Další informace najdete v tématu ContainerArchiveOutputPath
.
Naložte tarball
Běžným případem použití pro export do tarballu jsou organizace zaměřené na bezpečnost. Vytvářejí kontejnery, exportují je jako tar soubory a potom spouštějí nástroje pro skenování zabezpečení přes tyto soubory. Tento přístup zjednodušuje dodržování předpisů, protože zabraňuje složitosti skenování živého systému.
Tarball obsahuje celý kontejner, který pak lze načíst pomocí příslušného nástroje:
-
Docker:
docker load -i ./images/container-image.tar.gz
-
Podman:
podman load -i ./images/container-image.tar.gz
Publikování aplikace .NET do registru kontejneru
Registry kontejnerů jsou služby, které ukládají a spravují image kontejnerů. Používají se k ukládání a distribuci imagí kontejnerů napříč několika prostředími. Aplikaci .NET můžete publikovat jako kontejner do registru kontejneru pomocí následujícího příkazu:
dotnet publish --os linux --arch x64 \
/t:PublishContainer \
-p ContainerRegistry=ghcr.io
Předchozí kód publikuje aplikaci jako kontejner do registru kontejneru:
- Cílení na Linux jako operační systém (
--os linux
). - Určení architektury x64 (
--arch x64
). - Nastavení vlastnosti
ContainerRegistry
naghcr.io
.
Další informace najdete v tématu ContainerRegistry.
Vyčištění prostředků
V tomto článku jste publikovali pracovníka .NET jako obraz kontejneru. Pokud chcete, odstraňte tento prostředek. Pomocí příkazu docker images
zobrazte seznam nainstalovaných imagí.
docker images
Představte si následující příklad výstupu:
REPOSITORY TAG IMAGE ID CREATED SIZE
dotnet-worker-image 1.0.0 25aeb97a2e21 12 seconds ago 191MB
Spropitné
Soubory obrázků můžou být velké. Obvykle byste při testování a vývoji aplikace odebrali dočasné kontejnery, které jste vytvořili. Pokud plánujete vytvářet další image založené na daném modulu runtime, obvykle zachováte základní image s nainstalovaným modulem runtime.
Pokud chcete image odstranit, zkopírujte ID image a spusťte příkaz docker image rm
:
docker image rm 25aeb97a2e21