Docker Compose na prática: subindo uma aplicação completa
Com o Docker Compose, você descreve todos os serviços de uma aplicação em um único arquivo YAML e sobe tudo com um comando. Neste exemplo, vamos montar um WordPress com MariaDB e Redis.
Pré-requisitos
- Docker instalado com o plugin Compose (
docker compose version); - Um proxy reverso (Nginx, Caddy ou Traefik) para HTTPS — ou use temporariamente uma porta local para testar.
1. Estrutura do projeto
mkdir -p ~/apps/blog && cd ~/apps/blog
2. Variáveis de ambiente
Crie um arquivo .env (e nunca o envie para repositórios públicos):
MYSQL_ROOT_PASSWORD=troque_esta_senha_root
MYSQL_DATABASE=wordpress
MYSQL_USER=wp
MYSQL_PASSWORD=troque_esta_senha
chmod 600 .env
3. O arquivo compose.yaml
services:
db:
image: mariadb:11
restart: unless-stopped
environment:
MARIADB_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MARIADB_DATABASE: ${MYSQL_DATABASE}
MARIADB_USER: ${MYSQL_USER}
MARIADB_PASSWORD: ${MYSQL_PASSWORD}
volumes:
- db_data:/var/lib/mysql
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
restart: unless-stopped
command: ["redis-server", "--maxmemory", "128mb", "--maxmemory-policy", "allkeys-lru"]
wordpress:
image: wordpress:php8.3-apache
restart: unless-stopped
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: ${MYSQL_DATABASE}
WORDPRESS_DB_USER: ${MYSQL_USER}
WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD}
WORDPRESS_CONFIG_EXTRA: |
define('WP_REDIS_HOST', 'redis');
volumes:
- wp_data:/var/www/html
ports:
- "127.0.0.1:8080:80"
volumes:
db_data:
wp_data:
Destaques
restart: unless-stopped— os serviços voltam sozinhos após reinicializações;- Volumes nomeados — os dados sobrevivem à recriação dos containers;
- Rede interna automática — os serviços se encontram pelo nome (
db,redis); healthcheck+depends_on— o WordPress só sobe quando o banco está pronto;127.0.0.1:8080:80— o WordPress fica acessível apenas localmente, atrás do proxy reverso.
4. Suba a aplicação
docker compose up -d
docker compose ps
docker compose logs -f wordpress
5. Configure o proxy reverso (Nginx)
server {
server_name blog.seudominio.com.br;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Depois, emita o SSL com o Certbot. Para o WordPress reconhecer o HTTPS atrás do proxy, adicione ao WORDPRESS_CONFIG_EXTRA:
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { $_SERVER['HTTPS'] = 'on'; }
Comandos do dia a dia
docker compose pull && docker compose up -d # atualiza as imagens
docker compose restart wordpress
docker compose down # para e remove containers (volumes ficam)
docker compose exec db mariadb -u root -p # acessa o banco
Backup
docker compose exec -T db sh -c 'mariadb-dump -u root -p"$MARIADB_ROOT_PASSWORD" --all-databases' > backup.sql
docker run --rm -v blog_wp_data:/dados -v $(pwd):/backup alpine tar czf /backup/wp_data.tar.gz -C /dados .
O nome do volume é prefixado pelo nome do projeto (a pasta). Confira com
docker volume ls.
Conclusão
Com Docker Compose, sua infraestrutura vira código: fácil de versionar, replicar e atualizar. Rode suas stacks em um VPS-NVME-BR da VittHost, com NVMe e servidores no Brasil.Use o cupom SP-VITT20 e ganhe 20% de desconto na primeira fatura enquanto a promoção estiver ativa.