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 gibi bir orkestratör gerekir. 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-samplesklasöründe bulunabilir.
Önkoşullar
- Docker Desktop
- ASP.NET ve web geliştirme, Azure geliştirme iş yükü ve/veya .NET platformlar arası geliştirme iş yükü yüklü Visual Studio. Bu yükleme .NET SDK'sını içerir.
- Docker Desktop
- ASP.NET ve web geliştirme, Azure geliştirme iş yükü ve/veya .NET platformlar arası geliştirme iş yükü yüklü Visual Studio. Bu yükleme .NET SDK'sı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. İşlemin ilerleyen bölümlerinde kapsayıcı desteği eklersiniz.
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.
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
WebFrontEndHTTPS'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.StackExchangeRedisekleyin (StackExchange.Redisdeğ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.csveMicrosoft.Extensions.Caching.DistributediçinMicrosoft.Extensions.Caching.StackExchangeRedisusing yönergelerini ekleyin.using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Caching.StackExchangeRedis;Web API projesinde, mevcut
WeatherForecast.csve 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
WebFrontEndprojesinde Index.cshtml.cs dosyasını açın veOnGetyö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
HttpClientatmamalı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.cshtmldosyası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
WebFrontEndprojesinde, > 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
.dockerignoredosyası 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.dockerignoredosyası, 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-composekomut 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-composeYML 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.ymldosyasına ekleyin:redis: image: redisGirintinin 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,
mywebapihizmeti 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_onvehealthcheckkullanarak 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: redisBu örnekte sistem durumu denetimi, hizmetin istekleri işlemeye hazır olduğunu doğrulamak için
curlkullanır. Kullandığınız görüntüdecurlyüklü değilse, yüklemek için MyWebAPI Dockerfile dosyasınınbaseaş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_UIDNot
Alpine gibi
apt-getdesteklemeyen bir Linux dağıtımı kullanıyorsanız bunun yerineRUN apk --no-cache add curldeneyin.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,
webfrontendhizmetimywebapibaş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,
containersaraması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 Redisolarak 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 Servicesoluşturun.
(İsteğe bağlı) Her şeyi başlatmak için üçüncü bir profil
Start Alloluş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.