Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

.NET’te Built-In Container Desteği – .NET Uygulamalarını Dockerfile Dosyası Olmaksızın Dockerize Etme

Merhaba,

Bu içeriğimizde .NET 7 ve üzeri sürümleri için gelmiş olan Dockerfile dosyasına gerek duyulmaksızın uygulamayı dockerize etme özelliğini ele alacak ve biryandan da built-in container desteği hakkında incelemede bulunuyor olacağız.

Evet… Microsoft, .NET 7 SDK’sinden itibaren uygulamaların dockerize edilebilmesi için ihtiyaç duyulan Dockerfile dosyasına olan bağımlılığı ortadan kaldırarak tamamen yeni bir yaklaşım sergilemekte ve böylece uygulamaların devops süreçlerinde ekstradan bakım gerektiren bir dosyasının varlığından süreci törpüleyerek çalışma yoğunluğunu sadeleştirmektedir. Haliyle bu yaklaşım sayesinde uygulamanın dockerize edilme süreci daha da basitleştirilerek, kolay hale getirilmiş olmaktadır.

Bu yaklaşımın temel fikri; geliştirilen yazılım uygulamalarının pek çoğunda, geliştiricilerin, uygulamanın dockerize edilebilmesi için uzun uzadıya Dockerfile dosyasıyla haşır neşir olmasına ve buna büyük enerji sarf etmesi durumuna dayanmaktadır. Bu duruma karşın .NET 7’den sonra, built-in olarak gelen docker image oluşturabilme ve deploy edebilme yeteneklerini .NET CLI aracı sayesinde gerçekleştirebilmekte ve süreci daha da efektif bir şekilde yönetilebilir kılmaktayız.

Şimdi bizler bir .NET uygulamasının Dockerfile dosyasıyla nasıl dockerize edildiğini hatırlayarak, paralelinde Dockerfile dosyası olmaksızın bu işlemin nasıl yapılabileceğini ele alacak ve mukayeseli bir şekilde değerlendirmede bulunuyor olacağız. O halde buyurun başlayalım…

İlk olarak aşağıdaki endpoint’e sahip bir Asp.NET Core WEB API uygulaması geliştirelim;

var builder = WebApplication.CreateBuilder(args);

var app = builder.Build();

app.MapGet("/", () => "Merhaba Dünya");

app.Run();

Ardından bu uygulamayı dockerize edebilmek için aşağıdaki içeriğe sahip bir Dockerfile dosyası oluşturalım.

FROM mcr.microsoft.com/dotnet/sdk:8.0 as build
WORKDIR /src
COPY *.csproj .
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /publish

FROM mcr.microsoft.com/dotnet/aspnet:8.0 as runtime
WORKDIR /publish
COPY --from=build /publish .
ENV ASPNETCORE_URLS=http://+:5000
EXPOSE 5000
ENTRYPOINT ["dotnet", "Docker.Example.dll"]

Artık Dockerfile dosyası hazır olduğuna göre docker build -t docker-example . talimatı eşliğinde bir image oluşturalım.

Bu işlem sonrasında da artık oluşturulmuş olan bu image’dan docker run -p 5000:5000 --name docker-example-container docker-example talimatı eşliğinde de bir container oluşturalım.

Vee http://localhost:5000/ adresine istekte bulunalım..NET'te Built-In Container Desteği - .NET Uygulamalarını Dockerfile Dosyası Olmaksızın Dockerize Etmeİşte bu kadar 🙂

Docker teknolojisi, Dockerfile dosyası ve container yapılandırmasıyla ilgili detaylı bilgi edinmek istiyorsanız .NET Core & Docker Yazı Dizisi başlıklı yazı serisine göz atabilirsiniz.

