Öğretici: Docker Compose ile çok kapsayıcılı uygulama oluşturma
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ı düzenlemesi gerekir ve Docker Compose veya Service Fabric gibi bir düzenleyici 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ış örneği GitHub'da https://github.com/MicrosoftDocs/vs-tutorial-samples docker/ComposeSample klasöründe bulabilirsiniz.
Önkoşullar
- Docker Desktop
- Web Geliştirme, Azure Araçları iş yükü ve/veya .NET platformlar arası geliştirme iş yükü yüklü Visual Studio 2022. 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
bir ASP.NET Core Web App projesi oluşturun.
Docker Desteğini Etkinleştir'i seçmeyin. İşlemin ilerleyen bölümlerinde Docker desteği ekleyebilirsiniz.
Dekont
Visual Studio 2022 17.2 ve sonraki sürümlerinde, bunun yerine bu proje için Azure İşlevleri kullanabilirsiniz.
Docker Desteğini Etkinleştir'i seç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'yi 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 gerekir ve örneklerdeki kod, bu onay kutusunu temizlemiş olduğunuzu varsayar. Genel olarak, Visual Studio tarafından kullanılan .NET geliştirici sertifikaları kapsayıcıdan kapsayıcıya istekler için değil yalnızca dışarıdan kapsayıcıya istekler için desteklenir.
Aynı çözüme bir proje ekleyin ve WebAPI olarak adlandırın. Proje türü olarak API'yi 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 gerekir ve örneklerdeki kod, bu onay kutusunu temizlemiş olduğunuzu varsayar. Genel olarak, Visual Studio tarafından kullanılan .NET geliştirici sertifikaları kapsayıcıdan kapsayıcıya istekler için değil yalnızca dışarıdan kapsayıcıya istekler için desteklenir.Redis Cache için destek ekleyin. NuGet paketini
Microsoft.Extensions.Caching.StackExchangeRedis
ekleyin (değilStackExchange.Redis
). Program.cs'de, hemen öncevar app = builder.Build()
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"; });
ve
Microsoft.Extensions.Caching.StackExchangeRedis
içinMicrosoft.Extensions.Caching.Distributed
Program.cs dosyasına using yönergelerini ekleyin.using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Caching.StackExchangeRedis;
Web API projesinde, mevcut WeatherForecast.cs ve Controllers/WeatherForecastController.cs dosyasını silin ve Controllers, CounterController.cs altına aşağıdaki içeriği içeren bir 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ı Redis önbelleğinde depolar.
Web API'sini çağırmak için kod ekleme
Projede
WebFrontEnd
Index.cshtml.cs dosyasını açın ve yöntemini aşağıdaki kodla değiştirinOnGet
.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(); } }
Dekont
Gerçek dünya kodunda, her istekten sonra atmamanız
HttpClient
gerekir. En iyi yöntemler için bkz . Dayanıklı HTTP isteklerini uygulamak için HttpClientFactory kullanma.Index.cshtml dosyasında, dosyanın aşağıdaki koda benzemesi için görüntülenecek
ViewData["Message"]
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'den 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 + ")"; }
Dekont
.NET Core 3.1 ve sonraki sürümlerinde, bu ek kod yerine sağlanan WeatherForecast API'sini kullanabilirsiniz. Ancak, kod https yerine çağrı yapmak için UseHttpsRedirection HTTP kullandığından, Web API projesinde çağrısı açıklama satırı yapmanız gerekir.
//app.UseHttpsRedirection();
Docker Compose desteği ekleme
Projede
WebFrontEnd
Kapsayıcı Düzenleyici Desteği Ekle'yi > seçin. 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 docker-compose.yml dosyası ve .dockerignore dosyası oluşturur ve bu proje başlangıç projesi olduğunu gösteren kalın yazı tipi yazı tipinde gösterilir.
Docker-compose.yml aşağıdaki gibi görünür:
version: '3.4' services: webfrontend: image: ${DOCKER_REGISTRY-}webfrontend build: context: . dockerfile: WebFrontEnd/Dockerfile
version
İlk satırda belirtilen Docker Compose dosya sürümüdür. 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 Kapsayıcı Düzenleyicisi Desteği Ekle'yi>seçin. Docker Compose'u ve ardından aynı hedef işletim sistemini seçin.
Dekont
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.
version: '3.4' 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 projesinin Proje Özellikleri'nde yapılandırabilirsiniz. Docker-compose proje düğümünde sağ tıklayarak bağlam menüsünü açın ve özellikler'i seçin 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, Hizmet 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şlangıç düğmesinin yanındaki açılan menüyü kullanarak hata ayıklama seçenekleri menüsünü açabilirsiniz; Docker Compose Başlatma Ayarlar Yönet'i seçin.
Docker Compose Başlatmayı Yönet Ayarlar 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. Oluşturma hizmetlerinin bir alt kümesini başlatma.
Yeni bir profil oluşturmak için Yeni'yi seçin ve adını verin
Debug WebFrontEnd only
. Ardından, Web API projesini Hata ayıklama olmadan başlat olarak ayarlayın, WebFrontEnd projesini hata ayıklamayla başlayacak şekilde bırakın ve Kaydet'i seçin.Yeni yapılandırma, sonraki F5 için varsayılan olarak seçilir.
Beklediğiniz gibi çalıştığını onaylamak için F5 tuşuna basın.
Tebrikler, özel docker Compose profiline sahip bir Docker Compose uygulaması çalıştırıyorsunuz.
Projede
WebFrontEnd
Index.cshtml.cs dosyasını açın ve yöntemini aşağıdaki kodla değiştirinOnGet
.public async Task OnGet() { using (var client = new System.Net.Http.HttpClient()) { // Call *mywebapi*, and display its response in the page var request = new System.Net.Http.HttpRequestMessage(); // webapi is the container name request.RequestUri = new Uri("http://webapi/Counter"); var response = await client.SendAsync(request); string counter = await response.Content.ReadAsStringAsync(); ViewData["Message"] = $"Counter value from cache :{counter}"; } }
Dekont
Gerçek dünya kodunda, her istekten sonra atmamanız
HttpClient
gerekir. En iyi yöntemler için bkz . Dayanıklı HTTP isteklerini uygulamak için HttpClientFactory kullanma.Index.cshtml dosyasında, dosyanın aşağıdaki koda benzemesi için görüntülenecek
ViewData["Message"]
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.
Docker Compose desteği ekleme
Projede
WebFrontEnd
Kapsayıcı Düzenleyici Desteği Ekle'yi > seçin. 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 docker-compose.yml dosyası ve .dockerignore dosyası oluşturur ve bu proje başlangıç projesi olduğunu gösteren kalın yazı tipi yazı tipinde gösterilir.
Docker-compose.yml aşağıdaki gibi görünür:
version: '3.4' services: webfrontend: image: ${DOCKER_REGISTRY-}webfrontend build: context: . dockerfile: WebFrontEnd/Dockerfile
version
İlk satırda belirtilen Docker Compose dosya sürümüdür. 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 Kapsayıcı Düzenleyicisi Desteği Ekle'yi>seçin. Docker Compose'u ve ardından aynı hedef işletim sistemini seçin.
Dekont
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.
version: '3.4' services: webfrontend: image: ${DOCKER_REGISTRY-}webfrontend build: context: . dockerfile: WebFrontEnd/Dockerfile mywebapi: image: ${DOCKER_REGISTRY-}mywebapi build: context: . dockerfile: MyWebAPI/Dockerfile
Dosyaya Redis önbelleğini
docker.compose.yml
ekleyin:redis: image: redis
Girintinin diğer iki hizmetle aynı düzeyde olduğundan emin olun.
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 projesinin Proje Özellikleri'nde yapılandırabilirsiniz. Docker-compose proje düğümünde sağ tıklayarak bağlam menüsünü açın ve Özellikler'i seçin veya Alt+Enter'ı kullanın. Örneğin, Hizmet URL'si özelliğini özelleştirerek yüklenen sayfayı değiştirebilirsiniz.
F5 tuşuna basın. Başlatıldığında şunları görürsünüz:
Kapsayıcılar penceresini kullanarak kapsayıcıları izleyebilirsiniz. Pencereyi görmüyorsanız, arama kutusunu kullanın, Ctrl+K, Ctrl O veya Ctrl++Q tuşlarına basın. Özellik araması'nın altında öğesini arayın
containers
ve listeden Diğer Windows>Kapsayıcılarını Görüntüle'yi>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ümün bir Redis Cache'i vardır, ancak her hata ayıklama oturumu başlattığınızda Redis önbellek kapsayıcısını yeniden oluşturmak verimli değildir. Bu durumu önlemek için birkaç başlatma profili ayarlayabilirsiniz. Redis önbelleğini 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 Redis önbellek kapsayıcısını kullanabilir. Menü çubuğunda, başlangıç düğmesinin yanındaki açılan menüyü kullanarak hata ayıklama seçeneklerini içeren bir menü açabilirsiniz. Docker Compose Başlatma Ayarlar Yönet'i seçin.
Docker Compose Başlatmayı Yönet Ayarlar 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. Oluşturma hizmetlerinin bir alt kümesini başlatma.
Yeni bir profil oluşturmak için Yeni'yi seçin ve adını verin
Start Redis
. Ardından Redis kapsayıcısını Hata ayıklamadan başlat olarak ayarlayın, diğerini Başlatmayın olarak bırakın ve Kaydet'i 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ıklama olmadan başlat'ı seçebilirsiniz.Ana Visual Studio araç çubuğundaki açılan listeden Redis'i Başlat'ı seçin, F5 tuşuna basın. Redis kapsayıcısı derlenip 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 F5 tuşuna basarak başlatın. Artık Redis cache kapsayıcısını sonraki birçok hata ayıklama oturumu boyunca çalışır durumda tutabilirsiniz. Hizmetlerimi Başlat'ı her kullandığınızda, bu hizmetler aynı Redis ö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'a dağıtma seçeneklerine bakın.