Her geliştirici, bir uygulamanın yerel olarak harika çalıştığı ancak farklı bir ortama taşındığında sorunlarla karşılaştığı “makinemde çalışır” savaşına aşinadır. Bu sorun her zaman aynı soruları gündeme getiriyor: Makinem ile hedef ortam arasındaki fark nedir? Bir ortam değişkeni eksik miydi? Farklı bir güvenlik yaması uygulandı mı? Başka bir zor sorun soruna neden oldu mu?

Docker’ı zaten kullanıyorsanız veya keşfetmeye başlıyorsanız, bunun uygulama oluşturmayı, göndermeyi ve çalıştırmayı basitleştirmek ve nihayetinde “makinemde çalışıyor” sorununu tamamen ortadan kaldırmak için güçlü bir araç olduğunu bilirsiniz.

Peki nasıl çalışır? Docker’ı ve Dockerfiles adlı bir şeyi kullanarak, kapsayıcıların çalışabileceği her yere dağıtılabilen özel görüntüler oluşturabilirsiniz. Docker görüntüleri, ortam değişkenleri ve güvenlik ayarlarından sunucunun ve çerçevenin gerçek sürümüne kadar uygulamanın başarılı bir şekilde çalışması için ihtiyaç duyduğu her şeyi içerir.

Dockerfiles’in faydaları

Dockerfiles konusunda yeniyseniz, bunları katmanlı bir pasta tarifine benzer olarak düşünebilirsiniz. Önce Docker’a kodunuz, çerçeveniz, sunucunuz, ayarlarınız, ortam değişkenleriniz ve yapılandırmanız gibi tüm “içerikleri” bir araya getirmesini söylersiniz. Daha sonra malzemeleri “pişirmek” için Docker’ı kullanırsınız ve bir görüntü çıkar. Buradan görüntü, yerel bir makine, şirket içi sunucu veya bulut gibi farklı konumlara aktarılabilir.

Microsoft, geliştirme veya üretim için kapsayıcıları kullanmaya başlamanıza yardımcı olabilecek birkaç ASP.NET Core görüntüsü (tüm malzemelerin dahil olduğu hazır kek tarifleri) sağlar. Bunları temel olarak alarak, özel bir görüntü oluşturmak için sağladıkları görüntüyü alabilir ve üzerine inşa edebilirsiniz. Önce Microsoft’un sağladığı bazı ASP.NET Core görüntülerine göz atarak bunu daha fazla inceleyelim.

Microsoft ASP.NET Core görüntülerine erişme

Microsoft ASP.NET Core görüntülerini kullanmaya başlamak için Docker Hub veya Microsoft’un Container Registry gibi bir kayıt defterinden çekmeniz gerekir. Daha önce de belirtildiği gibi, bu görüntüleri gerekli tüm malzemeleri içeren bir pasta tarifi olarak düşünebilirsiniz. Resminizin temeli olarak hizmet edecek ve ardından eklediğiniz tüm özel işlevler temel resmin üzerine çıkacaktır.

ASP.NET Core ile çalışıyorsanız normalde birlikte çalışacağınız iki farklı görüntü vardır:

  1. mcr.microsoft.com/dotnet/core/sdk: Bunu geliştirme ortamları için kullanacaksınız ve bunu ASP.NET Core’a sahip olmayan bir makinede çalıştırabilirsiniz. Örneğin, bir CI/CD sistemi kullanıyorsanız sunucuyu güncellemeniz gerekmez. Yeni SDK görüntüsünü kolayca çekebilir ve yapılarınızı bir kapsayıcı içinde yapabilirsiniz.
  2. mcr.microsoft.com/dotnet/core/aspnet: Bu, derlemeler yerine çalışma zamanı için yapılmış üretim sürümünüzdür. Daha küçük ve daha hızlıdır, bu da soğuk çalıştırma performansını artırır.

Docker Desktop’ı kurduktan ve çalıştırdıktan sonra, makinenize bir görüntü çekmek için aşağıdaki komutu kullanabilirsiniz:

docker pull mcr.microsoft.com/dotnet/core/sdk

docker pull mcr.microsoft.com/dotnet/core/aspnet

Geliştirme için özel bir Dockerfile oluşturma

Şimdi bu “tarifin” geri kalanını veya özel resmi oluşturma zamanı. SDK görüntüsünü makinenize çektikten sonra, bunu Dockerfile’ınızın temeli olarak kullanabilirsiniz. Dockerfile, talimatları içeren basit bir metin dosyasıdır. “Dockerfile” (uzantısız) olarak adlandırılabilir veya istenirse başka bir ad verilebilir. İşte normalde bir Dockerfile’de göreceğiniz ilk talimata bir örnek.

FROM mcr.microsoft.com/dotnet/core/sdk

