Exercício – Personalizar uma imagem do Docker para executar seu aplicativo Web

Concluído

Um Dockerfile contém as etapas para criar uma imagem do Docker personalizada.

Você decide implantar um dos aplicativos Web da sua organização usando o Docker. Selecione um aplicativo Web simples que implemente uma API Web para um site de reservas em hotéis. A API Web expõe as operações HTTP POST e GET que criam e recuperam as reservas dos clientes.

Observação

Nesta versão do aplicativo Web, as reservas não são persistentes e as consultas retornam dados fictícios.

Neste exercício, você criará um Dockerfile para um aplicativo que não tenha um. Em seguida, você criará a imagem e a executará localmente.

Criar um Dockerfile para o aplicativo Web

  1. Se ele ainda não estiver em execução, inicie o Docker no computador.

  2. Na janela do prompt de comando do computador local, execute o seguinte comando para baixar o código-fonte do aplicativo Web.

    git clone https://github.com/MicrosoftDocs/mslearn-hotel-reservation-system.git
    
  3. Insira o comando a seguir para abrir o diretório src.

    cd mslearn-hotel-reservation-system/src
    
  4. No diretório src, insira os comandos a seguir para criar um arquivo Dockerfile e abri-lo no Bloco de notas:

    copy NUL Dockerfile
    notepad Dockerfile
    

    Observação

    Por padrão, o comando do bloco de notas abre um arquivo de texto. Salve esse arquivo com o tipo Todos os Arquivos e sem extensão de arquivo. Para verificar, abra a pasta src no Explorador de Arquivos, selecione Exibir > Mostrar > Extensões de nome de arquivo. Se necessário, renomeie o arquivo e remova .txt do nome dele.

  5. Adicione o comando a seguir ao Dockerfile:

    FROM mcr.microsoft.com/dotnet/core/sdk:2.2
    WORKDIR /src
    COPY ["/HotelReservationSystem/HotelReservationSystem.csproj", "HotelReservationSystem/"]
    COPY ["/HotelReservationSystemTypes/HotelReservationSystemTypes.csproj", "HotelReservationSystemTypes/"]
    RUN dotnet restore "HotelReservationSystem/HotelReservationSystem.csproj"
    

    Esse código tem comandos que buscam uma imagem que contém o SDK do .NET Core Framework. Os arquivos de projeto do aplicativo Web (HotelReservationSystem.csproj) e do projeto da biblioteca (HotelReservationSystemTypes.csproj) são copiados para a pasta /src no contêiner. O comando dotnet restore baixa as dependências exigidas por esses projetos do NuGet.

  6. Acrescente o código a seguir à parte inferior do Dockerfile:

    COPY . .
    WORKDIR "/src/HotelReservationSystem"
    RUN dotnet build "HotelReservationSystem.csproj" -c Release -o /app
    

    Esses comandos copiam o código-fonte do aplicativo Web para o contêiner. Em seguida, executam o comando dotnet build para criar o aplicativo. As DLLs resultantes são gravadas na pasta /app do contêiner.

  7. Acrescente o comando a seguir à parte inferior do Dockerfile.

    RUN dotnet publish "HotelReservationSystem.csproj" -c Release -o /app
    

    O comando dotnet publish copia os executáveis do site para uma nova pasta e remove todos os arquivos intermediários. Os arquivos nessa pasta podem então ser implantados em um site.

  8. Acrescente os comandos a seguir à parte inferior do Dockerfile.

    EXPOSE 80
    WORKDIR /app
    ENTRYPOINT ["dotnet", "HotelReservationSystem.dll"]
    

    O primeiro comando abre a porta 80 no contêiner. O segundo comando move para a pasta /app, que contém a versão publicada do aplicativo Web. O comando final especifica que, quando o contêiner é executado, ele deve executar o comando dotnet HotelReservationSystem.dll. Essa biblioteca contém o código compilado do aplicativo Web.

  9. Salve o arquivo e feche o editor de texto. Salve esse arquivo com o tipo Todos os Arquivos e sem extensão de arquivo.

Criar e implantar a imagem usando o Dockerfile

  1. No prompt de comando, execute o seguinte comando para criar a imagem para o aplicativo de exemplo usando o Dockerfile. Não se esqueça do . no final do comando. Este comando cria a imagem e a armazena localmente. A imagem recebe o nome reservationsystem. Verifique se a imagem foi criada com êxito. Um aviso sobre permissões de arquivos e diretórios poderá ser exibido quando o processo for concluído. Você pode ignorar esse aviso para efeitos desse exercício. A imagem pode levar um momento para ser criada.

    docker build -t reservationsystem .
    
  2. Execute o seguinte comando para verificar se a imagem foi criada e armazenada no registro local:

    docker image list
    

    A imagem terá o nome reservationsystem. Você também terá uma imagem chamada microsoft/dotnet:

    REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
    reservationsystem   latest              d2501f0f2ced        About a minute ago   1.76GB
    

Testar o aplicativo Web

  1. Insira o comando a seguir para executar um contêiner usando a imagem reservationsystem. O Docker retornará uma longa cadeia de caracteres de dígitos hexadecimais. O contêiner é executado em segundo plano sem nenhuma interface do usuário. A porta 80 do contêiner é mapeada para a porta 8080 no computador host. O contêiner é denominado reservations.

    docker run -p 8080:80 -d --name reservations reservationsystem
    
  2. Abra um navegador da Web e navegue até http://localhost:8080/api/reservations/1. Você deverá ver um objeto JSON que contém os dados para o número de reserva 1 semelhante à saída a seguir:

    Captura de tela do aplicativo Web do sistema de reservas do hotel em execução em um navegador.

    Substitua o "1" no final da URL do localhost por um número de reserva diferente, como 2 ou 20, para ver os detalhes de reserva correspondentes.

  3. Execute o comando a seguir para ver o status do contêiner:

    docker ps -a
    

    A saída lista o seguinte para todos os contêineres disponíveis:

    • ID DO CONTÊINER
    • IMAGE
    • COMANDO
    • Hora de CRIAÇÃO
    • STATUS
    • PORTAS
    • NAMES

    Verifique se o STATUS do contêiner é Para cima.

    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
    07b0d1de4db7        reservationsystem   "dotnet HotelReserva…"   5 minutes ago       Up 5 minutes        0.0.0.0:8080->80/tcp   reservations
    
  4. Insira o comando a seguir para interromper o contêiner reservations:

    docker container stop reservations
    
  5. Exclua o contêiner reservations do Registro local.

    docker rm reservations
    
  6. Deixe o reservationsystem no Registro local. Você usará essa imagem no próximo exercício.

Parabéns! Você criou uma imagem para o aplicativo Web e a executou usando um contêiner do Docker.