Introdução
Afterlight é uma pequena exposição comunitária. Visitantes deixam suas impressões no livro de visitas; substituir a aplicação não pode apagar essas contribuições. Você experimentará uma cópia descartável e depois reconectará os dados existentes do livro real para preservar novas mensagens durante uma substituição.
Basta conhecer o básico do terminal. Docker, Compose, caminhos de dados, edição e HTTP são explicados quando necessários. A aplicação e as ferramentas estão preparadas; você não escreve código de banco de dados. Todos os dados dos visitantes são fictícios.
Use Workstation para comandos, Exhibition para o livro real e Practice Copy apenas para o experimento deliberado de perda de dados. Os dois sites usam contêineres e portas diferentes. Cada unidade começa de forma independente; o site, os rótulos e as saídas continuam em inglês.
Dê aos dados dos visitantes um local próprio
Nesta etapa, você experimentará a exposição, observará a perda de dados descartáveis e conectará o livro real aos registros existentes. Comece em Practice Copy, uma exposição separada e deliberadamente descartável, sem visitantes reais.
Experimente o percurso normal do visitante
Abra About the exhibition, leia os horários e selecione The wall. Selecione Leave a contribution, digite Visitor em Your name e A small practice note. em Your message e escolha Add to the wall. A página de detalhes mostra a contribuição. Selecione Back to the wall para ver o cartão. Os detalhes e o formulário são funções normais que devem ser preservadas.
Observe o que um contêiner não conserva
Mude para Workstation, que começa em /home/labex/project/afterlight. Um caminho identifica um arquivo ou diretório; esse caminho absoluto começa na raiz / do sistema de arquivos. pwd mostra o diretório atual:
pwd
O Docker executa a aplicação em um contêiner, um processo com sua própria visão do sistema de arquivos. Uma imagem é o pacote preparado da aplicação. afterlight:1 contém o programa e o design, mas não as contribuições posteriores. Dados escritos somente na camada gravável de um contêiner desaparecem quando ele é removido.
Remova apenas o contêiner de prática descartável. docker rm o remove; -f o interrompe antes, se necessário:
docker rm -f afterlight-scratch
docker run cria outro contêiner a partir da imagem salva. -d o mantém em segundo plano, e --name define seu nome. Uma porta identifica um serviço de rede: -p 8082:8081 encaminha a porta 8082 do laboratório à porta 8081 da aplicação dentro do contêiner.
docker run -d --name afterlight-scratch -p 8082:8081 afterlight:1
A saída longa é o ID do novo contêiner. Em Practice Copy, selecione The wall e recarregue. O cartão de prática desapareceu. Não continue recarregando sua antiga URL de detalhes: essa entrada não existe mais. A perda limita-se à cópia descartável.
Conecte os dados existentes do livro
Mude para Exhibition. O mural vazio usa a mesma aplicação, mas está sem conexão aos dados. O registro original de Iris está seguro no volume Docker preparado afterlight_messages. Sua principal tarefa é reconectar esses dados e preservar futuras contribuições ao substituir a aplicação.
Um volume nomeado é um armazenamento administrado pelo Docker fora de um contêiner específico. Uma montagem o conecta a um caminho dentro da aplicação. Esta escreve seu banco SQLite em /data/wall.sqlite3. O SQLite guarda registros em um arquivo; não é preciso saber SQL nem escrever código da aplicação aqui.
Mude para Workstation. cat mostra um arquivo:
cat compose.yaml
O Compose lê essa configuração YAML para criar o serviço. O YAML usa recuo com espaços para indicar a estrutura. services agrupa aplicações; wall é este serviço. image, container_name e ports descrevem o pacote, o nome e o mapeamento de rede. environment fornece configurações à aplicação. RELEASE seleciona uma edição de apresentação; ambas usam o mesmo formato de dados.
Você adicionará uma montagem e uma declaração de volume. messages:/data conecta o volume lógico messages ao diretório /data no contêiner; a declaração superior lhe dá o nome Docker existente afterlight_messages. external: true instrui o Compose a reutilizar o volume preparado em vez de criar outro. Um nome incorreto causa erro de volume inexistente: corrija o nome; não exclua o original nem crie um substituto vazio. Declarar armazenamento sem conectá-lo ao serviço não protege dados.
cat > compose.yaml substitui essa configuração. O YAML entre aspas inicia um here-document: cole todo o bloco, inclusive o último YAML sozinho em uma linha. As aspas mantêm o conteúdo literal; preserve os espaços mostrados.
cat > compose.yaml <<'YAML'
name: afterlight
services:
wall:
image: afterlight:1
container_name: afterlight-wall
ports:
- "8081:8081"
environment:
MODE: guestbook
RELEASE: "1"
volumes:
- messages:/data
volumes:
messages:
name: afterlight_messages
external: true
YAML
docker compose config -q valida a configuração silenciosamente. Nenhuma saída significa que foi interpretada corretamente; um erro exige corrigir recuo ou digitação e repetir a validação antes de aplicar.
docker compose config -q
docker compose up -d cria ou substitui o serviço em segundo plano conforme o arquivo. Os volumes nomeados são preservados. Espere o comando terminar:
docker compose up -d
Em Exhibition, volte a The wall e recarregue. Deve aparecer A beautiful place to pause., de Iris. Abra o cartão de Iris e volte. É um registro existente reconectado do banco real, não um exemplo gerado a cada inicialização.
Escreva uma contribuição e identifique seu armazenamento
Nesta etapa, você adicionará uma contribuição real e relacionará o resultado visível à montagem efetiva. Comece em Exhibition e mantenha o cartão original de Iris.
Selecione Leave a contribution. Digite Mira em Your name e exatamente The light stays with us. em Your message, depois Add to the wall. Os detalhes devem mostrar ambos os valores. Selecione Back to the wall: Iris e Mira devem estar presentes.
Mude para Workstation. docker inspect lê a configuração real do contêiner. --format escolhe um campo; as aspas simples mantêm as chaves literais. Este modelo mostra a lista de montagens em JSON:
docker inspect afterlight-wall --format '{{json .Mounts}}'
Encontre "Type":"volume", "Name":"afterlight_messages", "Destination":"/data" e "RW":true. RW significa permissão de leitura e escrita. Um nome em um arquivo representa apenas a intenção; aqui está a conexão real do contêiner em execução.
docker volume ls lista os volumes disponíveis:
docker volume ls
Outros volumes da plataforma podem existir; não os altere. Se o nome de um volume externo estiver incorreto, o Compose para com erro de volume inexistente. Corrija o nome no arquivo e aplique novamente; não crie um substituto vazio. Se conectar por engano um novo volume vazio, um mural vazio não prova que os registros originais foram apagados. Preserve o volume original, restaure afterlight_messages em compose.yaml, valide e aplique novamente. Não exclua volumes como atalho de solução. docker compose down -v remove volumes gerenciados pelo Compose e seus dados, mas preserva os declarados external: true. Isso não torna segura a exclusão manual de um volume externo.
Considere todos os tipos de dados
Uma entrada pode depender de vários diretórios. Este livro guarda texto em /data. Um mural de fotos também armazena os bytes das imagens enviadas em /photos; o banco contém cada legenda e o nome de arquivo associado. Preservar apenas a legenda pode deixar uma imagem quebrada.
| Caminho do contêiner | Conteúdo | Preservar na substituição? |
|---|---|---|
/data |
Registros e relações entre fotos e legendas | Sim |
/photos no mural de fotos |
Fotografias enviadas | Sim, separadamente do banco |
/app |
Programa, design e exemplos preparados na imagem | Recriados da imagem fornecida |
Vários diretórios usam a mesma sintaxe: uma entrada de montagem na lista do serviço e uma declaração de volume para cada um. Não monte um volume vazio sobre /app, pois ocultaria o programa. Arquivos de cache ou da imagem não são automaticamente dados dos visitantes.
O desafio independente usa um formulário de fotos. Os links River e Garden baixam imagens PNG de prática para seu computador. Salve a imagem solicitada, selecione-a em Photograph (PNG), preencha nome e legenda e envie Add to the wall. O navegador envia os bytes escolhidos; nenhuma ferramenta de upload por terminal é necessária.
Substitua a aplicação e mantenha a exposição funcionando
Nesta etapa, você substituirá a aplicação pela edição 2, conservará as duas contribuições e aceitará outra. Comece em Workstation.
nano é um editor de texto no terminal. Abra a configuração:
nano compose.yaml
Com as setas, altere apenas RELEASE: "1" para RELEASE: "2". Mantenha montagens, imagem e portas. Salve com Ctrl+O, Enter, e saia com Ctrl+X. Leia e valide a configuração salva:
cat compose.yaml
docker compose config -q
docker compose ps -q wall mostra o ID atual do contêiner. Memorize-o ou mantenha a saída para comparar; não é necessário um relatório:
docker compose ps -q wall
Aplique a mudança de edição. --force-recreate solicita um contêiner novo mesmo quando o restante da configuração não mudou:
docker compose up -d --force-recreate
docker compose ps -q wall
O ID deve ser diferente. Isso é uma substituição, não apenas um reinício. Se a inicialização falhar, docker compose logs wall mostra as mensagens da aplicação; corrija a configuração, valide e repita up -d. Preserve os volumes originais e não remova outros contêineres.
Em Exhibition, selecione The wall e recarregue. O rodapé deve mostrar Edition 2. Iris e Mira devem continuar presentes. Abra cada cartão e volte. Digite Leon e exatamente Back for another look. no formulário e envie. De volta ao mural, as três contribuições funcionam na aplicação substituta.
Verifique o serviço além dos dados
Mude para Workstation. HTTP é o protocolo de requisição e resposta do navegador. O status 200 significa resposta bem-sucedida; 404 significa que o recurso pedido não foi encontrado. Uma falha de conexão indica que não chegou resposta do servidor.
curl envia uma requisição. -sS oculta o progresso, mas mostra erros de conexão; -o /dev/null descarta o corpo. -w mostra o formato entre aspas: %{http_code} é o status e \n termina a linha. Em Workstation, 127.0.0.1 significa esta instância; a porta 8081 é Exhibition. Execute:
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8081/about
Espere 200. Em Exhibition, abra About the exhibition, confirme os horários e selecione The wall. Um status de sucesso sozinho não prova o conteúdo correto nem as contribuições preservadas.
O volume protege contra esta substituição de contêiner. Não é um backup independente e não protege contra a exclusão do volume ou a perda do host. Mantenha os arquivos da aplicação reproduzíveis e armazene os dados dos visitantes separadamente.
Resumo
Você distinguiu arquivos descartáveis do contêiner de dados persistentes, conectou o volume existente e preservou mensagens originais e novas durante a substituição. Uma nova contribuição e as páginas da exposição continuam funcionando. Agora aplique o método às legendas e às fotografias armazenadas separadamente.