FROM komutu, kullanılacak temel görüntüyü tanımlar. Daha sonra, gelecekte referans alındığında bunu kimin oluşturduğunu tanımlamak için bir yazar etiketi oluşturacaksınız.

Ayrıca ENV komutu ile uygulama tarafından kullanılacak ortam değişkenlerini de ekleyebilirsiniz. Docker varsayılan olarak ASP.NET Core ile 80 numaralı bağlantı noktasında çalışır, ancak bunu geçersiz kılabilirsiniz. Aşağıdaki örnekte kapsayıcıda çalışacak olan Kestrel sunucusu, 5000 numaralı bağlantı noktasını dinleyecek şekilde yapılandırılmaktadır. Diğer ortam değişkeni, bu durumda geliştirme olan sadece ortamımızı belirtmektir.

ENV ASPNETCORE_URLS=http://+:5000
ENV ASPNETCORE_ENVIRONMENT=”development”

Ardından, 5000 numaralı bağlantı noktasını gösterecek ve bir çalışma dizini oluşturacaksınız. Aşağıdaki örnek, oluşturulmuş bir dosya yolunu göstermektedir (istediğiniz herhangi bir geçerli yol olabilir), ancak kabın içinde bir klasör oluşturur.

Bu görüntüdeki son talimat, Kestrel sunucusunu başlatır. “-c” komut satırı bayrağı, NuGet paketlerini geri yükleyen ve ardından uygulamayı çalıştıran bir komutu çalıştırmak için kullanılır.

CMD [“/bin/bash”, “-c”, “dotnet restore && dotnet run”]

Dockerfile tamamlandıktan sonra görüntüyü oluşturmak için kullanılabilir. Bu, docker build komutu kullanılarak yapılır. Bu, kek karışımını (Dockerfile talimatları ve ilgili malzemeler) fırına koymaya benzer.

docker build -t my-dev-image-name .

Bu, görüntüyü oluşturacak ve onu artık çalışan bir kapsayıcı oluşturmak için kullanabileceğiniz yerel makinenize yerleştirecektir.

Bu resimde herhangi bir kod olmadığını fark edebilirsiniz. Şimdilik, çalışan kapsayıcıdan bir Docker birimi kullanılarak yerel makinemizdeki kaynak koduna bir “işaretçi” oluşturulduğunu varsayabilirsiniz. Bir kapsayıcıyı başlatırken birim tanımlamaya ilişkin bir örnek:

docker run -it -p 8080:5000 -v $(pwd):/app -w "/app" [my-custom-image-name]

Birimlerle ilgili tam bir tartışma bu makalenin kapsamı dışında olsa da, bir birim kapsayıcıdaki /app dizininden makinenizde bu komutun çalıştırıldığı dizine (örneğin, sunucunuzun bulunduğu dizine) bir tür “işaretçi” oluşturur. ASP.NET Core uygulaması yaşıyor).

Şuna dikkat edin: $(pwd) sözdizimi (Çalışma Dizini Yazdır) yalnızca Mac veya Linux’ta çalışır. Windows için sözdizimi, kullanılan komut penceresinin türüne göre değişir. Daha fazla ayrıntı için buraya gidin. Burada hacimler hakkında daha fazla bilgi edinebilirsiniz.

Üretim için özel bir Dockerfile oluşturma

Yerel olarak oluşturup çalıştırmayı tamamladığınızda, üretim ortamınız için bir Dockerfile oluşturmanız ve görüntüyü oluşturmanız gerekir. SDK’yı kullanmak istemezsiniz; bunun üretim için değil, yalnızca yapım ve geliştirme aşaması için olduğunu unutmayın. Bunun yerine, mcr.microsoft.com/dotnet/core/aspnet çalışma zamanı görüntüsünü kullanacaksınız.

Resmi oluşturmadan önce kodunuzu yayın modunda yayınlamanız gerekir. kullanabilirsiniz dotnet yayınla Bunu yapmak için komut. Bu komutu Visual Studio aracılığıyla manuel olarak çalıştırabilir veya hatta bir CI/CD sunucusu kullanarak otomatikleştirebilirsiniz.

dotnet publish “-c” Release -o dist

dotnet yayınlama komutunu çalıştırdıktan sonra, üretim Docker imajınızı oluşturabilirsiniz. Aşağıdaki Dockerfile’a bir göz atın:

FROM mcr.microsoft.com/dotnet/core/aspnet
LABEL author=”Name”

ENV ASPNETCORE_URLS=http://*:5000
ENV ASPNETCORE_ENVIRONMENT=”production”

EXPOSE    5000
WORKDIR /app
COPY        ./dist . 
ENTRYPOINT [“dotnet”, “Your-Project-Name.dll”]

