Docker uygulamaları için geliştirme iş akışı

İpucu

Bu içerik, .NET Docs'ta veya çevrimdışı olarak okunabilen ücretsiz indirilebilir bir PDF olarak sağlanan Kapsayıcılı .NET Uygulamaları için .NET Mikro Hizmet Mimarisi e-Kitabı'ndan bir alıntıdır.

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

Uygulama geliştirme yaşam döngüsü, tercih ettiğiniz dili kullanarak uygulamayı kodladığınız ve yerel olarak test ettiğiniz bir geliştirici olarak bilgisayarınızda başlar. Bu iş akışında hangi dili, çerçeveyi ve platformu seçerseniz seçin, Docker kapsayıcılarını her zaman geliştirir ve test eder, ancak bunu yerel olarak yaparsınız.

Her kapsayıcı (Docker görüntüsünün bir örneği) aşağıdaki bileşenleri içerir:

  • Linux dağıtımı, Windows Nano Sunucu veya Windows Server Core gibi bir işletim sistemi seçimi.

  • Geliştirme sırasında eklenen dosyalar, örneğin kaynak kodu ve uygulama ikili dosyaları.

  • Ortam ayarları ve bağımlılıklar gibi yapılandırma bilgileri.

Docker kapsayıcı tabanlı uygulamalar geliştirmeye yönelik iş akışı

Bu bölümde Docker kapsayıcı tabanlı uygulamalar için iç döngü geliştirme iş akışı açıklanmaktadır. İç döngü iş akışı, en fazla üretim dağıtımı içerebilen ve yalnızca geliştiricinin bilgisayarında yapılan geliştirme çalışmalarına odaklanan daha geniş DevOps iş akışını dikkate almadığı anlamına gelir. Ortamı ayarlamaya yönelik ilk adımlar dahil değildir, çünkü bu adımlar yalnızca bir kez yapılır.

Bir uygulama kendi hizmetlerinizin yanı sıra ek kitaplıklardan (bağımlılıklar) oluşur. Şekil 5-1'de gösterildiği gibi, bir Docker uygulaması oluştururken genellikle uyguladığınız temel adımlar aşağıdadır.

Diagram showing the seven steps it takes to create a containerized app.

Docker uygulamaları için geliştirme süreci: 1 - Uygulamanızı kodlayın, 2 - Dockerfile/s yazma, 3 - Dockerfile/s'de tanımlanan görüntüler oluşturma, 4 - (isteğe bağlı) docker-compose.yml dosyasında hizmet oluşturma, 5 - Kapsayıcı veya docker-compose uygulamasını çalıştırma, 6 - Uygulamanızı veya mikro hizmetleri test etme, 7 - Depoya gönderme ve yineleme.

Şekil 5-1. Docker kapsayıcılı uygulamaları geliştirmek için adım adım iş akışı

Bu bölümde, bu işlemin tamamı ayrıntılı bir şekilde anlatılır ve her önemli adım bir Visual Studio ortamına odaklanılarak açıklanır.