Peki hoca, burada zor ve karışık olan ne ki? diye sorduğunuzu duyar gibiyim… Evet, görüldüğü üzere zor olan bir durum yok. En sade haliyle bir .NET uygulamasını dockerize ederken bu yolu tercih ediyoruz. Amma velakin uygulamanın gereksinimleri ve projenin karmaşıklığı arttıkça bu Dockerfile dosyasının içeriği de artacaktır. Haliyle ister istemez bu dosya açısından bir bakım maliyeti söz konusu olacaktır. İşte bu tarz durumlara karşın Microsoft, .NET’te dockerize süreçlerinde Dockerfile dosyasına ihtiyaç duyulmaksızın container desteğini getirmiş bulunmaktadır.

Bu destek ile kelimenin tam anlamıyla tek talimatla docker image’i oluşturabilmekte ve o image’den container ayağa kaldırabilmekteyiz. Image’i oluşturabilmek için aşağıdaki talimatın verilmesi yeterli olacaktır.
dotnet publish --os linux --arch x64 -p:PublishProfile=DefaultContainer -p:ContainerImageName=docker-example
Bu talimat size çok kompleks geldiyse eğer .csproj dosyasında aşağıdaki gibi ContainerImageName, PublishProfile ve ContainerImageTags özelliklerini ekleyebilir ve talimatı sadeleştirme yaklaşımı sergileyebilirsiniz.

<Project Sdk="Microsoft.NET.Sdk.Web">
	<PropertyGroup>
		.
		.
		.
		<ContainerImageName>docker-example-container</ContainerImageName>
		<PublishProfile>DefaultContainer</PublishProfile>
		<ContainerImageTags>1.1.0;latest</ContainerImageTags>
	</PropertyGroup>
	<ItemGroup>
		.
		.
		.
	</ItemGroup>
</Project>

Haliyle bu vaziyette talimatı aşağıdaki gibi vermeniz yeterli olacaktır.
dotnet publish --os linux --arch x64
Hatta biryandan da aşağıdaki gibi RuntimeIdentifier özelliğini de ekleyerek talimatı daha da sadeleştirebilirsiniz.

		<ContainerImageName>docker-example-container</ContainerImageName>
		<PublishProfile>DefaultContainer</PublishProfile>
		<ContainerImageTags>1.1.0;latest</ContainerImageTags>
		<RuntimeIdentifier>linux-x64</RuntimeIdentifier>

dotnet publish
Bu işlem neticesinde docker’da image’lerinizi kontrol ederseniz eğer verdiğiniz isimde bir image’in oluşturulduğunu görebilirsiniz..NET'te Built-In Container Desteği - .NET Uygulamalarını Dockerfile Dosyası Olmaksızın Dockerize EtmeTüm bunların dışında oluşturulacak image’i aşağıda açıklaması verilmiş olan özellikler sayesinde de özelleştirebilirsiniz.

  • ContainerBaseImage
    Bu özellik sayesinde .NET uygulamalarını build edebilmek için kullanılan base image’in denetlenmesini sağlamaktadır. Varsayılan SDK olarak mcr.microsoft.com/dotnet/aspnet image’i kullanılmaktadır.
  • ContainerImageName
    Image adının değiştirilmesini sağlar.
  • ContainerPort
    Container portunun belirtilmesini sağlar.

Ayrıca aşağıdaki gibi ContainerEnvironmentVariable özelliği sayesinde environment variable tanımlayabilirsiniz.

<Project Sdk="Microsoft.NET.Sdk.Web">
	.
	.
	.
	<ItemGroup>
		<ContainerEnvironmentVariable Include="Example_Environment_Variable" Value="Trace" />
	</ItemGroup>
</Project>

Nihai olarak,
.NET mimarisi, uygulamalarımızın docker image’lerini oluştururken standart Dockerfile yaklaşımlarından ziyade Dockerfile dosyasına ihtiyaç duymaksızın oldukça kolay ve esnek bir şekilde image’larımızı oluşturmamıza ve hızımıza hız katmamıza odaklanmış ve kanaatim odur ki bunda büyük bir fark yaratmıştır 🙂

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir