Tutorial de Ubuntu 26.04 / Execute um contêiner com dados persistentes e portas restritas
Imagens de contêiner fornecem o ambiente de execução; o armazenamento persistente e a publicação de portas exigem configuração separada. Este exercício instala o Docker Engine e o Compose em uma VM Ubuntu 26.04 dedicada e mantém os dados de um aplicativo Nginx acessível apenas pelo host após a recriação do contêiner.
Escolha a fonte de instalação e o modelo de privilégios
Em um servidor que já utiliza Docker, containerd ou Kubernetes, faça um inventário de contêineres, volumes, repositórios e pacotes antes de planejar alterações. Não remova pacotes cegamente nem misture métodos de instalação. O procedimento abaixo é direcionado a uma VM Ubuntu nova; interrompa se docker.sources ou docker.asc já existirem nos caminhos indicados.
A associação ao grupo docker ou o acesso ao socket do Docker concede amplos privilégios sobre o host. Esta lição usa sudo explícito em vez de tornar o socket gravável por todos ou adicionar todos os usuários ao grupo Docker. Execute somente imagens cuja origem e conteúdo você considera confiáveis.
Instale a partir do repositório oficial
Salve o script completo como ~/install-docker-lab.sh e execute bash ~/install-docker-lab.sh. Ele para antes de escrever se a versão for diferente ou se encontrar arquivos ou links simbólicos nesses caminhos. Depois dessas verificações, falhas podem deixar pacotes instalados e arquivos parciais; inspecione o estado antes de tentar novamente e não execute o script em paralelo. Signed-By limita a chave do repositório a esta fonte.
set -eu
. /etc/os-release
if [ "$ID" != ubuntu ] || [ "$VERSION_ID" != 26.04 ]; then
printf "This lab requires Ubuntu 26.04.\n" >&2
exit 1
fi
if [ -e /etc/apt/sources.list.d/docker.sources ] || [ -L /etc/apt/sources.list.d/docker.sources ] ||
[ -e /etc/apt/keyrings/docker.asc ] || [ -L /etc/apt/keyrings/docker.asc ]; then
printf "Inspect the existing Docker repository first.\n" >&2
exit 1
fi
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources >/dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: ${UBUNTU_CODENAME:-$VERSION_CODENAME}
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo docker version
sudo docker compose version
sudo docker run --rm hello-world
Verifique tanto as versões do cliente/servidor quanto a mensagem de sucesso do hello-world. Resolva falhas de pacote, assinatura ou rede antes de continuar. Registre as versões realmente instaladas; remover um repositório não desinstala o engine nem exclui seus dados.
Mantenha o laboratório de configuração de site Nginx na porta 8080 e use a porta 8081 do host para este contêiner, mantendo sua porta interna 80. Se 8081 estiver ocupada, identifique o processo ou projeto com ss e docker compose ps e substitua consistentemente por outra porta do host verificada no Compose e curl.
Defina o aplicativo Compose e o volume
Crie um novo diretório ~/compose-lab e salve o seguinte como compose.yaml dentro dele, sem sobrescrever arquivos existentes. Antes de iniciar, inspecione os projetos com sudo docker compose ls -a e os volumes com sudo docker volume ls. O nome do projeto costuma derivar do diretório e pode coincidir com um projeto ou volume existente; se houver colisão, escolha outro diretório e nome de projeto e substitua ~/compose-lab em todos os comandos. O exemplo grava em index.html e é destinado a um volume novo de laboratório. Primeiro, use ss -lnt para verificar se 127.0.0.1:8081 está livre. Omitir o endereço do host pode publicar para outras interfaces, portanto, este laboratório vincula explicitamente o loopback.
services:
web:
image: nginx:stable-alpine
ports:
- "127.0.0.1:8081:80"
volumes:
- lab-html:/usr/share/nginx/html
restart: unless-stopped
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
volumes:
lab-html:
lab-html é um volume nomeado separado da camada gravável do contêiner. O exercício começa com conteúdo inicial e depois escreve seu próprio index.html. A tag stable-alpine pode mudar; implantações reproduzíveis precisam de um digest testado e de um processo de atualização. Ajuste os limites de log do exemplo de acordo com a carga de trabalho.
Execute, recrie e verifique os dados persistentes
(
set -eu
cd ~/compose-lab
sudo docker compose config
sudo docker compose pull
sudo docker compose up -d
sudo docker compose ps
sudo docker compose logs --tail 30 web
)
Inicie o aplicativo após a validação da configuração e o download da imagem serem concluídos com sucesso. Verifique o estado do contêiner e os logs, depois escreva o conteúdo do laboratório abaixo. Não sobrescreva arquivos em um projeto existente ou volume que contenha dados reais.
(
set -eu
cd "$HOME/compose-lab"
sudo docker compose exec web sh -c 'printf "volume-lab\n" > /usr/share/nginx/html/index.html'
curl --fail http://127.0.0.1:8081/
sudo docker compose up -d --force-recreate
curl --fail http://127.0.0.1:8081/
sudo docker image inspect nginx:stable-alpine --format '{{json .RepoDigests}}'
)
Cada bloco de inicialização, recriação e desligamento muda para ~/compose-lab antes de ser executado. Uma mudança de diretório dentro de parênteses não persiste após o término do bloco. Cada comando Compose deve usar o mesmo compose.yaml para direcionar o mesmo projeto e volume. A resposta volume-lab antes e depois da recriação mostra que o aplicativo lê o arquivo no mesmo volume. Isso não prova um backup bem-sucedido ou a saúde completa da aplicação. Em versões atuais do Docker, outra máquina não deve alcançar a porta publicada em loopback; confirme as ligações reais com ss e docker compose ps e teste de outro dispositivo. A documentação de publicação de portas registra uma exceção para versões anteriores à 28.0.0 em redes locais.
Diferencie a parada da exclusão de dados
(
set -eu
cd "$HOME/compose-lab"
sudo docker compose down
sudo docker volume ls
)
down remove os contêineres e redes deste projeto enquanto mantém volumes nomeados por padrão. Inicie novamente com up -d para verificar a resposta. Não use down -v ou volume prune como comandos de parada rotineiros: eles podem deletar dados. Coordene gravações de aplicativos e teste a restauração em um local separado ao fazer backup de volumes.




