.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.İş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.Tü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/aspnetimage’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…