Separe reservas de teste das de produção

DockerBeginner
Pratique Agora

Introdução

O STILL STUDIO organiza pequenas oficinas de cerâmica. Os participantes escolhem uma oficina, reservam uma vaga e veem seu nome na lista. A equipe quer experimentar uma sessão em Garden Room sem ocupar vagas da lista real de Riverside Room. Você dará ao mesmo aplicativo seu próprio ambiente de staging: um site de teste claramente identificado com dados de reservas separados.

Basta conhecer o básico do terminal. Docker Compose, configuração, caminhos, portas e volumes de dados são apresentados aqui. O aplicativo e sua imagem são fornecidos; você não escreve código nem instala ferramentas. Todas as reservas são fictícias. Não são usados e-mails, pagamentos, contas externas ou dados pessoais reais.

Use Live Bookings para o site preparado na porta 8081, Preview Bookings para seu site de staging na porta 8082 e Workstation para os comandos. Preview Bookings fica indisponível até você iniciá-lo na etapa 2. Esta unidade começa de forma independente.

Conheça o negócio e configure a prévia

Nesta etapa, você fará uma reserva pelo fluxo normal e depois preparará um conjunto separado de configurações. Comece em Live Bookings.

Reserve uma vaga no serviço normal

A oficina em produção do estúdio

A página inicial apresenta a oficina e mostra LIVE BOOKINGS, Riverside Room e 4 of 6 places left. Selecione Explore the clay workshop. A página descreve a sessão e contém o campo Guest name. Digite o nome fictício Live guest e selecione Reserve a place.

O navegador abre Guest list com Maria, Jun e Live guest. Agora aparecem 3 of 6 places left. É uma gravação real no banco de dados, não uma mensagem decorativa de sucesso. Selecione STILL STUDIO para voltar ao início. Preserve as três reservas.

Se enviar o mesmo nome duas vezes por engano, o site informa que ele já está reservado e não adiciona uma segunda reserva. Se digitar seu nome errado, abra Guest list, selecione Cancel apenas ao lado da sua reserva incorreta e reserve novamente com Live guest. Nunca cancele Maria ou Jun nem esvazie a lista toda para corrigir um erro de digitação.

Entenda o limite da configuração

Mude para Workstation, que já está em /home/labex/project/booking. Um caminho identifica um arquivo ou diretório. pwd imprime o diretório atual, e ls lista seu conteúdo:

pwd
/home/labex/project/booking
ls

Você deve ver compose.yaml e live.env. cat imprime um arquivo de texto:

cat live.env
PORT=8081
APP_ENV=live
VENUE=Riverside Room
CAPACITY=6
DATA_VOLUME=still-live-data

A configuração fornece escolhas ao aplicativo sem alterar seu código. Essas linhas KEY=value selecionam a porta publicada, a identificação do ambiente, o local, a capacidade e o volume de dados. VENUE muda o local real da oficina exibido em todo o site. CAPACITY limita as reservas aceitas, em vez de mudar apenas um rótulo.

Docker executa um aplicativo em um contêiner criado a partir de uma imagem salva. Os dois sites usarão a imagem fornecida still-booking:1. Cada contêiner recebe suas próprias variáveis de ambiente ao ser criado. Um volume nomeado guarda o banco fora do contêiner substituível. Contêineres diferentes podem compartilhar um volume; por isso, nomes diferentes de contêiner não isolam os registros por si só.

Os recursos preparados são:

Recurso Finalidade
still-live-data Banco de produção, com as reservas originais de Maria e Jun
still-trial-data Recurso de banco vazio reservado para esta prévia

O nome do volume escolhe o armazenamento real. Nunca selecione o volume de produção para reservas de teste.

Entenda o pequeno arquivo Compose

Docker Compose descreve contêineres relacionados em um arquivo YAML. YAML agrupa configurações por indentação; mantenha o espaçamento fornecido e use espaços, não tabulações. Leia o arquivo:

cat compose.yaml

Em services, booking usa still-booking:1. A seção environment passa os valores ao aplicativo. ${VENUE} significa que Compose substitui o valor chamado VENUE antes de criar o contêiner. Um arquivo de ambiente fornece entrada para essa substituição; ele não altera automaticamente um processo que já está em execução.

ports mapeia ${PORT}:8000: antes dos dois-pontos fica a porta publicada da instância do laboratório; 8000 é onde o aplicativo escuta dentro do contêiner. Os sites precisam de portas publicadas diferentes.

