Asp.NET Core Uygulamasını Dockerize Etmek

Merhaba,

.NET Core & Docker yazı dizimizin bu içeriğinde sıra herhangi bir Asp.NET Core uygulamasının nasıl dockerize edilebildiğini adım adım incelemeye geldi. Esasında yazı serisindeki önceki makalelerimizde bir uygulamanın dockerize edilebilmesi için neler yapılması gerektiğinin büyük çoğunluğunu incelediğimizden dolayı bu içeriğimizde hiç zorluk yaşamadan ilerleyebilecek ve tabi ki yer yer ekstra yeni bilgiler serpiştirerek bilgi haznemizi genişleteceğiz.

İlk olarak hali hazırda bir Asp.NET Core uygulaması oluşturduğumuzu varsayalım. Şahsen ben pratik için bir Asp.NET Core MVC mimarisi seçtiğimi ifade ederim. Bu konuda opsiyonel olunabileceğinden dolayı siz istediğiniz bir mimariyi ayağa kaldırıp eşlik edebilirsiniz.

Şimdi tüm süreci adım adım beraber inceleyelim;

  • Adım 1 Uygulamayı release etme
    Bir web uygulamasını release ederek Docker containerında ayağa kaldırabilirsiniz. Lakin bu sürekli geliştirilmek ve test edilmek zorunda kalan web uygulamaları için sadece sunum amaçlı bir kullanım olacağından dolayı pekte kullanışlı bir tercih olmayacaktır. O yüzden biz bu içeriğimizde publish’i docker seviyesinde yapmayı planlayacağız. Bunun için release aşamasını ilk olarak es geçip ilerideki adımlarımızda neden es geçtiğimizi ve docker seviyesinde nasıl gerçekleştirmemiz gerektiğini daha net anlamış olacağız.
  • Adım 2 Dockerfile dosyası oluşturma
    Şimdi herşeyden önce web uygulamamızın ortamını düzenleyeceğimiz talimatları barındıracak olan Dockerfile dosyasını oluşturmalıyız. Bu dosyayı oluşturabilmek için sırasıyla ‘Projeye Sağ Tık’ -> ‘Add’ -> ‘Docker Support…’ kombinasyonunu uygulayınız.

    Bu işlemden sonra oluşturulacak Dockerfile dosyasının içerisine aşağıdaki talimatları giriniz.

    FROM mcr.microsoft.com/dotnet/core/sdk:3.1
    WORKDIR /app
    COPY . .
    RUN dotnet restore
    RUN dotnet publish DockerizeWebExample.csproj -c Release -o out
    WORKDIR out
    ENV ASPNETCORE_URLS="http://*:1453"
    ENTRYPOINT ["dotnet", "DockerizeWebExample.dll"]
    

    Talimatları incelersek eğer;

    • 1. Talimat
      Docker Hub’dan .NET Core SDK imajını çekiyoruz. Peki hoca neden Runtime değilde SDK imajını çekiyorsun? sorunuzu duyar gibiyim 🙂 Evet, normalde Asp.NET Core Runtime imajını çekmemiz sunum açısından daha az maliyetli olacaktır. Lakin geliştirme sürecindeki uygulamalarda DOTNET CLI kullanılarak üzerinde canlı işlemler yapabilmek için bizler Docker içerisinde Runtime yerine SDK’yı yüklemeyi tercih edebilir ve böylece Docker içerisinde gerekli dotnet cli komutlarını kullanabilmenin yolunu açmış oluruz. Dolayısıyla her yeni bir işlem neticesinde uygulamayı publish edip tekrar tekrar imaj haline getirip ayağa kaldırmaktansa, docker içerisinde bu işlemi yapabilmek zaman ve maliyet açısından oldukça verimli olacaktır.

    • 2. Talimat
      Docker içerisinde uygulamamıza ‘/app’ adında bir klasör açıyoruz ve içerisine giriyoruz.

    • 3. Talimat
      Eğer ki SDK yerine Runtime yüklemiş olsaydık bu talimat COPY /bin/Release/netcoreapp3.1/publish /app şeklinde sadece publish dosyalarını kopyalaması gerektiğini ifade edecek biçimde olacaktı. Lakin burada SDK yüklediğimizden dolayı uygulama üzerinde dotnet cli ile işlem yapabilmemiz için bize sadece publish edilmiş dosyalardan ziyade derlenmemiş dosyalarda lazım olacaktır. Dolayısıyla bu talimatta; birinci nokta ile Dockerfile dosyasının bulunduğu dizindeki(yani projenin ana dizini) tüm dosyaları, ikinci noktadaki dizine(yani WORKDIR ile oluşturup içerisine girdiğimiz /app dizinine) kopyalamasını söylemiş oluyoruz.

    • 4. Talimat
      Artık SDK yüklü olduğunda dolayı RUN komutuyla dotnet cli komutlarımızı çalıştırabiliriz. Dolayısıyla ‘dotnet restore’ komutu eşliğinde uygulamayı tekrar restore ederek tüm kütüphanelerin yüklenmesini sağlıyoruz.

    • 5. Talimat
      Şimdide sıra uygulamayı publish etmeye geldi. Hatırlarsanız eğer 1. adımda uygulamayı publish etmeksizin direkt olarak Dockerfile dosyasının tasarlanmasından başlamıştık. İşte artık publish’i bu adımda yani Dockerfile içerisindeki talimat ile docker seviyesinde gerçekleştirmekteyiz. dotnet cli komutu olan ‘dotnet publish’ ile uygulamanın ‘.csproj’ dosyasını publish edeceğini bildiriyoruz. Bilmeyenler için söylemekte fayda var ki; Asp.NET Core uygulamalarındaki ‘.csproj’ uzantılı dosya o uygulamaya özel tüm bilgilerle birlikte kullanıldığı kütüphanelerin bilgilerinin tutulduğu özel bir dosyadır. Dolayısıyla nelerin çıktısını alacağımız konusunda en iyi bilgiyi bize ‘.csproj’ dosyası vermektedir. O yüzden publish esnasında ilgili dosya belirtilmekte ve -c parametresi ile release modda çıktı üretilmesi gerektiği bildirilmektedir. Ayrıca -o parametresi ile publish dosyalarının, içerisinde bulunduğumuz ‘/app’ dizininin içerisine oluşturulacak olan ‘out’ isminde bir klasöre atılması gerektiğini bildirmekteyiz.

    • 6. Talimat
      5. talimatta publish neticesinde üretilen çıktıları koyduğumuz ‘out’ dizinine giriyoruz.

    • 7. Talimat
      Container içerisinde çalıştırılan uygulama 5000 portunda ayağa kaldırılacaktır. Neden 5000? SDK’da ki environmentta default tanımından dolayı… Eğer ki Runtime imageinde çalışıyor olsaydık 80 portunda ayağa kalkacaktı. Containerı başlı başına bir işletim sistemi gibi düşünürsek eğer o işletim sisteminin localinde açılan bir porta bizlerin dışarıdan erişememiz kadar doğal bir durum olmasa gerek. Dolayısıyla bizlerin bu container içerisindeki uygulamaya dışarıdan erişebilmemiz için containerdaki localhost’da çalıştırmamamız gerekmekte ve bunun için bir IP adresi ayarlamamız gerekmektedir.

      SDK içerisindeki environmentın adı ‘ASPNETCORE_URLS’ dır. Bu default olarak 5000 şeklinde ayarlandığı için container içerisinde 5000 portunda uygulama ayağa kaldırılmaktadır. Bizler bu default değeri ezerek 1453 portunda(tabi ki de opsiyonel) ayağa kalkmasını söylüyoruz.

    • 8. Talimat
      Ve son olarak containerın hangi dll dosyasını çalıştıracağını belirtiyoruz.
  • Adım 3 Image oluşturma
    Şimdi sıra tasarlanan bu Dockerfile dosyası üzerinden bir image oluşturmaya geldi. Bunun için uygulama dizinini Powershell ya da Komut İstemi uygulamasıyla açınız ve aşağıdaki komutla build ediniz.
    docker build -t webuygulamasi:v1 .
    Asp.NET Core Uygulamasını Dockerize Etmek

    Görüldüğü üzere 8 katmanlı bir image oluşturulmuştur.

  • Adım 4 Container oluşturma ve ayağa kaldırma
    Oluşturulan image nesnesi üzerinden uygulamamızı barındıracak olan bir container oluşturalım ve bunu ayağa kaldıralım.
    docker run -p 1071:1453 --name cont1 webuygulamasi

    Yukarıdaki komutu incelersek eğer -p parametresi ile containerdaki 1453 portunda ayağa kaldırılan uygulamayı bizdeki 1071 portuna atayarak erişim için port ayarlaması gerçekleştiriyoruz.
    Asp.NET Core Uygulamasını Dockerize Etmek

    Ve bu işlem neticesinde localhost:1071 adresine girdiğimizde container üzerinden ayağa kaldırılan uygulamamıza belirttiğimiz port üzerinden erişmiş olacağız.
    Asp.NET Core Uygulamasını Dockerize Etmek

