Tworzenie aplikacji z wieloma kontenerami przy użyciu narzędzia Docker Compose

Z tego samouczka dowiesz się, jak zarządzać więcej niż jednym kontenerem i komunikować się między nimi przy użyciu Docker Compose w Visual Studio dla komputerów Mac.

Wymagania wstępne

Tworzenie aplikacji ASP.NET Core i dodawanie obsługi platformy Docker

  1. Utwórz nowe rozwiązanie, przechodząc do > Nowe rozwiązanie.
  2. W obszarze Sieć Web > aplikacja konsolowa wybierz szablon Aplikacja internetowa:  Tworzenie nowej ASP.NET aplikacji internetowej
  3. Wybierz platformę docelową. W tym przykładzie użyjemy programu .NET Core 3.1:  Ustaw platformę docelową
  4. Wprowadź szczegóły projektu, takie jak Project (w tym przykładzie DockerDemoFrontEnd) i Nazwa rozwiązania (DockerDemo). Utworzony projekt zawiera wszystkie podstawowe informacje potrzebne do skompilowania i uruchomienia ASP.NET Core internetowej.
  5. W oknie rozwiązania kliknij prawym przyciskiem myszy projekt DockerDemoFrontEnd i wybierz polecenie Dodaj > Dodaj obsługę platformy Docker: Dodaj obsługę  platformy Docker

Visual Studio dla komputerów Mac automatycznie doda nowy projekt do rozwiązania o nazwie docker-compose i doda plik Dockerfile do istniejącego projektu.

Tworzenie interfejsu API ASP.NET Core i dodawanie obsługi platformy Docker

Następnie utworzymy drugi projekt, który będzie działać jako interfejs API zaplecza. Szablon interfejsu API platformy .NET Core zawiera kontroler, który umożliwia obsługę żądań RESTful.

  1. Dodaj nowy projekt do istniejącego rozwiązania, klikając rozwiązanie prawym przyciskiem myszy i wybierając polecenie Dodaj > Dodaj nowy Project .
  2. W obszarze Sieć Web > aplikacja wybierz szablon interfejsu API.
  3. Wybierz platformę docelową. W tym przykładzie użyjemy .NET Core 3.1.
  4. Wprowadź szczegóły projektu, takie jak Project Name (MyWebAPI w tym przykładzie).
  5. Po utworzeniu przejdź do okna rozwiązania, kliknij prawym przyciskiem myszy projekt MyWebAPI i wybierz polecenie Dodaj > Dodaj obsługę platformy Docker.

Plik docker-compose.yml w projekcie docker-compose zostanie automatycznie zaktualizowany, aby uwzględnić projekt interfejsu API obok istniejącego projektu aplikacji internetowej. Podczas kompilowania i uruchamiania projektu docker-compose każdy z tych projektów zostanie wdrożony w osobnym kontenerze platformy Docker.

version: '3.4'

services:
  dockerdemofrontend:
    image: ${DOCKER_REGISTRY-}dockerdemofrontend
    build:
      context: .
      dockerfile: DockerDemoFrontEnd/Dockerfile

  mywebapi:
    image: ${DOCKER_REGISTRY-}mywebapi
    build:
      context: .
      dockerfile: MyWebAPI/Dockerfile

Integrowanie dwóch kontenerów

Mamy teraz dwa projekty ASP.NET w naszym rozwiązaniu i oba są skonfigurowane z obsługą platformy Docker. Teraz musimy dodać kod!

  1. W DockerDemoFrontEnd projekcie otwórz plik Pages/Index.cshtml.cs i zastąp OnGet metodę następującym kodem:

     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");
           var response = await client.SendAsync(request);
           ViewData["Message"] += " and " + await response.Content.ReadAsStringAsync();
        }
     }
    

    Uwaga

    W kodzie produkcyjnym nie należy usuwać HttpClient po każdym żądaniu. Aby uzyskać najlepsze rozwiązania, zobacz Use HttpClientFactory to implement resilient HTTP requests (Implementowanie odpornych żądań HTTP za pomocą metody HttpClientFactory).

  2. W pliku Index.cshtml dodaj wiersz do wyświetlenia, aby ViewData["Message"] plik wyglądał podobnie do następującego kodu:

    @page
    @model IndexModel
    @{
        ViewData["Title"] = "Home page";
    }
    
    <div class="text-center">
        <h1 class="display-4">Welcome</h1>
        <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
        <p>@ViewData["Message"]</p>
    </div>
    
  3. W projektach frontonu i interfejsu API sieci Web należy skomentować wywołanie metody Microsoft.AspNetCore.Builder.HttpsPolicyBuilderExtensions.UseHttpsRedirection w metodzie Configure w plikach Startup.cs, ponieważ ten przykładowy kod używa protokołu HTTP, a nie HTTPS, do wywołania internetowego interfejsu API.

                //app.UseHttpsRedirection();
    
  4. Ustaw projekt jako projekt startowy i przejdź do opcji Uruchom > docker-compose Rozpocznij debugowanie. Jeśli wszystko jest poprawnie skonfigurowane, zostanie wyświetlony komunikat "Hello from webfrontend and webapi (with value 1)" (Witaj z webfrontend i webapi (z wartością 1).":

Uruchomione rozwiązanie docker z wieloma kontenerami