O serviço monta booking-data em /data, onde o aplicativo guarda seu banco. A entrada de volume de nível superior resolve esse alias como ${DATA_VOLUME}. external: true significa que o volume já existe e Compose deve usar exatamente esse recurso. Um nome de projeto agrupa contêineres Compose; ele não renomeia um volume externo selecionado explicitamente.

Escreva e resolva os valores da prévia

Mantenha live.env sem alterações. Crie preview.env com os valores abaixo. cat > preview.env substitui esse arquivo. O ENV entre aspas inicia um here-document: cole o bloco inteiro, incluindo o ENV final em sua própria linha. As aspas preservam o texto literalmente.

cat > preview.env <<'ENV'
PORT=8082
APP_ENV=staging
VENUE=Garden Room
CAPACITY=3
DATA_VOLUME=still-trial-data
ENV

Uma porta identifica um serviço de rede. Aqui, 8082 pertence a Preview Bookings; 8081 continua sendo Live Bookings. APP_ENV=staging ativa a identificação visível de teste. Isso, por si só, não escolhe armazenamento separado: essa é a função de DATA_VOLUME.

--env-file preview.env informa os valores a substituir. -p still-preview seleciona o projeto. config imprime a configuração resolvida sem iniciar ou alterar contêineres:

docker compose --env-file preview.env -p still-preview config

Encontre APP_ENV: staging, VENUE: Garden Room, capacidade 3, porta publicada 8082 e volume still-trial-data. A formatação varia conforme a versão do Compose. Os valores resolvidos são a evidência, não apenas o encerramento bem-sucedido do comando.

Se Compose informar uma variável ou arquivo ausente, confira pwd e cat preview.env, corrija a grafia executando o here-document completo novamente e repita config. Se seu shell já exportou uma variável como VENUE, seu valor pode prevalecer sobre o arquivo. unset VENUE remove essa substituição do shell; aplique o método apenas a uma chave conflitante que você exportou intencionalmente. Não inicie a prévia antes de os valores resolvidos estarem corretos.

Inicie a prévia e teste sua capacidade real

Nesta etapa, você iniciará a cópia de staging e provará que suas reservas usam uma lista separada. Comece em Workstation.

Inicie o aplicativo configurado

up cria ou atualiza os contêineres do projeto. -d mantém a execução em segundo plano, deixando o terminal disponível:

docker compose --env-file preview.env -p still-preview up -d

A saída informa o nome do contêiner criado. ps mostra o estado real do projeto e a porta publicada:

docker compose --env-file preview.env -p still-preview ps

Procure o serviço booking em execução e a porta 8082 conectada a 8000. Se a inicialização falhar, logs imprime as mensagens do aplicativo:

docker compose --env-file preview.env -p still-preview logs

Um volume externo indisponível geralmente indica erro no nome do recurso. Corrija preview.env, repita config e depois up -d. Não crie um volume substituto para esconder um destino incorreto. Um conflito de porta geralmente significa que você escolheu a porta de produção; preserve 8081 e use 8082 para esta prévia.

Faça uma reserva de teste

Mude para Preview Bookings e recarregue se necessário. A página inicial deve mostrar STAGING · TEST BOOKINGS ONLY, Garden Room e 3 of 3 places left. Selecione Explore the clay workshop, digite Trial guest e selecione Reserve a place. Guest list agora mostra somente Trial guest, com 2 of 3 places left.

Mude para Live Bookings, selecione Guest list e recarregue. A lista deve continuar mostrando Maria, Jun e Live guest, com 3 of 6 places left. Se dados de teste aparecerem aqui, pare de fazer reservas de teste. Em Workstation, corrija o volume da prévia, aplique up -d e cancele somente seu registro de teste identificável na lista de produção. Preserve todas as reservas legítimas. Abra Preview Bookings e crie ali Trial guest após corrigir o isolamento.

A lista independente da prévia

Essa comparação importa mais que a identificação. Um rótulo de staging com banco compartilhado ainda consumiria vagas reais.

Experimente a capacidade menor

Permaneça em Preview Bookings. Siga Back to the workshop e reserve Capacity A. Volte novamente à oficina e reserve Capacity B. A lista agora tem três participantes e 0 of 3 places left.

Tente mais uma reserva, Overflow guest. A página deve dizer Every place is taken. e No booking was added. Siga View the guest list: Overflow guest deve estar ausente. A capacidade menor mudou o comportamento do aplicativo.