Ne kadar güzel değil mi? 🙂

Nihai olarak; Dockerın, büyük performans ve verimlilikle oldukça düşük maliyette uygulamalarımızı sanallaştırmamızı sağlayan harika bir platform olduğuna şahit olduk.

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

Bunlar da hoşunuza gidebilir...

2 Cevaplar

  1. Gençay dedi ki:

    Sevgili okurların dikkatine;

    Docker’da çok katmanlı mimari ile geliştirilmiş bir Asp.NET Core uygulamasının nasıl Dockerize edildiğini merak ediyorsanız eğer aşağıdaki örnek talimatları inceleyebilirsiniz.

    N-Tier Architecture ile geliştirilen uygulamanın Dockerize edilebilmesi için Dockerfile dosyasının solution dizininde oluşturulmasına özen gösteriniz. Ardından aşağıdaki talimatlara benzer nitelikte içeriğini oluşturabilirsiniz;

    FROM mcr.microsoft.com/dotnet/core/sdk:3.1 as sdkimage
    WORKDIR /app
    #Tüm katmanların .csproj dosyalarını uygun dizinlere tek tek kopyalıyoruz.
    COPY ./BL/*.csproj ./BL/
    COPY ./DAL/*.csproj ./DAL/
    COPY ./Service/*.csproj ./Service/
    COPY ./WebApplication/*.csproj ./WebApplication/
    #Solution dosyasınıda kopyalıyoruz.
    COPY ./*.sln .
    RUN dotnet restore
    #Kütüphaneleri restore ettikten sonra geriye kalan ne var ne yok kopyalıyoruz.
    COPY . .
    #Sadece web uygulamasını/katmanını publish ediyoruz.
    RUN dotnet publish ./WebApplication/*.csproj -o /publish/
    #Runtime yüklüyoruz.
    FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
    WORKDIR /app
    COPY --from=sdkimage /publish .
    ENV ASPNETCORE_URLS="http://*:1455"
    ENTRYPOINT ["dotnet", "WebApplication.dll"]
    

    Kolay gelsin…

  1. 27 Mart 2020

    […] Asp.NET Core Uygulamasını Dockerize Etmek […]

Bir cevap yazın

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

*