0 XP
Módulo 4 · Docker e Compose

Volumes, redes e variáveis de ambiente

Intermediário 40 min+25 XPDockerPostgreSQL

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 | head

Nota 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 rede

Por 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. 1. Dentro de um container, a que localhost se refere?

  2. 2. Como a API encontra o banco numa rede Docker criada por você?

  3. 3. O que muda entre ambientes no modelo 12-factor?

Minhas anotações

Salvo automaticamente neste navegador.

AnteriorPróxima