Exercício – personalizar uma imagem do Docker para executar a sua própria aplicação Web

Concluído

Um Dockerfile contém os passos para criar uma imagem personalizada do Docker.

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

Nota

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

Neste exercício, irá criar um Dockerfile para uma aplicação que não tenha um. Em seguida, irá criar a imagem e executá-la localmente.

Criar um Dockerfile para a aplicação Web

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

  2. Numa janela da linha de comandos do seu computador local, execute o seguinte comando para transferir o código fonte da aplicação Web.

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

    cd mslearn-hotel-reservation-system/src
    
  4. src No diretório, digite os seguintes comandos para criar um novo arquivo chamado Dockerfile e abri-lo no bloco de notas:

    copy NUL Dockerfile
    notepad Dockerfile
    

    Nota

    Por padrão, o comando do bloco de notas abre um arquivo de texto. Certifique-se de salvá-lo como tipo de arquivo Todos os arquivos sem extensão de arquivo. Para verificar, abra a pasta src no Explorador de Ficheiros, selecione Ver > Mostrar> extensões de nome de ficheiro. Se necessário, renomeie o arquivo e remova .txt do nome do arquivo.

  5. Adicione o seguinte código 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"
    

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

  6. Anexe o seguinte código à 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 e, em seguida, executam o comando dotnet build para criar o aplicativo. As DLLs resultantes são escritas na pasta /app no contentor.

  7. Anexe o seguinte comando na parte inferior do Dockerfile.

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

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

  8. Anexe os seguintes comandos à parte inferior do Dockerfile.

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

    O primeiro comando abre a porta 80 no contentor. O segundo comando move-se para a pasta /app que contém a versão publicada da aplicação Web. O comando final especifica que, quando o contentor está em execução, este deve executar o comando dotnet HotelReservationSystem.dll. Esta biblioteca contém o código compilado para o aplicativo Web.

  9. Guarde o ficheiro e feche o editor de texto. Certifique-se de salvá-lo como tipo de arquivo Todos os arquivos sem extensão de arquivo.

Criar e implementar a imagem através do Dockerfile

  1. Na linha de comandos, execute o seguinte comando para criar a imagem para a aplicação de exemplo através do Dockerfile. Não se esqueça de . no final do comando. Este comando cria a imagem e armazena-a localmente. É atribuído o nome reservationsystem à imagem. Verifique se a imagem foi criada com êxito. Será apresentado um aviso sobre as permissões de ficheiro e de diretório quando o processo for concluído. Neste exercício, pode ignorar estes avisos. A imagem pode demorar um pouco para ser construída.

    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 a aplicação Web

  1. Insira o código a seguir para executar um contêiner usando a reservationsystem imagem. O Docker retornará uma longa sequência de dígitos hexadecimais. O contêiner é executado em segundo plano sem nenhuma interface do usuário. A porta 80 do contentor é mapeada à porta 8080 na máquina anfitriã. É atribuído o nome reservations ao contentor.

    docker run -p 8080:80 -d --name reservations reservationsystem
    
  2. Abra um browser e navegue para http://localhost:8080/api/reservations/1. Você deve ver um objeto JSON contendo os dados para o número de reserva 1 semelhante à seguinte saída:

    Screenshot of the hotel reservations system web app running in a browser.

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

  3. Execute o seguinte comando para exibir 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
    • IMAGEM
    • COMANDO
    • Tempo CRIADO
    • ESTADO
    • PORTOS
    • NOMES

    Verifique se o contêiner está STATUSativo.

    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. Digite o seguinte comando para parar o contêiner de reservas :

    docker container stop reservations
    
  5. Elimine o contentor reservations a partir do registo local.

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

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