Exercício – Personalizar uma imagem do Docker para executar seu aplicativo Web
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
Se ele ainda não estiver em execução, inicie o Docker no computador.
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
Insira o comando a seguir para abrir o diretório
src
.cd mslearn-hotel-reservation-system/src
No diretório
src
, insira os comandos a seguir para criar um arquivoDockerfile
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.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 comandodotnet restore
baixa as dependências exigidas por esses projetos do NuGet.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.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.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 comandodotnet HotelReservationSystem.dll
. Essa biblioteca contém o código compilado do aplicativo Web.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
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 nomereservationsystem
. 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 .
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
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 é denominadoreservations
.docker run -p 8080:80 -d --name reservations reservationsystem
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: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.
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
Insira o comando a seguir para interromper o contêiner reservations:
docker container stop reservations
Exclua o contêiner reservations do Registro local.
docker rm reservations
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.