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
Prasyarat
Instal prasyarat berikut:
-
.NET 8+ SDK
Jika Anda telah menginstal .NET, gunakan perintahdotnet --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 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
menjadighcr.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