Cancele somente Capacity A e Capacity B, mantendo Trial guest. A prévia volta a 2 of 3 places left. Se digitar um nome errado, cancele aquele registro de teste e repita; não é necessário esvaziar o banco. Volte a Live Bookings e confirme que a lista e as vagas restantes não mudaram.

Compare resultados legíveis por máquinas

Mude para Workstation. HTTP é o protocolo de requisição e resposta usado pelo navegador. curl envia uma requisição; -sS oculta o progresso e exibe erros de conexão. Em Workstation, 127.0.0.1 significa esta instância do laboratório. Uma URL combina protocolo, endereço, porta e caminho do recurso. /api/info retorna a configuração real e a lista do banco como JSON, um formato de texto estruturado. Não é necessária uma linguagem de consulta ao banco.

curl -sS http://127.0.0.1:8081/api/info

Leia live, Riverside Room, capacidade 6, vagas restantes 3 e os três nomes de produção. Os IDs podem variar.

curl -sS http://127.0.0.1:8082/api/info

Leia staging, Garden Room, capacidade 3, vagas restantes 2 e somente Trial guest. São dois endpoints diferentes, não dois rótulos da mesma lista.

Substitua a prévia sem perder as reservas

Nesta etapa, você substituirá o contêiner da prévia e confirmará que seus dados separados sobrevivem. Comece em Workstation.

Confira a montagem real do armazenamento

ps -q imprime apenas o ID do contêiner do projeto. docker inspect lê as configurações reais de um contêiner. --format seleciona um campo; o modelo entre aspas converte suas montagens para JSON. A expressão de shell $(...) executa o comando interno e insere sua saída como argumento do contêiner:

docker inspect $(docker compose --env-file preview.env -p still-preview ps -q booking) --format '{{json .Mounts}}'

Encontre uma montagem do tipo volume, com nome still-trial-data e destino /data. Um nome de projeto diferente não protegeria os dados reais se essa montagem se chamasse still-live-data.

Recrie somente o contêiner da prévia

--force-recreate instrui up a substituir o contêiner mesmo sem mudanças na configuração. Os volumes nomeados montados permanecem. Isso também demonstra como a configuração chega a um novo processo: editar somente um arquivo de ambiente não atualizaria um contêiner em execução.

docker compose --env-file preview.env -p still-preview up -d --force-recreate

Espere que ps mostre o serviço em execução:

docker compose --env-file preview.env -p still-preview ps

Mude para Preview Bookings e recarregue Guest list. Trial guest deve permanecer em Garden Room, com 2 of 3 places left. Mude para Live Bookings e recarregue a lista. Maria, Jun e Live guest devem permanecer em Riverside Room, com 3 of 6 places left. Nem a substituição do contêiner nem uma reserva de teste devem esvaziar o outro ambiente.

Não use exclusão de volumes ou down -v como recuperação. Se a prévia não iniciar, use logs do mesmo projeto, corrija os valores e aplique up -d novamente. O ambiente de produção preparado está fora do seu escopo de alterações.

Confira páginas e respostas juntas

Em Preview Bookings, selecione STILL STUDIO, abra a oficina e depois Guest list. A ilustração local, os detalhes e a navegação devem continuar funcionando. Uma página inicial correta não é o serviço completo de reservas.

Mude para Workstation. O status HTTP 200 significa resposta bem-sucedida; 404 indica que o caminho solicitado não existe. -o /dev/null descarta o corpo da resposta; -w imprime o formato entre aspas. %{http_code} é o status HTTP, e \n termina a linha de saída:

curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8082/bookings

Espere 200 e confirme a lista correta no navegador. Um 200 contendo a página errada não é sucesso.

curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8081/workshop

Espere 200: a oficina em produção continua disponível. Falha de conexão é diferente de resposta HTTP de erro; confira ps e logs se nenhum servidor responder. Agora você tem uma imagem de aplicativo, dois processos configurados independentemente e duas listas separadas e duráveis. É isolamento de treinamento em uma instância, não uma barreira de segurança contra um administrador com acesso ao Docker.

Resumo

Você configurou e iniciou uma cópia de staging do mesmo aplicativo, escolheu um volume nomeado separado, testou a capacidade real e comparou as listas. Recriar a prévia preservou sua reserva, enquanto o serviço de produção manteve os participantes originais. Outro rótulo ou projeto Compose ajudou na organização; o destino real dos dados estabeleceu o isolamento.