Introdução
A LITTLE HOUR já tem um cardápio completo, e sua cafeteria temporária de fim de semana precisa do mesmo site. Só a página inicial não basta: os clientes também precisam de detalhes das bebidas, preços, ilustrações locais e horários. Seu trabalho é entregar toda essa experiência dentro de uma imagem Docker.
Você vai empacotar os arquivos fornecidos, executar sua imagem e iniciar um novo contêiner para verificar o site real. Não escreverá código de aplicação nem instalará o Docker. Basta conhecer o básico do terminal; Docker, caminhos, portas e comandos são explicados durante o uso. A cafeteria, os produtos, os preços e os endereços são fictícios.
Use Workstation para comandos, Reference Menu para o design fornecido, Your Menu para seu contêiner em execução e Topology para o mapa do ambiente. Your Menu fica disponível após iniciar o contêiner na etapa 2; antes disso, pode não responder. Cada unidade começa de forma independente.
Construa uma imagem do cardápio completo
Nesta etapa, você entenderá as necessidades da cafeteria e construirá uma imagem com todo o site dos clientes. Comece em Reference Menu.
Conheça a experiência do cliente
A página inicial apresenta a LITTLE HOUR. Em A few good favourites, abra Flat white. Os detalhes mostram $4.00, a porção e informações sobre alérgenos. Siga Find us para ler os horários e selecione LITTLE HOUR para voltar ao início. Esses links e ilustrações fazem parte da entrega; não são decoração opcional.

A referência está preparada na porta 8082. Continua disponível mesmo quando seu contêiner está parado, portanto não serve como prova de que você entregou o site.
Encontre os arquivos que deve entregar
Mude para Workstation. O terminal começa em /home/labex/project/cafe-menu. pwd mostra o diretório atual; ls lista os nomes dentro dele:
pwd
/home/labex/project/cafe-menu
ls
Você deve encontrar menu, brand e notes. menu/ contém as páginas dos clientes; brand/, a folha de estilos e as ilustrações. notes/ é material do autor e não deve fazer parte do cardápio público. Mantenha os arquivos fornecidos sem alterações.
Um endereço do site é um caminho de URL. O servidor associa /menu/flat-white.html a um arquivo sob seu diretório público. A pasta de origem externa menu/ contém outro diretório menu/ para essas páginas de detalhes. Inspecione os dois grupos:
ls menu
ls brand
As páginas incluem index.html, visit.html, 404.html e o diretório de detalhes. Os arquivos de marca incluem site.css e três ilustrações .svg. SVG é um formato de imagem. As páginas esperam todos esses arquivos em /assets/ no site em execução.
Escreva a receita de empacotamento
O Docker executa programas em contêineres. Uma imagem é o pacote salvo usado para criar um contêiner; um contêiner é uma instância dessa imagem, em execução ou parada. O Docker já está instalado. A imagem preparada menu-base:1 inclui o servidor web Nginx e sua configuração para páginas ausentes. O diretório público é /usr/share/nginx/html/. Seu cardápio ainda não está nela.
Um Dockerfile descreve como construir a imagem. FROM escolhe a imagem base. COPY copia arquivos para a imagem: o primeiro caminho é uma origem relativa ao diretório de construção e o segundo é um destino dentro da imagem. Copiar o conteúdo do diretório para o lugar correto preserva os links existentes. Isso não conecta o contêiner em execução ao diretório de origem.
Você fará duas cópias explícitas: páginas para o diretório público e arquivos de marca para o subdiretório assets/. Assim, as notas do autor ficam de fora. A base Nginx já define o comando de inicialização; não é preciso acrescentá-lo.
cat > Dockerfile substitui esse arquivo pelo texto seguinte. O DOCKERFILE entre aspas inicia um here-document: cole o bloco inteiro, incluindo o último DOCKERFILE em sua própria linha. As aspas preservam o conteúdo literal. Execute em Workstation:
cat > Dockerfile <<'DOCKERFILE'
FROM menu-base:1
COPY menu/ /usr/share/nginx/html/
COPY brand/ /usr/share/nginx/html/assets/
DOCKERFILE
cat também mostra um arquivo. Leia a receita salva e compare os dois destinos antes de construir:
cat Dockerfile
Construa a imagem salva
docker build lê a receita e cria uma imagem. -t atribui nome e tag: little-hour-menu é o nome e 1 é nossa identificação de versão. O ponto final seleciona o diretório atual como contexto de construção, os arquivos disponíveis para o Docker durante o build. Uma tag é uma identificação conveniente, não uma prova de conteúdo completo.
docker build -t little-hour-menu:1 .
A saída varia com a versão do Docker. O comando deve terminar com sucesso e identificar little-hour-menu:1. Se um COPY falhar, confira pwd, os nomes de origem e o Dockerfile salvo; corrija a receita e repita a construção. Não substitua as páginas nem copie o projeto inteiro para esconder um erro de caminho.
Agora você tem uma imagem de entrega salva. Nenhum contêiner do cardápio está em execução ainda.
Publique a imagem como um cardápio em execução
Nesta etapa, você criará seu próprio contêiner e abrirá o site. Comece em Workstation.
Conecte um contêiner a uma porta web
O Nginx escuta na porta 80 dentro do contêiner. Uma porta identifica um serviço de rede. Vamos publicá-la na porta 8081 desta instância para que Your Menu possa acessá-la. Isso não altera a referência na porta 8082.
docker run cria e inicia um contêiner. -d o executa em segundo plano, mantendo o terminal disponível. --name cafe-menu atribui um nome para uso posterior. -p 8081:80 conecta a porta 8081 do laboratório à porta 80 do contêiner. O último argumento escolhe a imagem construída. Nenhum diretório de origem ou volume é montado:
docker run -d --name cafe-menu -p 8081:80 little-hour-menu:1
A longa saída é o ID do novo contêiner e muda a cada execução. Um ID sozinho não prova que a aplicação continua funcionando. docker ps lista os contêineres em execução:
docker ps
Encontre cafe-menu, a imagem little-hour-menu:1 e um mapeamento com 8081->80/tcp. Outros contêineres de treinamento podem aparecer; não os altere.
Se o nome já estiver ocupado, não inicie várias cópias com outros nomes. Use docker ps para encontrar seu contêiner e prossiga se estiver correto. Se ele tiver encerrado ou o mapeamento estiver errado, docker logs cafe-menu mostra as mensagens do servidor. Para substituir somente seu cardápio estático, docker rm -f cafe-menu para e remove o contêiner indicado, preservando a imagem e as fontes.
Depois de corrigir a receita ou a porta, reconstrua se necessário e repita o docker run original. Use a remoção apenas quando precisar substituir o contêiner, não após cada inicialização bem-sucedida.
Abra sua própria entrega
Mude para Your Menu. Se o abriu antes de iniciar o contêiner, recarregue. Você deve ver a LITTLE HOUR com layout e ilustrações completos. Essa página vem da porta 8081, não do Reference Menu fornecido.

