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.
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.
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.
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.
Ş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
Windows için Docker Desktop'ı kullanmaya başlama
https://docs.docker.com/docker-for-windows/Visual Studio 2022
https://visualstudio.microsoft.com/downloads/
2. Adım. Mevcut bir .NET temel görüntüsüyle ilgili dockerfile oluşturma
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.
Ş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.
Ş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
ASP.NET Core Uygulamaları için Docker Görüntüleri Oluşturma
https://learn.microsoft.com/dotnet/core/docker/building-net-docker-imagesKendi görüntünüzü oluşturun. Resmi Docker belgelerinde.
https://docs.docker.com/engine/tutorials/dockerimages/.NET Kapsayıcı Görüntüleri ile güncel kalma
https://devblogs.microsoft.com/dotnet/staying-up-to-date-with-net-container-images/.NET ve Docker'ı Birlikte Kullanma - DockerCon 2018 Güncelleştirmesi
https://devblogs.microsoft.com/dotnet/using-net-and-docker-together-dockercon-2018-update/
Ç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:
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
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:
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
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:
.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.
bağımsız değişkenini
/ignoreprojectextensions:.dcproj
dotnet restore
ekleyin, 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
Çok kemerli .NET Core görüntüleri.
https://github.com/dotnet/announcements/issues/14Temel görüntü oluşturun. Resmi Docker belgeleri.
https://docs.docker.com/develop/develop-images/baseimages/
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.
Ş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:first
bir 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.
Ş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.
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.
Ş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.
Ş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.
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}
.
Ş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.
Ş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.
Ş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.
Şekil 5-12. Visual Studio 2022'de çok kapsayıcılı uygulamaları çalıştırma
Ek kaynaklar
- ASP.NET kapsayıcısını uzak docker konağına dağıtma
https://learn.microsoft.com/visualstudio/containers/hosting-web-apps-in-docker
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.
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.)
Ş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.
Ş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
Hızlı Başlangıç: Visual Studio'da Docker.
https://learn.microsoft.com/visualstudio/containers/container-toolsYerel Docker kapsayıcısında uygulamalarda hata ayıklama
https://learn.microsoft.com/visualstudio/containers/edit-and-refresh
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.
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
- aspnet-docker/Dockerfile. Windows özelliklerini eklemek için dockerfiles dosyasından çalıştırılacak örnek PowerShell komutları.
https://github.com/Microsoft/aspnet-docker/blob/master/4.7.1-windowsservercore-ltsc2016/runtime/Dockerfile
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin