Bagikan melalui


Mengonteinerkan aplikasi .NET dengan dotnet publish

Kontainer memiliki banyak fitur dan manfaat, seperti menjadi infrastruktur yang tidak dapat diubah, menyediakan arsitektur portabel, dan memungkinkan skalabilitas. Gambar dapat digunakan untuk membuat kontainer untuk lingkungan pengembangan lokal, cloud privat, atau cloud publik Anda. Dalam tutorial ini, Anda mempelajari cara mengontainerisasi aplikasi .NET menggunakan perintah dotnet publish tanpa perlu menggunakan Dockerfile. Selain itu, Anda menjelajahi cara mengonfigurasi image kontainer dan pengelolaan eksekusi, serta cara pembersihan sumber daya.

Tips

Jika Anda tertarik menggunakan Dockerfile untuk membuat kontainer aplikasi .NET Anda, lihat tutorial : Membuat kontainer aplikasi .NET.

Prasyarat

Instal prasyarat berikut:

  • .NET 8+ SDK
    Jika Anda telah menginstal .NET, gunakan perintah dotnet --info untuk menentukan SDK mana yang Anda gunakan.

Jika Anda berencana menjalankan kontainer secara lokal, Anda memerlukan runtime kontainer yang kompatibel dengan Open Container Initiative (OCI), seperti:

  • Docker Desktop: Runtime kontainer yang paling umum.
  • Podman: Alternatif tanpa daemon sumber terbuka untuk Docker.

Penting

.NET SDK membuat gambar kontainer tanpa Docker. Docker atau Podman hanya diperlukan jika Anda ingin menjalankan gambar secara lokal. Secara bawaan, saat Anda menerbitkan aplikasi .NET sebagai gambar kontainer, aplikasi tersebut akan diunggah ke runtime kontainer lokal. Atau, Anda dapat menyimpan gambar sebagai tarball atau mengunggahnya langsung ke registri kontainer tanpa menggunakan runtime kontainer sama sekali.

Selain prasyarat ini, disarankan agar Anda terbiasa dengan Worker Services di .NET karena proyek sampel adalah pekerja.

Membuat aplikasi .NET

Anda memerlukan aplikasi .NET untuk melakukan kontainerisasi, jadi mulailah dengan membuat aplikasi baru dari templat. Buka terminal Anda, buat folder kerja (direktori sampel ) jika Anda belum melakukannya, dan ubah direktori sehingga Anda berada di dalamnya. Di folder kerja, jalankan perintah berikut untuk membuat proyek baru di subdirektori bernama Worker:

dotnet new worker -o Worker -n DotNet.ContainerImage

Pohon folder Anda terlihat mirip dengan direktori berikut:

πŸ“ 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

Perintah dotnet new membuat folder baru bernama Worker dan menghasilkan layanan pekerja yang, saat dijalankan, mencatat pesan setiap detik. Dari sesi terminal Anda, ubah direktori dan navigasikan ke folder Worker. Gunakan perintah dotnet run untuk memulai aplikasi.

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...

Templat pekerja mengulang tanpa henti. Gunakan perintah batalkan Ctrl+C untuk menghentikannya.

Mengatur nama gambar kontainer

Ada berbagai opsi konfigurasi yang tersedia saat menerbitkan aplikasi sebagai kontainer. Secara default, nama gambar kontainer adalah AssemblyName proyek. Jika nama tersebut tidak valid sebagai nama gambar kontainer, Anda dapat menggantinya dengan menentukan ContainerRepository seperti yang ditunjukkan dalam file proyek berikut:

<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.3" />
  </ItemGroup>
</Project>

Untuk referensi lebih lanjut, lihat ContainerRepository.

Menerbitkan aplikasi .NET

Untuk menerbitkan aplikasi .NET sebagai kontainer, gunakan perintah dotnet publish berikut:

dotnet publish --os linux --arch x64 /t:PublishContainer

Perintah .NET CLI sebelumnya menerbitkan aplikasi sebagai kontainer:

  • Menargetkan Linux sebagai OS (--os linux).
  • Menentukan arsitektur x64 (--arch x64).

Penting

Untuk menerbitkan kontainer secara lokal, Anda harus memiliki daemon aktif yang mematuhi OCI yang berjalan. Jika tidak berjalan saat Anda mencoba menerbitkan aplikasi sebagai kontainer, Anda mengalami kesalahan yang mirip dengan yang berikut ini:

..\build\Microsoft.NET.Build.Containers.targets(66,9): error MSB4018:
   The "CreateNewImage" task failed unexpectedly. [..\Worker\DotNet.ContainerImage.csproj]

Perintah dotnet publish menghasilkan output yang mirip dengan contoh output:

Restore complete (0.2s)
  DotNet.ContainerImage succeeded (2.6s) β†’ bin\Release\net9.0\linux-x64\publish\

Secara default, perintah ini mengkompilasi aplikasi pekerja Anda ke folder publikasi dan mengunggah citra kontainer ke daemon Docker lokal Anda. Jika Anda menggunakan Podman, alias

Menerbitkan aplikasi .NET ke dalam file tarball

Tarball (atau file tar) adalah file yang berisi file lain. Biasanya berakhir dengan ekstensi file gabungan *.tar.gz untuk membantu menunjukkan bahwa ini adalah arsip terkompresi. Jenis file ini digunakan untuk mendistribusikan perangkat lunak atau untuk membuat cadangan. Dalam hal ini, tarball yang dibuat digunakan untuk mendistribusikan gambar kontainer.

Untuk menerbitkan aplikasi .NET sebagai kontainer ke tarball, gunakan perintah berikut:

dotnet publish --os linux --arch x64 \
    /t:PublishContainer \
    -p ContainerArchiveOutputPath=./images/container-image.tar.gz

Perintah sebelumnya menerbitkan aplikasi sebagai kontainer ke tarball:

  • Menargetkan Linux sebagai OS (--os linux).
  • Menentukan arsitektur x64 (--arch x64).
  • Mengatur properti ContainerArchiveOutputPath menjadi ./images/container-image.tar.gz.

Perintah ini tidak memerlukan daemon yang sesuai dengan OCI untuk berjalan. Untuk informasi selengkapnya, lihat ContainerArchiveOutputPath.

Muat Kemas Tarball

Kasus penggunaan yang umum untuk mengekspor ke tarball adalah untuk organisasi yang berfokus pada keamanan. Mereka membuat kontainer, mengekspornya sebagai tarball, dan kemudian menjalankan alat pemindaian keamanan di atas tarball. Pendekatan ini menyederhanakan kepatuhan karena menghindari kompleksitas pemindaian sistem langsung.

Tarball berisi seluruh kontainer, yang kemudian dapat dimuat menggunakan alat yang sesuai:

  • Docker: docker load -i ./images/container-image.tar.gz
  • Podman: podman load -i ./images/container-image.tar.gz

Menerbitkan aplikasi .NET ke registri kontainer

Registri kontainer adalah layanan yang menyimpan dan mengelola gambar kontainer. Mereka digunakan untuk menyimpan dan mendistribusikan gambar kontainer di beberapa lingkungan. Anda dapat menerbitkan aplikasi .NET sebagai kontainer ke registri kontainer dengan menggunakan perintah berikut:

dotnet publish --os linux --arch x64 \
    /t:PublishContainer \
    -p ContainerRegistry=ghcr.io

Kode sebelumnya menerbitkan aplikasi sebagai kontainer ke registri kontainer:

  • Menargetkan Linux sebagai OS (--os linux).
  • Menentukan arsitektur x64 (--arch x64).
  • Mengatur properti ContainerRegistry menjadi ghcr.io.

Untuk informasi selengkapnya, lihat ContainerRegistry.

Membersihkan sumber daya

Dalam artikel ini, Anda mengunggah pekerja .NET sebagai gambar kontainer. Jika mau, hapus sumber daya ini. Gunakan perintah docker images untuk melihat daftar gambar yang diinstal.

docker images

Pertimbangkan contoh output berikut:

REPOSITORY             TAG       IMAGE ID       CREATED          SIZE
dotnet-worker-image    1.0.0     25aeb97a2e21   12 seconds ago   191MB

Tip

File gambar bisa besar. Biasanya, Anda akan menghapus kontainer sementara yang Anda buat saat menguji dan mengembangkan aplikasi Anda. Anda biasanya menyimpan gambar dasar dengan runtime yang diinstal jika Anda berencana membangun gambar lain berdasarkan runtime tersebut.

Untuk menghapus gambar, salin ID gambar dan jalankan perintah docker image rm:

docker image rm 25aeb97a2e21

Langkah berikutnya