Volumes, redes e variáveis de ambiente
Objetivos desta aula
- Persistir dados corretamente
- Conectar containers por rede e DNS interno
- Injetar configuração sem recompilar
Volume nomeado é a forma correta de persistir dados de banco: gerenciado pelo Docker, portável e com performance adequada. Bind mount aponta um diretório do host e é ideal em desenvolvimento para ver alterações de código na hora — mas expõe caminhos do host e, em produção, gera acoplamento indesejado.
Toda rede criada pelo Docker traz DNS interno: containers se encontram pelo nome do serviço. Por isso a API acessa o banco em db:5432, não em localhost. Manter o banco em rede interna, sem publicar porta no host, é boa prática de segurança elementar.
Configuração vem do ambiente, não do código. Publique variáveis para host, porta e nome de banco; para credenciais, use secrets do orquestrador ou arquivo montado com permissão restrita. Um mesmo artefato precisa rodar em dev, staging e produção apenas mudando o ambiente.
1. Três formas de persistir
- Volume nomeado: gerenciado pelo Docker, ideal para bancos
- Bind mount: pasta do host montada no container, ideal para desenvolvimento
- tmpfs: em memória, para dados temporários
2. Redes do Docker
Numa rede bridge criada por você, containers se encontram pelo nome (DNS interno). A rede bridge padrão não oferece isso. Publicar porta (-p 8080:3000) só é necessário para acesso de fora; entre containers, use a porta interna.
3. Configuração por ambiente (12-factor)
A mesma imagem roda em dev, staging e produção; o que muda são as variáveis de ambiente. Nunca crie uma imagem por ambiente.
4. Segredos
Variáveis de ambiente aparecem em docker inspect. Para segredos sensíveis, prefira arquivos montados (Docker secrets, Kubernetes Secret como volume) ou um cofre.
5. Checagem final
Você deve ligar API e banco numa rede própria, persistir os dados em volume e configurar tudo via variáveis.
Na prática
Volumes, rede e conexão entre serviços
bash
docker network create cloudshop-net
docker volume create cloudshop-pgdata
docker run -d --name db --network cloudshop-net \
-e POSTGRES_PASSWORD_FILE=/run/secrets/pg \
-v cloudshop-pgdata:/var/lib/postgresql/data \
postgres:16-alpine
docker run -d --name api --network cloudshop-net -p 3000:3000 \
-e DATABASE_HOST=db -e DATABASE_PORT=5432 -e NODE_ENV=production \
ghcr.io/sua-org/cloudshop-api:v1.0.0
docker exec -it api getent hosts db # DNS interno resolvendo
docker volume inspect cloudshop-pgdata
docker run --rm -v cloudshop-pgdata:/data alpine ls -la /data | headNota de segurança: Evite -e SENHA=valor: a variável fica visível em docker inspect e no histórico do shell. Use arquivo de secret montado.
API e banco numa rede própria
bash
docker network create cloudshop
docker volume create pgdata
docker run -d --name db --network cloudshop -v pgdata:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD_FILE=/run/secrets/pg -v "$PWD/pg.secret:/run/secrets/pg:ro" postgres:16
docker run -d --name api --network cloudshop -p 3000:3000 \
-e DATABASE_HOST=db cloudshop-api:1.4.0 # 'db' resolve pelo DNS da redePor que isso importa
Perder o volume do banco em um deploy é o tipo de erro que custa emprego. Entender persistência é obrigação.
Erro comum
Usar localhost para falar com outro container e receber ECONNREFUSED.
Dica de produção
Não publique a porta do banco no host; acesso administrativo via túnel SSH ou bastion.
Alerta de segurança
Volume com dados pessoais precisa de política de backup e de descarte, não só de existência.
Pergunta de entrevista
Quando você usaria bind mount e quando volume nomeado?
Glossário
- volume nomeado
- Área de armazenamento gerenciada pelo Docker, independente do ciclo do container.
- DNS interno
- Resolução automática de nomes de serviço dentro de uma rede Docker.
- bind mount
- Montagem de uma pasta do host dentro do container.
- volume nomeado
- Armazenamento persistente gerenciado pelo Docker.
- 12-factor
- Conjunto de práticas para apps em nuvem, incluindo configuração via ambiente.
Conexão com o CloudShop
Garantir persistência dos pedidos do CloudShop em volume dedicado.
Quiz da aula
1. Dentro de um container, a que localhost se refere?
2. Como a API encontra o banco numa rede Docker criada por você?
3. O que muda entre ambientes no modelo 12-factor?
Minhas anotações
Salvo automaticamente neste navegador.