Öğ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

Web Uygulaması projesi oluşturma

Visual Studio'da, Razor sayfalarıyla bir web uygulaması oluşturmak için adlı WebFrontEndbir ASP.NET Core Web App projesi oluşturun.

Screenshot showing Create ASP.NET Core Web App project.

Docker Desteğini Etkinleştir'i seçmeyin. İşlemin ilerleyen bölümlerinde Docker desteği ekleyebilirsiniz.

Screenshot of the Additional information screen when creating a web project. The option to Enable Docker Support is not selected.

Dekont

Visual Studio 2022 17.2 ve sonraki sürümlerinde, bunun yerine bu proje için Azure İşlevleri kullanabilirsiniz.

Screenshot showing Create ASP.NET Core Web App project.

Docker Desteğini Etkinleştir'i seçmeyin. İşlemin ilerleyen bölümlerinde Docker desteği ekleyebilirsiniz.

Screenshot of the Additional information screen when creating a web project. The option to Enable Docker Support is not selected.

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.

Screenshot of creating the Web API project.

  1. 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.

    Screenshot of creating the Web API project.

  2. Redis Cache için destek ekleyin. NuGet paketini Microsoft.Extensions.Caching.StackExchangeRedis ekleyin (değil StackExchange.Redis). Program.cs'de, hemen önce var 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";
       });
    
  3. ve Microsoft.Extensions.Caching.StackExchangeRedisiçin Microsoft.Extensions.Caching.Distributed Program.cs dosyasına using yönergelerini ekleyin.

    using Microsoft.Extensions.Caching.Distributed;
    using Microsoft.Extensions.Caching.StackExchangeRedis;
    
  4. 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

  1. 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.

  2. 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>
    
  3. (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

  1. Projede WebFrontEnd Kapsayıcı Düzenleyici Desteği Ekle'yi > seçin. Docker Destek Seçenekleri iletişim kutusu görüntülenir.

  2. Docker Compose'u seçin.

  3. Hedef işletim sisteminizi (örneğin, Linux) seçin.

    Screenshot of choosing the Target OS.

    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.

    Screenshot of Solution Explorer with docker-compose project added.

    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.

  4. 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
    
  5. 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.

    Screenshot of docker-compose project properties.

    Başlatıldığında şunları görürsünüz (.NET Core 2.x sürümü):

    Screenshot of running web app.

    .NET 3.1 için web uygulaması, hava durumu verilerini JSON biçiminde gösterir.

  6. Ş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.

    Screenshot of Debug Manage Compose Settings menu item.

    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.

    Screenshot of Manage Docker Compose Launch Settings dialog box.

    Yeni bir profil oluşturmak için Yeni'yi seçin ve adını verinDebug 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.

  7. 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.

  1. 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.

  2. 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

  1. Projede WebFrontEnd Kapsayıcı Düzenleyici Desteği Ekle'yi > seçin. Docker Destek Seçenekleri iletişim kutusu görüntülenir.

  2. Docker Compose'u seçin.

  3. Hedef işletim sisteminizi (örneğin, Linux) seçin.

    Screenshot of choosing the Target OS.

    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.

    Screenshot of Solution Explorer with docker-compose project added.

    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.

  4. 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
    
  5. Dosyaya Redis önbelleğini docker.compose.yml ekleyin:

    redis:
       image: redis
    

    Girintinin diğer iki hizmetle aynı düzeyde olduğundan emin olun.

  6. 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.

    Screenshot of docker-compose project properties.

  7. F5 tuşuna basın. Başlatıldığında şunları görürsünüz:

    Screenshot of running web app.

  8. 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 containersve listeden Diğer Windows>Kapsayıcılarını Görüntüle'yi>seçin.

  9. Çö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.

    Screenshot showing viewing the Logs tab in the Containers window.

    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

  1. 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.

    Screenshot of Debug Manage Compose Settings menu item.

    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.

    Screenshot of Manage Docker Compose Launch Settings dialog box.

    Yeni bir profil oluşturmak için Yeni'yi seçin ve adını verinStart 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.

    Screenshot showing creating the Redis profile that starts the Redis service only.

    Ardından Redis'i başlatmayan ancak diğer iki hizmeti başlatan başka bir profil Start My Services oluşturun.

    Screenshot showing creating the Services profile that starts the other services.

    (İ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.

  2. 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.

Ayrıca bkz.

Docker Compose
Kapsayıcı Araçları