Abra Flat white em A few good favourites. A página deve ter ilustração, preço, porção e alérgenos. Siga Find us, confirme os horários e selecione LITTLE HOUR para voltar ao início na mesma aba. Uma página inicial só com texto ou uma ilustração quebrada não é uma entrega completa.
Mude para Topology. Agora pode aparecer Menu homepage reachable. É uma observação limitada, não a aprovação de todas as páginas. A seguir, você verificará a independência da entrega e os demais caminhos dos clientes.
Verifique um novo contêiner e o site inteiro
Você iniciará uma nova instância da imagem e verificará toda a experiência sem depender do diretório do autor. Comece em Workstation.
Diferencie a imagem do contêiner
A imagem permanece salva quando um contêiner é removido. Este site não tem envios de clientes nem banco de dados, portanto substituir este contêiner não descarta dados comerciais. Essa distinção seria importante em uma aplicação com estado.
Remova apenas cafe-menu com o comando de substituição da etapa 2:
docker rm -f cafe-menu
Inicie uma nova instância com a mesma porta publicada:
docker run -d --name cafe-menu -p 8081:80 little-hour-menu:1
Ela mostra outro ID. Você não refez a construção nem montou o diretório do autor: a nova instância usa os arquivos já empacotados na imagem.
docker inspect mostra a configuração real. --format seleciona um campo em vez do objeto inteiro. O modelo entre aspas transforma a lista de montagens em JSON:
docker inspect cafe-menu --format '{{json .Mounts}}'
[]
A lista vazia indica que não há diretórios do host nem volumes montados. É a evidência desejada: fontes não completam silenciosamente lacunas da entrega. Montagens são úteis em outros cenários; esta tarefa exige um cardápio estático autossuficiente.
Teste os caminhos reais dos clientes
Em Your Menu, recarregue e selecione os três favoritos, um por vez. Flat white custa $4.00, Espresso custa $3.00 e Iced oat latte, $4.75. Cada detalhe deve mostrar a imagem e as informações corretas. Volte por LITTLE HOUR após cada um. Siga Find us e confirme o horário em dias úteis 08:00–17:00. Permaneça em Your Menu; Reference Menu testa outro servidor.

Mude para Workstation. HTTP é o protocolo de requisições e respostas do navegador. Uma resposta bem-sucedida tem status 200; 404 significa que o recurso não foi encontrado. Falha de conexão é diferente: nenhuma resposta válida do servidor foi recebida.
curl envia uma requisição. -sS esconde o progresso, mas mostra erros de conexão. -o /dev/null descarta o corpo. -w imprime o formato entre aspas: %{http_code} é o status e \n termina a linha. Em Workstation, 127.0.0.1 significa esta instância; não execute essas requisições no terminal do seu computador.
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8081/menu/flat-white.html
Deve aparecer 200. As verificações no navegador também confirmaram conteúdo e ilustração; um 200 com a página errada não seria suficiente.
Notas do autor não devem ser públicas. Solicite a possível URL:
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8081/notes/launch-notes.txt
Espere 404. Esse é o resultado correto para o limite do pacote. Curl termina normalmente porque não pedimos que falhasse em respostas de erro HTTP. Parar o site inteiro não atenderia às verificações do cardápio.
Volte a Your Menu e selecione LITTLE HOUR para retornar ao início. O menu normal deve continuar funcionando após rejeitar a requisição das notas. Você verificou tanto o conteúdo completo quanto a resposta adequada a um recurso que nunca fez parte da entrega.
Resumo
Você construiu uma imagem completa do cardápio estático, publicou a porta do servidor e iniciou um novo contêiner sem montagens das fontes. Verificou páginas reais, imagens e informações de visita, mantendo notas do autor fora do site público. O próximo desafio independente aplica essas decisões a uma padaria com outra organização de arquivos.



