Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu öğreticide, Visual Studio'da Kapsayıcı Araçları'nı kullanırken birden fazla kapsayıcıyı yönetmeyi ve bunlar arasında iletişim kurmayı öğreneceksiniz. Birden çok kapsayıcıyı yönetmek için kapsayıcı orkestrasyonu ve Docker Compose veya Service Fabric gibi bir düzenleyici gereklidir. Bu yordamlar için Docker Compose'u kullanırsınız. Docker Compose, geliştirme döngüsü boyunca yerel hata ayıklama ve test için mükemmeldir.
Bu öğreticide oluşturduğunuz tamamlanmış örnek GitHub'da docker/ComposeSample https://github.com/MicrosoftDocs/vs-tutorial-samples
klasöründe bulunabilir.
Önkoşullar
- Docker Desktop
- Visual Studio 2019 ile Web Geliştirme, Azure Araçları iş yükü ve/veya .NET platformlar arası geliştirme iş yükü yüklü
- Docker Desktop
- Visual Studio 2022,Web Geliştirme, Azure Araçları iş yükü ve/veya .NET çapraz platform geliştirme iş yükü yüklü. Bu yükleme .NET 8 geliştirme araçlarını içerir.
Web Uygulaması projesi oluşturma
Visual Studio'da, Razor sayfalarıyla bir web uygulaması oluşturmak için adlı WebFrontEnd
projesi oluşturun.
Kapsayıcı desteğini etkinleştir'i seçmeyin. Docker Compose için daha sonra destek eklersiniz.
Docker Desteğini Etkinleştirseçmeyin. İşlemin ilerleyen bölümlerinde Docker desteği ekleyebilirsiniz.
Web API projesi oluşturma
Aynı çözüme bir proje ekleyin ve MyWebAPI olarak adlandırın. Proje türü olarak API seçin ve HTTPS için yapılandır onay kutusunu temizleyin. Bu tasarımda SSL'yi yalnızca istemciyle iletişim için kullanıyoruz, aynı web uygulamasındaki kapsayıcılar arasındaki iletişim için değil. Yalnızca WebFrontEnd
HTTPS'ye ihtiyaç duyar ve örneklerdeki kod, bu onay kutusunu temizlemiş olduğunuzu varsayar. Genel olarak, Visual Studio tarafından kullanılan .NET geliştirici sertifikaları, kapsayıcıya dışarıdan istekler için desteklenir, kapsayıcıdan kapsayıcıya istekler için değil.
Aynı çözüme bir proje ekleyin ve MyWebAPI olarak adlandırın. Proje türü olarak API seçin ve HTTPS için yapılandır onay kutusunu temizleyin.
Not
Bu tasarımda, aynı web uygulamasındaki kapsayıcılar arasındaki iletişim için değil yalnızca istemciyle iletişim için HTTPS kullanıyoruz. Yalnızca
WebFrontEnd
HTTPS'ye ihtiyaç duyar ve örneklerdeki kod, bu onay kutusunu temizlemiş olduğunuzu varsayar. Genel olarak, Visual Studio tarafından kullanılan .NET geliştirici sertifikaları, kapsayıcıya dışarıdan istekler için desteklenir, kapsayıcıdan kapsayıcıya istekler için değil.Redis için Azure Cache desteği ekleyin. NuGet paketi
Microsoft.Extensions.Caching.StackExchangeRedis
ekleyin (StackExchange.Redis
değil). Program.csiçinde,var app = builder.Build()
hemen önce aşağıdaki satırları ekleyin:builder.Services.AddStackExchangeRedisCache(options => { options.Configuration = "redis:6379"; // redis is the container name of the redis service. 6379 is the default port options.InstanceName = "SampleInstance"; });
Program.cs
veMicrosoft.Extensions.Caching.Distributed
içinMicrosoft.Extensions.Caching.StackExchangeRedis
using yönergelerini ekleyin.using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Caching.StackExchangeRedis;
Web API projesinde, mevcut
WeatherForecast.cs
ve Controllers/WeatherForecastController.cssilin ve Denetleyiciler'in altına aşağıdaki içeriklerle birlikte CounterController.csbir dosya ekleyin:using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Caching.Distributed; using StackExchange.Redis; namespace WebApi.Controllers { [ApiController] [Route("[controller]")] public class CounterController : ControllerBase { private readonly ILogger<CounterController> _logger; private readonly IDistributedCache _cache; public CounterController(ILogger<CounterController> logger, IDistributedCache cache) { _logger = logger; _cache = cache; } [HttpGet(Name = "GetCounter")] public string Get() { string key = "Counter"; string? result = null; try { var counterStr = _cache.GetString(key); if (int.TryParse(counterStr, out int counter)) { counter++; } else { counter = 0; } result = counter.ToString(); _cache.SetString(key, result); } catch(RedisConnectionException) { result = "Redis cache is not found."; } return result; } } }
Hizmet, sayfaya her erişildiğinde bir sayacı artırır ve sayacı önbellekte depolar.
Web API'sini çağırmak için kod ekleme
WebFrontEnd
projesinde Index.cshtml.cs dosyasını açın veOnGet
yöntemini aşağıdaki kodla değiştirin.public async Task OnGet() { ViewData["Message"] = "Hello from webfrontend"; using (var client = new System.Net.Http.HttpClient()) { // Call *mywebapi*, and display its response in the page var request = new System.Net.Http.HttpRequestMessage(); request.RequestUri = new Uri("http://mywebapi/WeatherForecast"); // request.RequestUri = new Uri("http://mywebapi/api/values/1"); // For ASP.NET 2.x, comment out previous line and uncomment this line. var response = await client.SendAsync(request); ViewData["Message"] += " and " + await response.Content.ReadAsStringAsync(); } }
Index.cshtml
dosyasında, dosyanın aşağıdaki koda benzemesi içinViewData["Message"]
görüntülenecek bir satır ekleyin:@page @model IndexModel @{ ViewData["Title"] = "Home page"; } <div class="text-center"> <h1 class="display-4">Welcome</h1> <p>Learn about <a href="/aspnet/core">building Web apps with ASP.NET Core</a>.</p> <p>@ViewData["Message"]</p> </div>
(yalnızca ASP.NET 2.x) Şimdi Web API projesinde, webfrontend'dan eklediğiniz çağrı için API tarafından döndürülen iletiyi özelleştirmek için Değerler denetleyicisine kod ekleyin.
// GET api/values/5 [HttpGet("{id}")] public ActionResult<string> Get(int id) { return "webapi (with value " + id + ")"; }
Not
.NET Core 3.1 ve sonraki sürümlerinde, bu ek kod yerine sağlanan WeatherForecast API'sini kullanabilirsiniz. Ancak kod, çağrıyı HTTPS yerine HTTP kullanarak gerçekleştirdiğinden, Web API projesindeki UseHttpsRedirection çağrısına açıklama eklemeniz gerekir.
//app.UseHttpsRedirection();
Docker Compose desteği ekleme
WebFrontEnd
projesinde, > Kapsayıcı Düzenleyici Desteği ekleyin. Docker Destek Seçenekleri iletişim kutusu görüntülenir.Docker Compose'u seçin.
Hedef işletim sisteminizi (örneğin, Linux) seçin.
Visual Studio, çözümdeki docker-compose düğümünde bir
.dockerignore
dosyası ve bir dosyası oluşturur ve bu proje, başlangıç projesi olduğunu gösteren kalın yazı tipinde gösterilir.docker-compose.yml aşağıdaki gibi görünür:
services: webfrontend: image: ${DOCKER_REGISTRY-}webfrontend build: context: . dockerfile: WebFrontEnd/Dockerfile
İlk satırda belirtilen
version
, Docker Compose dosya sürümü'dir. Normalde dosyayı nasıl yorumlayacağınızı anlamak için araçlar tarafından kullanıldığından dosyayı değiştirmemelisiniz..dockerignore
dosyası, Docker'ın kapsayıcıya eklemesini istemediğiniz dosya türlerini ve uzantılarını içerir. Bu dosyalar genellikle geliştirmekte olduğunuz uygulamanın veya hizmetin bir parçası değil, geliştirme ortamı ve kaynak denetimiyle ilişkilendirilir.Çalıştırılan komutların ayrıntıları için çıkış bölmesinin Kapsayıcı Araçları bölümüne bakın. Çalışma zamanı kapsayıcılarını yapılandırmak ve oluşturmak için
docker-compose
komut satırı aracının kullanıldığını görebilirsiniz.Web API projesinde, proje düğümüne yeniden sağ tıklayın ve Ekle>Kapsayıcı Düzenleyicisi Desteğiseçin. Docker Composeöğesini seçin ve ardından aynı hedef işletim sistemini seçin.
Not
Bu adımda Visual Studio bir Dockerfile oluşturmayı teklif edecektir. Bunu zaten Docker desteği olan bir projede yaparsanız, mevcut Dockerfile dosyasının üzerine yazmak isteyip istemediğiniz sorulur. Dockerfile dosyanızda saklamak istediğiniz değişiklikler yaptıysanız hayır'ı seçin.
Visual Studio, Docker Compose YML dosyanızda bazı değişiklikler yapar. Artık her iki hizmet de dahil edilir.
services: webfrontend: image: ${DOCKER_REGISTRY-}webfrontend build: context: . dockerfile: WebFrontEnd/Dockerfile mywebapi: image: ${DOCKER_REGISTRY-}mywebapi build: context: . dockerfile: MyWebAPI/Dockerfile
Kapsayıcı düzenlemesini eklediğiniz ilk proje, çalıştırdığınızda veya hata ayıkladığınızda başlatılacak şekilde ayarlanır. Başlatma eylemini Docker Compose projesi için Proje Özellikleri yapılandırabilirsiniz. Docker Compose proje düğümünde sağ tıklayarak bağlam menüsünü açın ve Özelliklerseçeneğini belirleyin veya Alt+Enter tuşlarını kullanın. Aşağıdaki ekran görüntüsünde, burada kullanılan çözüm için kullanmak istediğiniz özellikler gösterilmektedir. Örneğin, Hizmeti URL'si özelliğini özelleştirerek yüklenen sayfayı değiştirebilirsiniz.
Başlatıldığında şunları görürsünüz (.NET Core 2.x sürümü):
.NET 3.1 için web uygulaması, hava durumu verilerini JSON biçiminde gösterir.
Şimdi hata ayıklayıcının Web API projesine değil yalnızca WebFrontEnd'e eklenmesiyle ilgilendiğinizi varsayalım. Menü çubuğundan, başlat düğmesinin yanındaki açılan listeyi kullanarak hata ayıklama seçenekleri menüsünü açabilirsiniz; Docker Compose Başlatma Ayarlarını Yönet'iseçin.
Docker Compose Başlatma Ayarlarını Yönet iletişim kutusu açılır. Bu iletişim kutusuyla, bir hata ayıklama oturumu sırasında hangi hizmet alt kümesinin başlatıldığını, hangilerinin hata ayıklayıcı ekli veya eklenmemiş olarak başlatıldığını ve başlatma hizmeti ile URL'sini denetleyebilirsiniz. Bkz. Compose hizmetleri alt kümesini başlatma.
Yeni seçin, yeni bir profil oluşturmak ve onu
Debug WebFrontEnd only
olarak adlandırın. Ardından, Web API projesini hata ayıklamadan başlangıçolarak ayarlayın, WebFrontEnd projesini hata ayıklamayla başlayacak şekilde ayarlayın ve Kaydetseçeneğini belirleyin.Yeni yapılandırma, sonraki F5için varsayılan olarak seçilir.
Beklediğiniz gibi çalıştığını onaylamak için F5 basın.
Tebrikler, özel docker Compose profiline sahip bir Docker Compose uygulaması çalıştırıyorsunuz.
WebFrontEnd
projesinde Index.cshtml.cs dosyasını açın veOnGet
yöntemini aşağıdaki kodla değiştirin.public async Task OnGet() { // Call *mywebapi*, and display its response in the page using (var client = new System.Net.Http.HttpClient()) { var request = new System.Net.Http.HttpRequestMessage(); // A delay is a quick and dirty way to work around the fact that // the mywebapi service might not be immediately ready on startup. // See the text for some ideas on how you can improve this. // Uncomment if not using healthcheck (Visual Studio 17.13 or later) // await System.Threading.Tasks.Task.Delay(10000); // mywebapi is the service name, as listed in docker-compose.yml. // Docker Compose creates a default network with the services // listed in docker-compose.yml exposed as host names. // The port 8080 is exposed in the WebAPI Dockerfile. // If your WebAPI is exposed on port 80 (the default for HTTP, used // with earlier versions of the generated Dockerfile), change // or delete the port number here. request.RequestUri = new Uri("http://mywebapi:8080/Counter"); var response = await client.SendAsync(request); string counter = await response.Content.ReadAsStringAsync(); ViewData["Message"] = $"Counter value from cache :{counter}"; } }
Not
Gerçek dünya kodunda, her istekten sonra
HttpClient
atmamalısınız. En iyi yöntemler için bkz. dayanıklı HTTP isteklerini uygulamak için HttpClientFactory kullanma.Verilen URI, docker-compose.yml dosyasında tanımlanan bir hizmet adına başvurur. Docker Compose, listelenen hizmet adlarını konak olarak kullanarak kapsayıcılar arasındaki iletişim için varsayılan bir ağ ayarlar.
Burada gösterilen kod, Dockerfile'da yönetici ayrıcalıkları olmadan bir kullanıcı hesabı ayarlayan ve HTTP varsayılan bağlantı noktası 80'e yükseltilmiş ayrıcalık olmadan erişilemediğinden 8080 numaralı bağlantı noktasını kullanıma sunan .NET 8 ve üzeri sürümlerle çalışır.
Index.cshtml
dosyasında, dosyanın aşağıdaki koda benzemesi içinViewData["Message"]
görüntülenecek bir satır ekleyin:@page @model IndexModel @{ ViewData["Title"] = "Home page"; } <div class="text-center"> <h1 class="display-4">Welcome</h1> <p>Learn about <a href="/aspnet/core">building Web apps with ASP.NET Core</a>.</p> <p>@ViewData["Message"]</p> </div>
Bu kod, Web API projesinden döndürülen sayacın değerini görüntüler. Kullanıcı sayfaya her eriştiğinde veya sayfayı yenilediğinde artar.
Docker Compose desteği ekleme
WebFrontEnd
projesinde, > Kapsayıcı Düzenleyici Desteği ekleyin. Docker Destek Seçenekleri iletişim kutusu görüntülenir.Docker Compose'u seçin.
Visual Studio 17.12 ve sonraki sürümleri WebFrontEnd projesi için yapı iskelesi seçeneklerini seçin.
Visual Studio 17.11 ve önceki sürümleri Linux gibi Hedef işletim sisteminizi seçin.
Visual Studio, çözümdeki docker-compose düğümünde bir
.dockerignore
dosyası ve bir dosyası oluşturur ve bu proje, başlangıç projesi olduğunu gösteren kalın yazı tipinde gösterilir.docker-compose.yml aşağıdaki gibi görünür:
services: webfrontend: image: ${DOCKER_REGISTRY-}webfrontend build: context: . dockerfile: WebFrontEnd/Dockerfile
.dockerignore
dosyası, Docker'ın kapsayıcıya eklemesini istemediğiniz dosya türlerini ve uzantılarını içerir. Bu dosyalar genellikle geliştirmekte olduğunuz uygulamanın veya hizmetin bir parçası değil, geliştirme ortamı ve kaynak denetimiyle ilişkilendirilir.Çalıştırılan komutların ayrıntıları için çıkış bölmesinin Kapsayıcı Araçları bölümüne bakın. Çalışma zamanı kapsayıcılarını yapılandırmak ve oluşturmak için
docker-compose
komut satırı aracının kullanıldığını görebilirsiniz.Web API projesinde, proje düğümüne yeniden sağ tıklayın ve Ekle>Kapsayıcı Düzenleyicisi Desteğiseçin. Docker Composeöğesini seçin ve ardından aynı hedef işletim sistemini seçin.
Not
Bu adımda Visual Studio bir Dockerfile oluşturmayı teklif edecektir. Bunu zaten Docker desteği olan bir projede yaparsanız, mevcut Dockerfile dosyasının üzerine yazmak isteyip istemediğiniz sorulur. Dockerfile dosyanızda saklamak istediğiniz değişiklikler yaptıysanız hayır'ı seçin.
Visual Studio,
docker-compose
YML dosyanızda bazı değişiklikler yapar. Artık her iki hizmet de dahil edilir.services: webfrontend: image: ${DOCKER_REGISTRY-}webfrontend build: context: . dockerfile: WebFrontEnd/Dockerfile mywebapi: image: ${DOCKER_REGISTRY-}mywebapi build: context: . dockerfile: MyWebAPI/Dockerfile
önbelleği
docker-compose.yml
dosyasına ekleyin:redis: image: redis
Girintinin diğer iki hizmetle aynı düzeyde olduğundan emin olun.
(Visual Studio 17.13 veya üzeri) Bağımlı hizmetler yaygın bir sorunu gösterir. Ön ucun ana sayfasındaki HTTP isteği,
mywebapi
hizmeti web isteklerini almaya hazır olmadan hemen uygulama başlatmada çalıştırılabilir. Visual Studio 17.13 veya sonraki bir sürümünü kullanıyorsanız, docker Compose özelliklerinidepends_on
vehealthcheck
kullanarak projelerin doğru sırada başlamasını sağlayabilir ve gerektiğinde isteklere hizmet vermeye hazır olmalarını sağlayabilirsiniz. Bkz. Docker Compose - Başlangıç sırası.services: webfrontend: image: ${DOCKER_REGISTRY-}webfrontend depends_on: mywebapi: condition: service_healthy build: context: . dockerfile: WebFrontEnd/Dockerfile mywebapi: image: ${DOCKER_REGISTRY-}mywebapi depends_on: redis: condition: service_started healthcheck: test: curl --fail http://mywebapi:8080/Counter || exit 1 interval: 20s timeout: 20s retries: 5 build: context: . dockerfile: MyWebAPI/Dockerfile redis: image: redis
Bu örnekte sistem durumu denetimi, hizmetin istekleri işlemeye hazır olduğunu doğrulamak için
curl
kullanır. Kullandığınız görüntüdecurl
yüklü değilse, yüklemek için MyWebAPI Dockerfile dosyasınınbase
aşamasına satırlar eklemeniz gerekmektedir. Bu adım yükseltilmiş ayrıcalıklar gerektirir, ancak burada gösterildiği gibi yükledikten sonra normal kullanıcı ayrıcalıklarını geri yükleyebilirsiniz (bu örnekte kullanılan Debian görüntüleri için):USER root RUN apt-get update && apt-get install -y curl USER $APP_UID
Not
Alpine gibi
apt-get
desteklemeyen bir Linux dağıtımı kullanıyorsanız bunun yerineRUN apk --no-cache add curl
deneyin.Bu Docker Compose özellikleri, Docker Compose proje dosyasında (
.dcproj
) bir özellik ayarı gerektirir.DependencyAwareStart
özelliğini true olarak ayarlayın:<PropertyGroup> <!-- existing properties --> <DependencyAwareStart>true</DependencyAwareStart> </PropertyGroup>
Bu özellik, hizmet bağımlılığı özelliklerini destekleyen hata ayıklama için kapsayıcıları başlatmanın farklı bir yolunu etkinleştirir.
Bu değişikliklerle,
webfrontend
hizmetimywebapi
başlatılıp bir web isteğini başarıyla işleyene kadar başlatılmaz.Kapsayıcı düzenlemesini eklediğiniz ilk proje, çalıştırdığınızda veya hata ayıkladığınızda başlatılacak şekilde ayarlanır. Başlatma eylemini Docker Compose projesi için Proje Özellikleri yapılandırabilirsiniz. Docker Compose proje düğümünde, bağlam menüsünü açmak için sağ tıklayın ve ardından Özelliklerseçin veya Alt+Enterkullanın. Örneğin, Hizmeti URL'si özelliğini özelleştirerek yüklenen sayfayı değiştirebilirsiniz.
F5tuşlarına basın. Başlatıldığında şunları görürsünüz:
kapsayıcıları Kapsayıcılar penceresini kullanarak izleyebilirsiniz. Pencereyi görmüyorsanız, arama kutusunu kullanın, Ctrl+Ktuşlarına basın, Ctrl +veya Ctrl+Qtuşlarına basın. Özellik aramaaltında,
containers
aramasını yapın ve >Diğer Windows>Kapsayıcıları Görüntüle'yi listeden seçin.Çözüm Kapsayıcıları düğümünü genişletin ve Docker Compose projenizin düğümünü seçerek bu pencerenin Günlükler sekmesinde birleştirilmiş günlükleri görüntüleyin.
Günlükleri, ortam değişkenlerini, dosya sistemini ve diğer ayrıntıları görüntülemek için tek bir kapsayıcının düğümünü de seçebilirsiniz.
Başlatma profillerini ayarlama
Bu çözümde Azure Cache for Redis bulunmaktadır, ancak her hata ayıklama oturumunu başlattığınızda önbellek konteynerini her seferinde yeniden oluşturmak verimli değildir. Bu durumu önlemek için birkaç başlatma profili ayarlayabilirsiniz. Redis için Azure Cache'i başlatmak için bir profil oluşturun. Diğer hizmetleri başlatmak için ikinci bir profil oluşturun. İkinci profil, zaten çalışmakta olan önbellek kapsayıcısını kullanabilir. Menü çubuğunda, başlangıç düğmesinin yanındaki açılan listeyi kullanarak hata ayıklama seçeneklerini içeren bir menü açabilirsiniz. Docker Compose Başlatma Ayarlarını Yönetseçin.
Docker Compose Başlatma Ayarlarını Yönet iletişim kutusu açılır. Bu iletişim kutusuyla, bir hata ayıklama oturumu sırasında hangi hizmet alt kümesinin başlatıldığını, hangilerinin hata ayıklayıcı ekli veya eklenmemiş olarak başlatıldığını ve başlatma hizmeti ile URL'sini denetleyebilirsiniz. Bkz. Compose hizmetleri alt kümesini başlatma.
Yeni seçin, yeni bir profil oluşturmak ve onu
Start Redis
olarak adlandırın. Ardından, Redis kapsayıcısını hata ayıklamadan başlatolarak ayarlayın, diğer kapsayıcıyı başlatmaolarak bırakın ve Kaydetseçeneğini seçin.Ardından Redis'i başlatmayan ancak diğer iki hizmeti başlatan başka bir profil
Start My Services
oluşturun.(İsteğe bağlı) Her şeyi başlatmak için üçüncü bir profil
Start All
oluşturun. Redis için hata ayıklamadan Başlat'ı seçebilirsiniz.Visual Studio'nun ana araç çubuğundaki açılır listeden Redis'i Başlat seçin. Redis kapsayıcısı hata ayıklama olmadan derlenir ve başlatılır. Kapsayıcıları penceresini kullanarak çalıştığını görebilirsiniz. Ardından, açılan listeden Hizmetlerimi Başlat seçin ve başlatmak için F5 basın. Artık önbellek kapsayıcısını sonraki birçok hata ayıklama oturumu boyunca çalışır durumda tutabilirsiniz. Hizmetlerimi Başlatkullandığınızda, bu hizmetler aynı önbellek kapsayıcısını kullanır.
Tebrikler, özel docker Compose profiline sahip bir Docker Compose uygulaması çalıştırıyorsunuz.
Sonraki adımlar
kapsayıcılarınızı Azure'e dağıtma seçeneklerine bakın. Azure Container Apps'e dağıtmaya hazırsanız bkz. Azure Container Apps'e çok kapsayıcılı uygulama dağıtma.