Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Neste tutorial, você aprenderá a gerenciar mais de um contêiner e se comunicar entre eles ao usar as Ferramentas de Contêiner no Visual Studio. Gerir múltiplos contentores requer orquestração de contentores e requer um orquestrador como o Docker Compose. Para esses procedimentos, use o Docker Compose. O Docker Compose é ótimo para depuração e testes locais durante o ciclo de desenvolvimento.
O exemplo completo que você cria neste tutorial pode ser encontrado no GitHub em https://github.com/MicrosoftDocs/vs-tutorial-samples na pasta docker/ComposeSample.
Pré-requisitos
- Área de trabalho do Docker
- Visual Studio com a carga de trabalho de desenvolvimento ASP.NET e Web, carga de trabalho de desenvolvimento do Azure e/ou carga de trabalho de desenvolvimento de plataforma cruzada .NET instalada. Esta instalação inclui o SDK do .NET.
- Área de trabalho do Docker
- Visual Studio com a carga de trabalho de desenvolvimento ASP.NET e Web, carga de trabalho de desenvolvimento do Azure e/ou carga de trabalho de desenvolvimento de plataforma cruzada .NET instalada. Esta instalação inclui o SDK do .NET.
Criar um projeto de aplicativo Web
No Visual Studio, crie um projeto ASP.NET Core Web App, chamado WebFrontEnd, para criar um aplicativo Web com páginas Razor.
Não selecione Ativar suporte a contêineres. Você adiciona suporte a contêiner mais tarde no processo.
Criar um projeto de API Web
Adicione um projeto à mesma solução e chame-o MyWebAPI. Selecione API como o tipo de projeto e desmarque a caixa de seleção Configurar para HTTPS.
Observação
Neste design, estamos usando apenas HTTPS para comunicação com o cliente, não para comunicação entre contêineres no mesmo aplicativo Web. Somente
WebFrontEndprecisa de HTTPS e o código nos exemplos pressupõe que você tenha desmarcado essa caixa de seleção. Em geral, os certificados de desenvolvedor .NET usados pelo Visual Studio são suportados apenas para solicitações de contêiner externo, não para solicitações de contêiner para contêiner.
Adicione suporte para o Cache do Azure para Redis. Adicione o pacote NuGet
Microsoft.Extensions.Caching.StackExchangeRedis(nãoStackExchange.Redis). Em Program.cs, adicione as seguintes linhas, imediatamente antes devar app = builder.Build():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"; });Adicione diretivas de uso no
Program.csparaMicrosoft.Extensions.Caching.DistributedeMicrosoft.Extensions.Caching.StackExchangeRedis.using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Caching.StackExchangeRedis;No projeto de API da Web, exclua os
WeatherForecast.csexistentes e Controllers/WeatherForecastController.cse adicione um arquivo em Controllers, CounterController.cs, com o seguinte conteúdo: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; } } }O serviço incrementa um contador sempre que a página é acessada e armazena o contador no cache.
Adicionar código para chamar a API Web
No projeto
WebFrontEnd, abra o arquivo Index.cshtml.cs e substitua o métodoOnGetpelo código a seguir.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}"; } }Observação
No código do mundo real, você não deve descartar
HttpClientapós cada solicitação. Para obter práticas recomendadas, consulte Usar HttpClientFactory para implementar solicitações HTTP resilientes.O URI fornecido faz referência a um nome de serviço definido no arquivo docker-compose.yml. O Docker Compose configura uma rede padrão para comunicação entre contêineres usando os nomes de serviço listados como hosts.
O código mostrado aqui funciona com o .NET 8 e posterior, que configura uma conta de usuário no Dockerfile sem privilégios de administrador e expõe a porta 8080 porque a porta padrão HTTP 80 não é acessível sem privilégios elevados.
No arquivo
Index.cshtml, adicione uma linha para exibirViewData["Message"]para que o arquivo se pareça com o seguinte código:@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>Esse código exibe o valor do contador retornado do projeto de API Web. Ele aumenta sempre que o usuário acessa ou atualiza a página.
Adicionar suporte ao Docker Compose
No projeto
WebFrontEnd, escolha Adicionar Suporte ao Orquestrador de Contentores >. A caixa de diálogo Docker Support Options é exibida.Escolha Docker Compose.
Visual Studio 17.12 e posterior Escolha as opções de andaime para o projeto WebFrontEnd.
Visual Studio 17.11 e versões anteriores Escolha seu sistema operacional de destino, por exemplo, Linux.
O Visual Studio cria um ficheiro docker-compose.yml e um ficheiro
.dockerignoreno nó docker-compose na solução, e este projeto é exibido em negrito, o que mostra que é o projeto de inicialização.
O docker-compose.yml aparece da seguinte forma:
services: webfrontend: image: ${DOCKER_REGISTRY-}webfrontend build: context: . dockerfile: WebFrontEnd/DockerfileO arquivo
.dockerignorecontém tipos de arquivo e extensões que você não deseja que o Docker inclua no contêiner. Esses arquivos geralmente estão associados ao ambiente de desenvolvimento e ao controle do código-fonte, não fazendo parte do aplicativo ou serviço que você está desenvolvendo.Consulte a seção Ferramentas de Contêiner do painel de saída para obter detalhes dos comandos em execução. Você pode ver que a ferramenta de linha de comando
docker-composeé utilizada para configurar e criar os contentores de tempo de execução.No projeto de API Web, clique novamente com o botão direito do mouse no nó do projeto e escolha Adicionar>Suporte para Orquestrador de Contêineres. Escolha Docker Composee, em seguida, selecione o mesmo SO de destino.
Observação
Nesta etapa, o Visual Studio oferecerá a criação de um Dockerfile. Se você fizer isso em um projeto que já tenha suporte ao Docker, será perguntado se deseja substituir o Dockerfile existente. Se você fez alterações no Dockerfile que deseja manter, escolha não.
Visual Studio faz algumas alterações em seu arquivo YML
docker-compose. Agora ambos os serviços estão incluídos.services: webfrontend: image: ${DOCKER_REGISTRY-}webfrontend build: context: . dockerfile: WebFrontEnd/Dockerfile mywebapi: image: ${DOCKER_REGISTRY-}mywebapi build: context: . dockerfile: MyWebAPI/DockerfileAdicione o cache ao arquivo
docker-compose.yml:redis: image: redisVerifique se o recuo está no mesmo nível dos outros dois serviços.
(Visual Studio 17.13 ou posterior) Os serviços dependentes demonstram um problema comum. A solicitação HTTP na página principal do front-end pode ser executada imediatamente na inicialização do aplicativo, antes que o serviço
mywebapiesteja pronto para receber solicitações da Web. Se você estiver usando o Visual Studio 17.13 ou posterior, poderá usar os recursos de composição do Dockerdepends_onehealthcheckem docker-compose.yml para fazer com que os projetos comecem na sequência certa e que eles estejam prontos para atender às solicitações quando necessário. Consulte Docker Compose - Ordem de inicialização.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: redisNeste exemplo, a verificação de integridade usa
curlpara verificar se o serviço está pronto para processar solicitações. Se a imagem que você está usando não tivercurlinstalada, adicione linhas aobaseestágio do MyWebAPI Dockerfile para instalá-la. Este passo requer privilégios elevados, mas você pode restaurar os privilégios de usuário normais depois de instalá-lo como mostrado aqui (para as imagens Debian usadas neste exemplo):USER root RUN apt-get update && apt-get install -y curl USER $APP_UIDObservação
Se você estiver usando uma distro Linux, como a Alpine, que não suporta
apt-get, tenteRUN apk --no-cache add curlem vez disso.Esses recursos do Docker Compose exigem uma configuração de propriedade no arquivo de projeto Docker Compose (
.dcproj). Defina a propriedadeDependencyAwareStartcomo true:<PropertyGroup> <!-- existing properties --> <DependencyAwareStart>true</DependencyAwareStart> </PropertyGroup>Essa propriedade ativa uma maneira diferente de iniciar os contentores para depuração que suporta as funcionalidades de dependência de serviço.
Com estas alterações, o serviço
webfrontendnão será iniciado até quemywebapicomece e processe com sucesso um pedido web.O primeiro projeto ao qual adicionas a orquestração de contentores configura-se para ser iniciado quando o executas ou depuras. Você pode configurar a ação de arranque nas Propriedades do Projeto para o projeto Docker Compose. No nó do projeto Docker Compose, clique com o botão direito do mouse para abrir o menu de contexto e escolha Propriedadesou use Alt+Enter. Por exemplo, pode-se alterar a página que é carregada personalizando a propriedade URL do Serviço.
Pressione F5. Veja o que você vê quando é lançado:
Você pode monitorar os contêineres usando a janela Containers. Se não vir a janela, utilize a caixa de pesquisa, prima Ctrl+K, Ctrl+Oou prima Ctrl+Q. Em de pesquisa de recursos , procure
containerse escolha Exibir>Outros Contêineres do Windows> na lista.Expanda o nó Contêineres de Solução e escolha o nó do seu projeto Docker Compose para exibir logs combinados na aba Logs desta janela.
Você também pode selecionar o nó de um contêiner individual para exibir logs, variáveis de ambiente, o sistema de arquivos e outros detalhes.
Configurar perfis de inicialização
Esta solução inclui um Azure Cache para Redis, mas não é eficiente reconstruir o container de cache sempre que se inicia uma sessão de depuração. Para evitar essa situação, você pode configurar alguns perfis de inicialização. Crie um perfil para iniciar o Cache do Azure para Redis. Crie um segundo perfil para iniciar os outros serviços. O segundo perfil pode usar o contêiner de cache que já está em execução. Na barra de menus, pode-se usar a lista suspensa ao lado do botão Iniciar para abrir um menu com opções de depuração. Selecione Gerir definições de arranque do Docker Compose.
A caixa de diálogo Manage Docker Compose Launch Settings é exibida. Com essa caixa de diálogo, você pode controlar qual subconjunto de serviços é iniciado durante uma sessão de depuração, que são iniciados com ou sem o depurador anexado, e o serviço de inicialização e a URL. Consulte iniciar um subconjunto de serviços Compose.
Escolha Novo para criar um novo perfil e nomeie-o
Start Redis. Em seguida, defina o contêiner Redis como Iniciar sem depurar, deixe o outro conjunto como Não iniciare escolha Salvar.
Em seguida, crie outro perfil
Start My Servicesque não inicie o Redis, mas inicie os outros dois serviços.
(Opcional) Crie um terceiro perfil
Start Allpara começar tudo. Você pode escolher Iniciar sem depurar para Redis.Escolha Iniciar Redis na lista suspensa na barra de ferramentas principal do Visual Studio. O contêiner Redis é compilado e iniciado sem depuração. Você pode usar a janela Contêineres para ver se a janela está em execução. Em seguida, escolha Iniciar Meus Serviços na lista suspensa e pressione F5 para iniciá-los. Agora você pode manter o contêiner de cache em execução durante muitas sessões de depuração subsequentes. Sempre que você usa Iniciar Meus Serviços, esses serviços usam o mesmo contêiner de cache.
Parabéns, você está executando um aplicativo Docker Compose com um perfil personalizado do Docker Compose.
Próximos passos
Veja as opções para implantar seus contêineres de no Azure. Se estiver pronto para implantar no Azure Container Apps, consulte Implantar um aplicativo de vários contêineres no Azure Container Apps.