Düzenleyici/CLI geliştirme yaklaşımı (örneğin, macOS veya Windows'da Visual Studio Code artı Docker CLI) kullanırken, her adımı bilmeniz gerekir; genellikle Visual Studio'yu kullanıp kullanmadığınızdan daha ayrıntılı olarak. CLI ortamında çalışma hakkında daha fazla bilgi için bkz. Microsoft Platformları ve Araçları ile Kapsayıcılı Docker Uygulaması yaşam döngüsü e-kitabı.

Visual Studio 2022'yi kullanırken, bu adımların çoğu sizin için işlenir ve bu da üretkenliğinizi önemli ölçüde artırır. Bu durum özellikle Visual Studio 2022 kullanırken ve çok kapsayıcılı uygulamaları hedeflediğinizde geçerlidir. Örneğin, tek bir fare tıklamasıyla Visual Studio, uygulamanızın Dockerfile yapılandırmasıyla ve docker-compose.yml dosyasını projelerinize ekler. Uygulamayı Visual Studio'da çalıştırdığınızda Docker görüntüsünü oluşturur ve çok kapsayıcılı uygulamayı doğrudan Docker'da çalıştırır; aynı anda birkaç kapsayıcıda hata ayıklamanıza bile olanak tanır. Bu özellikler geliştirme hızınızı artırır.

Ancak Visual Studio'nun bu adımları otomatik hale getirmesi, Docker'ın altında neler olduğunu bilmeniz gerekmeyecek anlamına gelmez. Bu nedenle, aşağıdaki kılavuzda her adım ayrıntılı olarak verilmiştir.

Image for Step 1.

1. Adım. Kodlamaya başlayın ve ilk uygulamanızı veya hizmet temelinizi oluşturun

Docker uygulaması geliştirmek, Docker olmadan uygulama geliştirme yönteminize benzer. Aradaki fark, Docker için geliştirme yaparken yerel ortamınızdaki Docker kapsayıcıları içinde çalışan uygulamanızı veya hizmetlerinizi (Docker tarafından bir Linux VM kurulumu veya Windows Kapsayıcıları kullanılıyorsa doğrudan Windows) test ediyor olmanızdır.

Visual Studio ile yerel ortamınızı ayarlama

Başlamak için, aşağıdaki yönergelerde açıklandığı gibi Windows için Windows için Docker Desktop'ın yüklü olduğundan emin olun:

Windows için Docker Desktop'ı kullanmaya başlama

Ayrıca, Şekil 5-2'de gösterildiği gibi .ASP.NET ve web geliştirme iş yükü yüklü visual studio 2022 sürüm 17.0 gerekir.

Screenshot of the .NET Core cross-platform development selection.

Şekil 5-2. Visual Studio 2022 kurulumu sırasında ASP.NET ve web geliştirme iş yükünü seçme

Uygulamanızda Docker'ı etkinleştirmeden, Docker'ı dağıtmadan ve Docker'da test etmeden önce uygulamanızı düz .NET'te (genellikle .NET Core'da veya kapsayıcıları kullanmayı planlıyorsanız daha sonra) kodlamaya başlayabilirsiniz. Ancak, docker üzerinde en kısa sürede çalışmaya başlamanız önerilir, çünkü bu gerçek ortam olacaktır ve tüm sorunlar en kısa sürede bulunabilir. Visual Studio, Docker ile çalışmayı o kadar kolay hale getirdiğinden, visual studio'dan çok kapsayıcılı uygulamalarda hata ayıklarken en iyi örnek olan saydamlık hissi verir.

Ek kaynaklar

Image for Step 2.

Oluşturmak istediğiniz her özel görüntü için bir Dockerfile gerekir; Visual Studio'dan otomatik olarak veya Docker CLI'yi (docker çalıştırma ve docker-compose komutları) kullanarak el ile dağıtmanız fark etmeksizin her kapsayıcı için bir Dockerfile'a da ihtiyacınız vardır. Uygulamanız tek bir özel hizmet içeriyorsa, tek bir Dockerfile gerekir. Uygulamanız birden çok hizmet içeriyorsa (mikro hizmetler mimarisinde olduğu gibi), her hizmet için bir Dockerfile gerekir.

Dockerfile, uygulamanızın veya hizmetinizin kök klasörüne yerleştirilir. Docker'a uygulamanızı veya hizmetinizi bir kapsayıcıda nasıl ayarlayıp çalıştıracaklarını belirten komutları içerir. Kodda el ile bir Dockerfile oluşturabilir ve bunu .NET bağımlılıklarınızla birlikte projenize ekleyebilirsiniz.

Visual Studio ve Docker araçlarıyla bu görev yalnızca birkaç fare tıklaması gerektirir. Visual Studio 2022'de yeni bir proje oluşturduğunuzda, Şekil 5-3'te gösterildiği gibi Docker Desteğini Etkinleştir adlı bir seçenek vardır.

Screenshot showing Enable Docker Support check box.

Şekil 5-3. Visual Studio 2022'de yeni bir ASP.NET Core projesi oluştururken Docker Desteği'ni etkinleştirme

Docker desteğini, Şekil 5-4'te gösterildiği gibi Çözüm Gezgini'da projeye sağ tıklayıp Docker Desteği Ekle>...'yi seçerek mevcut bir ASP.NET Core web uygulaması projesinde de etkinleştirebilirsiniz.

Screenshot showing the Docker Support option in the Add menu.

Şekil 5-4. Mevcut bir Visual Studio 2022 projesinde Docker desteğini etkinleştirme

Bu eylem, gerekli yapılandırmayla projeye bir Dockerfile ekler ve yalnızca ASP.NET Core projelerinde kullanılabilir.

Benzer şekilde Visual Studio, Kapsayıcı Düzenleyici Desteği Ekle>...seçeneğiyle çözümün tamamı için bir docker-compose.yml dosya da ekleyebilir. 4. adımda bu seçeneği daha ayrıntılı bir şekilde inceleyeceğiz.

Mevcut resmi bir .NET Docker görüntüsünü kullanma

Kapsayıcınız için genellikle Docker Hub kayıt defteri gibi resmi bir depodan edindiğiniz temel görüntünün üzerine özel bir görüntü oluşturursunuz. Visual Studio'da Docker desteğini etkinleştirdiğinizde tam olarak bu olur. Dockerfile'ınız var olan dotnet/core/aspnet bir görüntüyü kullanır.

Daha önce, seçtiğiniz çerçeveye ve işletim sistemine bağlı olarak hangi Docker görüntülerini ve depolarını kullanabileceğinizi açıkladık. Örneğin, ASP.NET Core (Linux veya Windows) kullanmak istiyorsanız, kullanılacak görüntü olur mcr.microsoft.com/dotnet/aspnet:8.0. Bu nedenle, kapsayıcınız için hangi temel Docker görüntüsünü kullanacağınızı belirtmeniz yeterlidir. Bunu, Dockerfile'ınıza ekleyerek FROM mcr.microsoft.com/dotnet/aspnet:8.0 yaparsınız. Bu işlem Visual Studio tarafından otomatik olarak gerçekleştirilir, ancak sürümü güncelleştirirseniz bu değeri güncelleştirirsiniz.

Docker Hub'dan bir sürüm numarasıyla resmi bir .NET görüntü deposu kullanmak, aynı dil özelliklerinin tüm makinelerde (geliştirme, test ve üretim dahil) kullanılabilir olmasını sağlar.

Aşağıdaki örnekte, ASP.NET Core kapsayıcısı için örnek bir Dockerfile gösterilmektedir.

FROM mcr.microsoft.com/dotnet/aspnet:8.0
ARG source
WORKDIR /app
EXPOSE 80
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["dotnet", " MySingleContainerWebApp.dll "]

Bu durumda görüntü, resmi ASP.NET Core Docker görüntüsünün (Linux ve Windows için çok kemerli) 8.0 sürümünü temel alır. Ayarı budur FROM mcr.microsoft.com/dotnet/aspnet:8.0. (Bu temel görüntü hakkında daha fazla bilgi için ASP.NET Core Docker Görüntüsü sayfasına bakın.) Dockerfile'da, Docker'a çalışma zamanında kullanacağınız TCP bağlantı noktasını dinlemesini de bildirmelisiniz (bu örnekte, EXPOSE ayarıyla yapılandırıldığı gibi 80 numaralı bağlantı noktası).

Kullandığınız dile ve çerçeveye bağlı olarak Dockerfile'da ek yapılandırma ayarları belirtebilirsiniz. Örneğin, ile ["dotnet", "MySingleContainerWebApp.dll"] ENTRYPOINT satırı Docker'a bir .NET uygulaması çalıştırmasını söyler. .NET uygulamasını derlemek ve çalıştırmak için SDK ve .NET CLI (dotnet CLI) kullanıyorsanız, bu ayar farklı olabilir. Alt çizgi, ENTRYPOINT satırının ve diğer ayarların uygulamanız için seçtiğiniz dile ve platforma bağlı olarak farklı olmasıdır.

Ek kaynaklar

Çok kemerli görüntü depolarını kullanma

Tek bir depo, Linux görüntüsü ve Windows görüntüsü gibi platform varyantları içerebilir. Bu özellik, Microsoft gibi satıcıların (temel görüntü oluşturucuları) birden çok platformu (Linux ve Windows) kapsayacak şekilde tek bir depo oluşturmasına olanak tanır. Örneğin, Docker Hub kayıt defterinde bulunan .NET deposu aynı depo adını kullanarak Linux ve Windows Nano Server için destek sağlar.

Bir etiket belirtirseniz, aşağıdaki durumlarda olduğu gibi açık bir platformu hedefleme:

  • mcr.microsoft.com/dotnet/aspnet:8.0-bullseye-slim
    Hedefler: Linux'ta yalnızca .NET 8 çalışma zamanı

  • mcr.microsoft.com/dotnet/aspnet:8.0-nanoserver-ltsc2022
    Hedefler: Windows Nano Sunucu'da yalnızca .NET 8 çalışma zamanı

Ancak, aynı etiketle bile aynı görüntü adını belirtirseniz, aşağıdaki örnekte gösterildiği gibi çok kemerli görüntüler (görüntü gibi aspnet ) dağıttığınız Docker ana bilgisayar işletim sistemine bağlı olarak Linux veya Windows sürümünü kullanır:

  • mcr.microsoft.com/dotnet/aspnet:8.0
    Çoklu kemer: Docker ana bilgisayar işletim sistemine bağlı olarak Linux veya Windows Nano Server'da yalnızca .NET 8 çalışma zamanı

Bu şekilde, bir Windows konağından bir görüntü çektiğiniz zaman, bu görüntü Windows değişkenini çeker ve bir Linux konağından aynı görüntü adını çeker ve Linux değişkenini çeker.

Dockerfile'da çok aşamalı derlemeler

Dockerfile, toplu iş betiğine benzer. Makineyi komut satırından ayarlamanız gerekirse yaptığınıza benzer.

İlk bağlamı ayarlayan bir temel görüntüyle başlar. Bu, ana bilgisayar işletim sisteminin en üstünde yer alan başlangıç dosya sistemi gibidir. Bu bir işletim sistemi değildir, ancak kapsayıcının içindeki "the" işletim sistemi gibi düşünebilirsiniz.

Her komut satırının yürütülmesi, dosya sisteminde öncekinden gelen değişikliklerle yeni bir katman oluşturur, böylece birleştirildiğinde sonuçta elde edilen dosya sistemini oluşturur.

Her yeni katman öncekinin üzerine "dayandığından" ve sonuçta elde edilen görüntü boyutu her komutla arttığından, örneğin bir uygulama derlemek ve yayımlamak için gereken SDK'yı dahil etmek zorundaysa görüntüler çok büyük olabilir.

Burası, çok aşamalı derlemelerin sihrini yapmak için çizime (Docker 17.05 ve üzeri sürümlerden) girdiği yerdir.

Asıl fikir, Dockerfile yürütme işlemini aşamalar halinde ayırabilmenizdir. Burada aşama, bir veya daha fazla komutun ardından gelen ilk görüntüdür ve son aşama son görüntü boyutunu belirler.

Kısacası, çok aşamalı derlemeler oluşturma işleminin farklı "aşamalarda" bölünmesine olanak tanır ve ardından ara aşamalardan yalnızca ilgili dizinleri alarak son görüntüyü bir araya getirebilirsiniz. Bu özelliği kullanmak için genel strateji şudur:

  1. Uygulamayı oluşturmak ve bir klasöre yayımlamak için gereken her şeyle birlikte bir temel SDK görüntüsü kullanın (ne kadar büyük olduğu fark etmez) ve ardından

  2. Yalnızca küçük, küçük bir çalışma zamanı görüntüsü kullanın ve küçük bir son görüntü oluşturmak için önceki aşamadaki yayımlama klasörünü kopyalayın.

Büyük olasılıkla çok aşamalı anlamanın en iyi yolu, bir Dockerfile'ı satır satır ayrıntılı olarak kullanmaktır. Bu nedenle, bir projeye Docker desteği eklerken Visual Studio tarafından oluşturulan ilk Dockerfile ile başlayalım ve daha sonra bazı iyileştirmelere geçeceğiz.

İlk Dockerfile şuna benzer olabilir:

 1  FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
 2  WORKDIR /app
 3  EXPOSE 80
 4
 5  FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
 6  WORKDIR /src
 7  COPY src/Services/Catalog/Catalog.API/Catalog.API.csproj …
 8  COPY src/BuildingBlocks/HealthChecks/src/Microsoft.AspNetCore.HealthChecks …
 9  COPY src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions.HealthChecks …
10  COPY src/BuildingBlocks/EventBus/IntegrationEventLogEF/ …
11  COPY src/BuildingBlocks/EventBus/EventBus/EventBus.csproj …
12  COPY src/BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.csproj …
13  COPY src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.csproj …
14  COPY src/BuildingBlocks/WebHostCustomization/WebHost.Customization …
15  COPY src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions …
16  COPY src/BuildingBlocks/HealthChecks/src/Microsoft.Extensions …
17  RUN dotnet restore src/Services/Catalog/Catalog.API/Catalog.API.csproj
18  COPY . .
19  WORKDIR /src/src/Services/Catalog/Catalog.API
20  RUN dotnet build Catalog.API.csproj -c Release -o /app
21
22  FROM build AS publish
23  RUN dotnet publish Catalog.API.csproj -c Release -o /app
24
25  FROM base AS final
26  WORKDIR /app
27  COPY --from=publish /app .
28  ENTRYPOINT ["dotnet", "Catalog.API.dll"]

Ve bunlar satır satır ayrıntılardır:

  • Satır 1: Yalnızca "küçük" çalışma zamanı temel görüntüsüyle bir aşamaya başlayın ve başvuru için temel olarak adlandırın.

  • Satır 2: Görüntüde /app dizinini oluşturun.

  • 3. Satır: 80 numaralı bağlantı noktasını kullanıma sunma.

  • 5. Satır: Derleme/yayımlama için "büyük" görüntüyle yeni bir aşamaya başlayın. Başvuru için derleme olarak adlandır.

  • Satır 6: Görüntüde /src dizini oluşturun.

  • Satır 7: 16. satıra kadar, daha sonra paketleri geri yükleyebilmek için başvuruda bulunılan .csproj proje dosyalarını kopyalayın.

  • Satır 17: Catalog.API projesi ve başvuruda bulunan projeler için paketleri geri yükleyin.

  • Satır 18: Çözüm için tüm dizin ağacını (.dockerignore dosyasındaki dosyalar/dizinler hariç) görüntüdeki /src dizinine kopyalayın.

  • Satır 19: Geçerli klasörü Catalog.API projesi olarak değiştirin.

  • Satır 20: Projeyi (ve diğer proje bağımlılıklarını) oluşturun ve görüntüdeki /app dizinine çıkış yapın.

  • Satır 22: Derlemeden devam eden yeni bir aşamaya başlayın. Başvuru için yayımla olarak adlandır.

  • Satır 23: Projeyi (ve bağımlılıkları) yayımlayın ve çıktıyı görüntüdeki /app dizinine yayımlayın.

  • Satır 25: Tabandandevam eden yeni bir aşamaya başlayın ve son olarak adlandırın.

  • Satır 26: Geçerli dizini /app olarak değiştirin.

  • Satır 27: /app dizinini geçerli dizine yayımlama aşamasından kopyalayın.

  • Satır 28: Kapsayıcı başlatıldığında çalıştırılacak komutu tanımlayın.

Şimdi eShopOnContainers söz konusu olduğunda Linux kapsayıcılarında tam çözümü oluşturmak için yaklaşık 22 dakika veya daha fazla anlamına gelen tüm süreç performansını geliştirmek için bazı iyileştirmeleri inceleyelim.

Docker'ın katman önbelleği özelliğinden yararlanacaksınız. Bu özellik oldukça basittir: Temel görüntü ve komutlar daha önce yürütülenler ile aynıysa, komutları yürütmeye gerek kalmadan sonuçta elde edilen katmanı kullanabilir ve bu sayede biraz zaman kazandırır.

Bu nedenle, derleme aşamasına odaklanalım, 5-6 arası satırlar çoğunlukla aynıdır, ancak 7-17 arası satırlar eShopOnContainers'dan gelen her hizmet için farklıdır, bu nedenle her seferinde yürütülmeleri gerekir, ancak 7-16 satırlarını şöyle değiştirdiyseniz:

COPY . .

Ardından her hizmet için aynı olur, çözümün tamamını kopyalar ve daha büyük bir katman oluşturur ancak:

  1. Kopyalama işlemi yalnızca ilk kez yürütülür (ve bir dosya değiştirilirse yeniden oluşturulurken) ve önbelleği diğer tüm hizmetler ve

  2. Daha büyük görüntü bir ara aşamada oluştuğundan, son görüntü boyutunu etkilemez.

Sonraki önemli iyileştirme, eShopOnContainers'ın her hizmeti için de farklı olan 17. satırda yürütülen komutu içerir restore . Bu satırı yalnızca:

RUN dotnet restore

Çözümün tamamı için paketleri geri yükler, ancak daha sonra, geçerli stratejiyle 15 kez yerine yalnızca bir kez yapar.

Ancak, dotnet restore yalnızca klasörde tek bir proje veya çözüm dosyası varsa çalışır, bu nedenle bunu başarmak biraz daha karmaşıktır ve çok fazla ayrıntıya girmeden çözmenin yolu şudur:

  1. .dockerignore öğesine aşağıdaki satırları ekleyin:

    • *.sln, ana klasör ağacındaki tüm çözüm dosyalarını yoksaymak için

    • !eShopOnContainers-ServicesAndWebApps.sln, yalnızca bu çözüm dosyasını dahil etmek için.

  2. bağımsız değişkenini /ignoreprojectextensions:.dcprojdotnet restoreekleyin, böylece docker-compose projesini de yoksayar ve yalnızca eShopOnContainers-ServicesAndWebApps çözümünün paketlerini geri yükler.

Son iyileştirme için, 23. satır da uygulamayı derleyip özünde 20. satırdan hemen sonra geldiğinden, 20. satırın yedekli olması, dolayısıyla zaman alan başka bir komut olmasıdır.

Sonuçta elde edilen dosya şu şekildedir:

 1  FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
 2  WORKDIR /app
 3  EXPOSE 80
 4
 5  FROM mcr.microsoft.com/dotnet/sdk:8.0 AS publish
 6  WORKDIR /src
 7  COPY . .
 8  RUN dotnet restore /ignoreprojectextensions:.dcproj
 9  WORKDIR /src/src/Services/Catalog/Catalog.API
10  RUN dotnet publish Catalog.API.csproj -c Release -o /app
11
12  FROM base AS final
13  WORKDIR /app
14  COPY --from=publish /app .
15  ENTRYPOINT ["dotnet", "Catalog.API.dll"]

Temel görüntünüzü sıfırdan oluşturma

Sıfırdan kendi Docker temel görüntünüzü oluşturabilirsiniz. Docker'ı kullanmaya başlayan biri için bu senaryo önerilmez, ancak kendi temel görüntünüzün belirli bitlerini ayarlamak istiyorsanız bunu yapabilirsiniz.

Ek kaynaklar

Image for Step 3.

3. Adım. Özel Docker görüntülerinizi oluşturun ve uygulamanızı veya hizmetinizi bunlara ekleyin

Uygulamanızdaki her hizmet için ilgili bir görüntü oluşturmanız gerekir. Uygulamanız tek bir hizmetten veya web uygulamasından oluşuyorsa tek bir görüntüye ihtiyacınız vardır.

Docker görüntülerinin Visual Studio'da sizin için otomatik olarak oluşturulduğuna dikkat edin. Aşağıdaki adımlar yalnızca düzenleyici/CLI iş akışı için gereklidir ve altında neler olduğu hakkında netlik sağlamak için açıklanmıştır.

Bir geliştirici olarak, tamamlanmış bir özelliği gönderinceye veya kaynak denetim sisteminize (örneğin GitHub'a) geçiş yapmaya kadar yerel olarak geliştirmeniz ve test etmeniz gerekir. Bu, Docker görüntülerini oluşturmanız ve kapsayıcıları yerel bir Docker konağına (Windows veya Linux VM) dağıtmanız ve bu yerel kapsayıcılarda çalıştırmanız, test etmeniz ve hatalarını ayıklamanız gerektiği anlamına gelir.

Docker CLI ve Dockerfile kullanarak yerel ortamınızda özel görüntü oluşturmak için, Şekil 5-5'te olduğu gibi docker build komutunu kullanabilirsiniz.

Screenshot showing the console output of the docker build command.

Şekil 5-5. Özel Docker görüntüsü oluşturma

İsteğe bağlı olarak, docker derlemesini doğrudan proje klasöründen çalıştırmak yerine, komutunu çalıştırarak dotnet publishönce gerekli .NET kitaplıkları ve ikili dosyalarıyla dağıtılabilir bir klasör oluşturabilir ve ardından komutunu kullanabilirsiniz docker build .

Bu, adlı cesardl/netcore-webapi-microservice-docker:firstbir Docker görüntüsü oluşturur. Bu durumda, :first belirli bir sürümü temsil eden bir etikettir. Bu adımı, oluşturulan Docker uygulamanız için oluşturmanız gereken her özel görüntü için yineleyebilirsiniz.

Bir uygulama birden çok kapsayıcıdan (yani, çok kapsayıcılı bir uygulama) yapıldığında, ilgili docker-compose.yml dosyalarında kullanıma sunulan meta verileri kullanarak tüm ilgili görüntüleri tek bir komutla derlemek için komutunu da docker-compose up --build kullanabilirsiniz.

Şekil 5-6'da gösterildiği gibi docker images komutunu kullanarak mevcut görüntüleri yerel deponuzda bulabilirsiniz.

Console output from command docker images, showing existing images.

Şekil 5-6. Docker images komutunu kullanarak mevcut görüntüleri görüntüleme

Visual Studio ile Docker görüntüleri oluşturma

Docker desteğine sahip bir proje oluşturmak için Visual Studio'yu kullandığınızda, açıkça bir görüntü oluşturmazsınız. Bunun yerine, dockerized uygulamasını veya hizmetini çalıştırmak için F5 (veya Ctrl+F5) tuşlarına bastığınızda görüntü oluşturulur. Bu adım Visual Studio'da otomatiktir ve bunun gerçekleştiğini görmezsiniz, ancak altında neler olduğunu bilmeniz önemlidir.

Image for the optional Step 4.

4. Adım. Çok kapsayıcılı docker uygulaması oluştururken hizmetlerinizi docker-compose.yml içinde tanımlama

docker-compose.yml dosyası, dağıtım komutlarıyla oluşturulan bir uygulama olarak dağıtılacak bir dizi ilgili hizmeti tanımlamanıza olanak tanır. Ayrıca bağımlılık ilişkilerini ve çalışma zamanı yapılandırmasını yapılandırmaktadır.

docker-compose.yml dosyası kullanmak için, aşağıdaki örnektekine benzer içerikle dosyayı ana veya kök çözüm klasörünüzde oluşturmanız gerekir:

version: '3.4'

services:

  webmvc:
    image: eshop/web
    environment:
      - CatalogUrl=http://catalog-api
      - OrderingUrl=http://ordering-api
    ports:
      - "80:80"
    depends_on:
      - catalog-api
      - ordering-api

  catalog-api:
    image: eshop/catalog-api
    environment:
      - ConnectionString=Server=sqldata;Port=1433;Database=CatalogDB;…
    ports:
      - "81:80"
    depends_on:
      - sqldata

  ordering-api:
    image: eshop/ordering-api
    environment:
      - ConnectionString=Server=sqldata;Database=OrderingDb;…
    ports:
      - "82:80"
    extra_hosts:
      - "CESARDLBOOKVHD:10.0.75.1"
    depends_on:
      - sqldata

  sqldata:
    image: mcr.microsoft.com/mssql/server:latest
    environment:
      - SA_PASSWORD=Pass@word
      - ACCEPT_EULA=Y
    ports:
      - "5433:1433"

Bu docker-compose.yml dosyası basitleştirilmiş ve birleştirilmiş bir sürümdür. Her kapsayıcı için her zaman gerekli olan statik yapılandırma verilerini (özel görüntünün adı gibi) ve bağlantı dizesi gibi dağıtım ortamına bağlı olabilecek yapılandırma bilgilerini içerir. Sonraki bölümlerde, ortam ve yürütme türüne (hata ayıklama veya sürüm) bağlı olarak docker-compose.yml yapılandırmasını birden çok docker-compose dosyasına bölmeyi ve değerleri geçersiz kılmayı öğreneceksiniz.

docker-compose.yml dosya örneği dört hizmeti tanımlar: webmvc hizmet (bir web uygulaması), iki mikro hizmet (ordering-api ve basket-api) ve kapsayıcı olarak çalışan Linux için SQL Server'ı temel alan bir veri kaynağı kapsayıcısı sqldata. Her hizmet bir kapsayıcı olarak dağıtılacağı için her biri için bir Docker görüntüsü gerekir.

docker-compose.yml dosyası yalnızca hangi kapsayıcıların kullanıldığını değil, ayrı ayrı nasıl yapılandırıldıklarını belirtir. Örneğin, webmvc .yml dosyasındaki kapsayıcı tanımı:

  • Önceden oluşturulmuş eshop/web:latest bir görüntü kullanır. Ancak, docker-compose dosyasının derleme: bölümünü temel alan ek bir yapılandırmayla görüntüyü docker-compose yürütmesinin bir parçası olarak derlenecek şekilde de yapılandırabilirsiniz.

  • İki ortam değişkeni başlatır (CatalogUrl ve OrderingUrl).

  • Kapsayıcıdaki kullanıma sunulan 80 numaralı bağlantı noktasını konak makinedeki dış bağlantı noktası 80'e iletir.

  • web uygulamasını katalog ve sipariş hizmetine depends_on ayarıyla bağlar. Bu, hizmetin bu hizmetler başlatılana kadar beklemesine neden olur.

Mikro hizmetlerin ve çok kapsayıcılı uygulamaların nasıl uygulanacağını ele aldığımız sonraki bir bölümde docker-compose.yml dosyasını yeniden ziyaret edeceğiz.

Visual Studio 2022'de docker-compose.yml ile çalışma

Daha önce de belirttiğimiz gibi projeye Dockerfile eklemenin yanı sıra, Visual Studio 2017 (sürüm 15.8'den itibaren) bir çözüme Docker Compose için düzenleyici desteği ekleyebilir.

Şekil 5-7'de gösterildiği gibi kapsayıcı düzenleyici desteğini ilk kez eklediğinizde, Visual Studio proje için Dockerfile'ı oluşturur ve çözümünüzde birkaç genel docker-compose*.yml dosya içeren yeni bir (hizmet bölümü) projesi oluşturur ve ardından projeyi bu dosyalara ekler. Daha sonra docker-compose.yml dosyalarını açabilir ve ek özelliklerle güncelleştirebilirsiniz.

docker-compose.yml dosyasına eklemek istediğiniz her proje için bu işlemi yineleyin.

Bu yazı sırasında Visual Studio, Docker Compose düzenleyicilerini destekler.

Screenshot showing the Container Orchestrator Support option in the project context menu.

Şekil 5-7. ASP.NET Core projesine sağ tıklayarak Visual Studio 2022'de Docker desteği ekleme

Visual Studio'da çözümünüze düzenleyici desteği ekledikten sonra, Şekil 5-8'de docker-compose.dcproj gösterildiği gibi eklenen docker-compose.yml dosyalarını içeren yeni bir düğüm (proje dosyasında) da Çözüm Gezgini görürsünüz.

Screenshot of docker-compose node in Solution Explorer.

Şekil 5-8. Visual Studio 2022'de eklenen docker-compose ağaç düğümü Çözüm Gezgini

komutunu kullanarak docker-compose up tek bir docker-compose.yml dosyasıyla çok kapsayıcılı bir uygulama dağıtabilirsiniz. Ancak Visual Studio, ortam (geliştirme veya üretim) ve yürütme türüne (sürüm veya hata ayıklama) bağlı olarak değerleri geçersiz kılabilmeniz için bunlardan bir grup ekler. Bu özellik sonraki bölümlerde açıklanacaktır.

Image for the Step 5.

Adım 5. Docker uygulamanızı derleme ve çalıştırma

Uygulamanızın yalnızca tek bir kapsayıcısı varsa, docker konağınıza (VM veya fiziksel sunucu) dağıtarak bunu çalıştırabilirsiniz. Ancak, uygulamanız birden çok hizmet içeriyorsa, tek bir CLI komutu kullanarak (docker-compose up)veya bu komutu kapakların altında kullanacak Visual Studio ile) oluşturulmuş bir uygulama olarak dağıtabilirsiniz. Şimdi farklı seçeneklere bakalım.

A Seçeneği: Tek kapsayıcılı uygulama çalıştırma

Docker CLI kullanma

Şekil 5-9'da gösterildiği gibi komutunu kullanarak docker run bir Docker kapsayıcısı çalıştırabilirsiniz:

docker run -t -d -p 80:5000 cesardl/netcore-webapi-microservice-docker:first

Yukarıdaki komut, belirtilen görüntüden her çalıştırıldığında yeni bir kapsayıcı örneği oluşturur. parametresini --name kullanarak kapsayıcıya bir ad verebilir ve ardından mevcut bir kapsayıcı örneğini çalıştırmak için kapsayıcı kimliğini veya otomatik adı kullanabilirsiniz docker start {name} .

Screenshot running a Docker container using the docker run command.

Şekil 5-9. Docker run komutunu kullanarak Docker kapsayıcısı çalıştırma

Bu durumda, komutu kapsayıcının 5000 iç bağlantı noktasını konak makinenin 80 numaralı bağlantı noktasına bağlar. Bu, konağın 80 numaralı bağlantı noktasını dinlediği ve kapsayıcıdaki 5000 numaralı bağlantı noktasına ilettiği anlamına gelir.

Gösterilen karma kapsayıcı kimliğidir ve seçenek kullanılmazsa --name rastgele okunabilir bir ad atanır.

Visual Studio’yu kullanma

Kapsayıcı düzenleyici desteği eklemediyseniz, Ctrl+F5 tuşlarına basarak Visual Studio'da tek bir kapsayıcı uygulaması çalıştırabilir ve ayrıca F5 kullanarak kapsayıcı içindeki uygulamanın hatalarını ayıklayabilirsiniz. Kapsayıcı docker çalıştırması kullanılarak yerel olarak çalışır.

B Seçeneği: Çok kapsayıcılı bir uygulama çalıştırma

Çoğu kurumsal senaryoda, Bir Docker uygulaması birden çok hizmetlerden oluşur; bu da Şekil 5-10'da gösterildiği gibi çok kapsayıcılı bir uygulama çalıştırmanız gerektiği anlamına gelir.

VM with several Docker containers

Şekil 5-10. Docker kapsayıcılarının dağıtılacağı VM

Docker CLI kullanma

Docker CLI ile çok kapsayıcılı bir uygulama çalıştırmak için komutunu kullanırsınız docker-compose up . Bu komut, çok kapsayıcılı bir uygulama dağıtmak için çözüm düzeyinde sahip olduğunuz docker-compose.yml dosyasını kullanır. Şekil 5-11,docker-compose.yml dosyasını içeren ana çözüm dizininizden komutu çalıştırırken elde edilen sonuçları gösterir.

Screen view when running the docker-compose up command

Şekil 5-11. docker-compose up komutunu çalıştırırken örnek sonuçlar

Docker-compose up komutu çalıştırıldıktan sonra uygulama ve ilgili kapsayıcıları, Şekil 5-10'da gösterildiği gibi Docker konağınıza dağıtılır.

Visual Studio’yu kullanma

Visual Studio 2019 kullanarak çok kapsayıcılı bir uygulama çalıştırmak daha kolay olamaz. Her zamanki gibi, docker-compose projesini başlangıç projesi olarak ayarlamak için Ctrl+F5 tuşlarına ve hata ayıklamak için F5 tuşuna basmanız gerekir. Visual Studio gerekli tüm ayarları işler, böylece her zamanki gibi kesme noktaları oluşturabilir ve sonunda "uzak sunucularda" çalışan bağımsız işlemlere dönüşen hataları ayıklayabilir ve hata ayıklayıcı zaten eklenmiştir.

Daha önce de belirtildiği gibi, bir çözüm içindeki bir projeye Her Docker çözümü desteği eklediğinizde, bu proje genel (çözüm düzeyi) docker-compose.yml dosyasında yapılandırılır ve bu da çözümün tamamını aynı anda çalıştırmanıza veya hatalarını ayıklamanıza olanak tanır. Visual Studio, Docker çözümü desteği etkinleştirilmiş her proje için bir kapsayıcı başlatır ve tüm iç adımları sizin için gerçekleştirir (dotnet publish, docker build, vb.).

Tüm drudgery'ye göz atmak istiyorsanız dosyaya göz atın:

{root solution folder}\obj\Docker\docker-compose.vs.debug.g.yml

Buradaki önemli nokta, Şekil 5-12'de gösterildiği gibi Visual Studio 2019'da F5 anahtar eylemi için ek bir Docker komutu olmasıdır. Bu seçenek, docker-compose.yml dosyalarında tanımlanan tüm kapsayıcıları çözüm düzeyinde çalıştırarak çok kapsayıcılı bir uygulamayı çalıştırmanıza veya hata ayıklamanıza olanak tanır. Birden çok kapsayıcılı çözümlerde hata ayıklama özelliği, farklı bir projede (kapsayıcıda) her kesme noktası ayarlayabileceğiniz ve Visual Studio'dan hata ayıklarken farklı projelerde tanımlanan ve farklı kapsayıcılarda çalıştırılan kesme noktalarında duracağınız anlamına gelir.

Screenshot of the debug toolbar running a docker-compose project.

Şekil 5-12. Visual Studio 2022'de çok kapsayıcılı uygulamaları çalıştırma

Ek kaynaklar

Düzenleyicilerle test etme ve dağıtma hakkında bir not

Docker-compose up ve docker çalıştırma komutları (veya Visual Studio'da kapsayıcıları çalıştırma ve hata ayıklama) geliştirme ortamınızdaki kapsayıcıları test etme için yeterlidir. Ancak kubernetes veya Service Fabric gibi düzenleyicileri hedeflemeniz gereken üretim dağıtımları için bu yaklaşımı kullanmamalısınız. Kubernetes kullanıyorsanız, kapsayıcıları ve hizmetleri ağ üzerinden düzenlemek için podları kullanmanız gerekir. Ayrıca pod oluşturma ve değiştirme işlemlerini düzenlemek için dağıtımları da kullanırsınız.

Image for the Step 6.

6. Adım. Yerel Docker konağınızı kullanarak Docker uygulamanızı test edin

Bu adım, uygulamanızın ne yaptığına bağlı olarak değişir. Tek bir kapsayıcı veya hizmet olarak dağıtılan basit bir .NET Web uygulamasında, Şekil 5-13'te gösterildiği gibi Docker ana bilgisayarında bir tarayıcı açarak ve bu siteye giderek hizmete erişebilirsiniz. (Dockerfile'daki yapılandırma kapsayıcıyı konaktaki 80 dışında bir bağlantı noktasıyla eşlerse, url'ye konak bağlantı noktasını ekleyin.)

Screenshot of the response from localhost/API/values.

Şekil 5-13. Localhost kullanarak Docker uygulamanızı yerel olarak test etme örneği

Localhost Docker ana bilgisayar IP'sine işaretlenmiyorsa (varsayılan olarak Docker CE kullanılırken bu ip adresi olmalıdır), hizmetinize gitmek için makinenizin ağ kartının IP adresini kullanın.

Tarayıcıdaki bu URL, ele alınan belirli kapsayıcı örneği için 80 numaralı bağlantı noktasını kullanır. Ancak, önceki adımda açıklandığı gibi docker run komutuyla bu şekilde dağıtıldığı için istekler dahili olarak 5000 numaralı bağlantı noktasına yönlendirilir.

Şekil 5-14'te gösterildiği gibi terminalden curl kullanarak da uygulamayı test edebilirsiniz. Windows'da docker yüklemesinde, makinenizin gerçek IP adresine ek olarak varsayılan Docker Ana Bilgisayar IP'si her zaman 10.0.75.1'dir.

Console output from getting the http://10.0.75.1/API/values with curl.

Şekil 5-14. Curl kullanarak Docker uygulamanızı yerel olarak test etme örneği

Visual Studio 2022 ile kapsayıcıları test etme ve hata ayıklama

Visual Studio 2022 ile kapsayıcıları çalıştırırken ve kapsayıcılarda hata ayıklama yaparken, .NET uygulamasının hatalarını kapsayıcılar olmadan çalışırken yaptığınız gibi ayıklayabilirsiniz.

Visual Studio olmadan test etme ve hata ayıklama

Düzenleyici/CLI yaklaşımını kullanarak geliştiriyorsanız kapsayıcılarda hata ayıklamak daha zordur ve büyük olasılıkla izlemeler oluşturarak hata ayıklamak istersiniz.

Ek kaynaklar

Visual Studio ile kapsayıcı geliştirirken basitleştirilmiş iş akışı

Etkili bir şekilde, Visual Studio kullanırken iş akışı, düzenleyici/CLI yaklaşımını kullandığınızdan çok daha basittir. Dockerfile ve docker-compose.yml dosyalarıyla ilgili Docker'ın gerektirdiği adımların çoğu, Şekil 5-15'te gösterildiği gibi Visual Studio tarafından gizlenir veya basitleştirilmiştir.

Diagram showing the five simplified steps it takes to create an app.

Docker uygulamaları için geliştirme süreci: 1 - Uygulamanızı kodlayın, 2 - Dockerfile/s yazma, 3 - Dockerfile/s'de tanımlanan görüntüler oluşturma, 4 - (isteğe bağlı) docker-compose.yml dosyasında hizmet oluşturma, 5 - Kapsayıcı veya docker-compose uygulamasını çalıştırma, 6 - Uygulamanızı veya mikro hizmetleri test etme, 7 - Depoya gönderme ve yineleme.

Şekil 5-15. Visual Studio ile geliştirme yaparken basitleştirilmiş iş akışı

Ayrıca, 2. adımı (projelerinize Docker desteği ekleme) yalnızca bir kez gerçekleştirmeniz gerekir. Bu nedenle, iş akışı diğer geliştirmeler için .NET kullanırken her zamanki geliştirme görevlerinize benzer. Kapakların altında neler olduğunu bilmeniz gerekir (görüntü derleme işlemi, hangi temel görüntüleri kullandığınız, kapsayıcı dağıtımı vb.) ve bazen davranışları özelleştirmek için Dockerfile veya docker-compose.yml dosyasını da düzenlemeniz gerekir. Ancak işin çoğu Visual Studio kullanılarak büyük ölçüde basitleştirilir ve bu sayede çok daha üretken olursunuz.

Windows Kapsayıcılarını ayarlamak için Dockerfile'da PowerShell komutlarını kullanma

Windows Kapsayıcıları , mevcut Windows uygulamalarınızı Docker görüntülerine dönüştürmenize ve docker ekosisteminin geri kalanıyla aynı araçlarla dağıtmanıza olanak tanır. Windows Kapsayıcıları'nı kullanmak için, aşağıdaki örnekte gösterildiği gibi Dockerfile'da PowerShell komutlarını çalıştırırsınız:

FROM mcr.microsoft.com/windows/servercore
LABEL Description="IIS" Vendor="Microsoft" Version="10"
RUN powershell -Command Add-WindowsFeature Web-Server
CMD [ "ping", "localhost", "-t" ]

Bu durumda, bir Windows Server Core temel görüntüsü (FROM ayarı) kullanıyor ve BIR PowerShell komutu (RUN ayarı) ile IIS yüklüyoruz. Benzer şekilde PowerShell komutlarını kullanarak ASP.NET 4.x, .NET Framework 4.6 veya başka bir Windows yazılımı gibi ek bileşenleri ayarlayabilirsiniz. Örneğin, dockerfile içindeki aşağıdaki komut 4.5 ASP.NET ayarlar:

RUN powershell add-windowsfeature web-asp-net45

Ek kaynaklar