Bu görüntü ile yapı görüntüsü arasındaki bazı farklılıklara dikkat edin. İlk olarak, bu üretim için olduğundan temel görüntü olarak sdk yerine aspnet kullanıyorsunuz. Ayrıca, yayınlama klasöründeki (dist) kodu çalışan kapsayıcıya kopyalıyorsunuz. Son olarak, Kestrel sunucusunu çalıştırmak için kullanılacak .dll’yi tanımlıyorsunuz.

Artık, bu görüntüyü Docker Hub gibi bir kayıt defterine veya özel bir kayıt defterine oluşturmak ve göndermek için docker build ve docker push gibi Docker komutlarını kullanabilirsiniz.

Çok aşamalı Dockerfiles oluşturma

Kodunuzu oluşturma, yayınlama ve bir üretim Docker görüntüsü oluşturma sürecini otomatikleştirmek isterseniz ne olur? İyi haber şu ki, “çok aşamalı Dockerfile” adı verilen bir şey oluşturarak bu adımlar için görüntüleri ve kapsayıcıları kullanabilirsiniz. Bu Dockerfile türü aşağıdaki faydaları sağlar:

  1. Ara görüntülerin manuel olarak oluşturulmasını önler
  2. Karmaşıklığı azaltır
  3. Artefaktları bir aşamadan diğerine seçici olarak kopyalar
  4. Son görüntü boyutunu en aza indirir

Çok aşamalı bir Dockerfile, geliştirme ve üretim talimatlarını tek bir Dockerfile’de birleştirir.

Stage 1: Define base image that will be used for production

FROM mcr.microsoft.com/dotnet/core/aspnet AS base
WORKDIR /app
EXPOSE 80


Stage 2: Build and publish the code

FROM mcr.microsoft.com/dotnet/core/sdk AS build
WORKDIR /app
COPY Angular_ASPNETCore_CustomersService.csproj .
RUN dotnet restore
COPY . .
RUN dotnet build -c Release

FROM build AS publish
RUN dotnet publish -c Release -o /publish


Stage 3: Build and publish the code

FROM base AS final
WORKDIR /app
COPY --from=publish /publish .
ENTRYPOINT ["dotnet", "App-Name.dll"]

Bu resimde daha önce görmediğimiz birkaç yeni şey var. Aşama 1, üretim için kullanılacak görüntüyü ayarlar (“taban” olarak adlandırılır). Aşama 2, bir SDK image (“build” olarak adlandırılır), proje kodumuzu bir çalışma dizinine kopyalar, NuGet paketlerini geri yükler, kodu oluşturur ve adlı bir dizine yayınlar. Yayınla. Aşama 3, yayınlama dizinini üretim görüntüsünün çalışma dizinine kopyalar ve kap çalıştığında çalıştırılacak dotnet komutunu tanımlar.

İlk başta iki farklı görüntü olan şey, şimdi çok aşamalı Dockerfile kullanılarak tek bir görüntüde birleştirildi. Sonuç, kapsayıcıyı makinenizde, bir sunucuda veya bulutta çalıştırmak için kullanılabilecek bir üretim görüntüsüdür.

Bu makalede, kapsayıcı olarak çalıştırılabilen özel ASP.NET Core Docker görüntüleri oluşturmaya nasıl başlayacağınızı öğrendiniz. Özel bir görüntü oluşturmak için önce bir Dockerfile’a talimatlar ekleyerek başlayın. Talimatlar, temel görüntüyü, ortam değişkenlerini, dahil edilmesi gereken kodu, yapılandırmayı, kullanılacak çerçeveleri ve daha fazlasını tanımlamak için kullanılır. Talimatlar tamamlandıktan sonra, görüntüyü oluşturmak için docker build komutu kullanılır. Oradan, görüntü bir kapsayıcı kayıt defterine itilebilir ve kapsayıcı olarak çalıştırılmak üzere bir sunucuya çekilebilir.

Kodu oluşturma, yayınlama ve Docker görüntüsünü oluşturma sürecini otomatikleştirmek istediğiniz durumlarda, çok aşamalı Docker dosyaları kullanılabilir. Birden çok adımın birleştirilmesi ve daha küçük bir son görüntü boyutu dahil olmak üzere çeşitli faydaları vardır.

ASP.NET Core kapsayıcıları oluşturmaya ilişkin daha ayrıntılı talimatlar ve ipuçları için Dan’in burada aynı konuyla ilgili ücretsiz isteğe bağlı web seminerini izleyin veya Pluralsight’ta Web Geliştiricileri için Docker kursunu izleyin.

Yazar hakkında

Dan Wahlin, JavaScript, Angular, Node.js, C#, ASP.NET MVC, Web API ve Docker konularında danışmanlık ve eğitim hizmetleri sunan Wahlin Consulting’i kurdu. Google GDE, Microsoft MVP ve Bölge Direktörüdür ve dünya çapındaki konferanslarda ve kullanıcı gruplarında konuşur.