Docker Compose na prática: WordPress e MySQL com um arquivo YAML
Quando a aplicação precisa de mais de um container, rodar cada docker run na mão vira bagunça. O Docker Compose resolve isso com um arquivo YAML que descreve todos os containers e o que conversa com o quê. Abaixo eu subo um WordPress com banco MySQL com um comando, derrubo com outro e mostro como voltar ao ponto de partida.
Gravei essa aula em 11 de janeiro de 2022, a pedido de uma pessoa do canal que não entendia onde o Compose entra. Os comandos e a versão do arquivo são os daquela data: antes de copiar, confira a documentação oficial do Docker Compose, porque o formato do arquivo e a forma de chamar o comando podem ter mudado. Se você ainda não sabe o que é Docker, comece por o que é Docker.
Para que serve o Compose
O Compose cai como uma luva quando você tem vários containers rodando e precisa orquestrar a comunicação entre eles. Meu exemplo é o WordPress: uma aplicação em PHP que fala com um banco MySQL. São dois containers, e o banco precisa se comunicar com a aplicação web.
Duas coisas ele faz por você:
- Isola o ambiente. O nome da pasta vira o prefixo do projeto. Se eu criar outra pasta com o mesmo arquivo, sobe um segundo ambiente, separado do primeiro.
- Gerencia os containers. Por baixo, são o
run, ostope ostartque você já conhece. O Compose vê se precisa criar o container e alterna entre parar e iniciar, sem você pedir cada passo.
1Conferir se o Compose está instalado
No terminal (usei Linux, mas serve para Windows e Mac):
docker-compose -v
Na tela da aula, esse comando respondeu docker-compose version 1.25.5. Se o seu responder com a versão, está instalado. Se não, pesquise "docker compose install" e abra a página oficial, que tem o passo a passo para Windows e Linux. Parto do princípio de que o Docker também já está instalado.
2Criar a pasta e o arquivo
Crie uma pasta para o projeto (a minha chamou wordpress-compose-2), abra no editor e crie nela um arquivo chamado docker-compose.yml.
O conteúdo eu peguei no Docker Hub: na página da imagem do WordPress, há um exemplo de Docker Compose. É um arquivo YAML, que é declarativo: você diz como o ambiente deve ficar, e os espaços de indentação importam.
version: "3.1"
services:
wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- wordpress:/var/www/html
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: "1"
volumes:
- db:/var/lib/mysql
volumes:
wordpress:
db:
3Entender o arquivo
Lendo de cima para baixo:
version: a versão do Compose. No exemplo é a 3.1.services: tudo que você declara aqui é um container. O primeiro se chamawordpress, mas o nome pode ser qualquer um. Eu poderia chamar deweb.image: a imagem vem do Docker Hub. Pode ser uma imagem local: no lugar deimage, você usabuilde aponta onde está o Dockerfile (um ponto usa o Dockerfile da pasta atual).restart: always: se houver problema no servidor ou no container, ele reinicia sozinho.ports: é o-pdodocker run, só que declarado.8080:80quer dizer porta 80 do container na porta 8080 da sua máquina. A aplicação vai abrir emlocalhost:8080.environment: as variáveis de ambiente, bem simples de declarar. Veja oWORDPRESS_DB_HOST: db.volumes: o mapeamento de volumes. Os nomeswordpressedbsão declarados na seçãovolumesdo fim do arquivo.
O serviço db repete a mesma estrutura, com a imagem do MySQL (mysql:5.7), o mesmo restart e as variáveis do banco: nome, usuário e senha. O MYSQL_RANDOM_ROOT_PASSWORD: "1" gera uma senha aleatória para o root.
O detalhe que mais gera dúvida é o DB. Para a aplicação encontrar o banco, basta dar o mesmo nome: o serviço se chama db, e o WORDPRESS_DB_HOST aponta para db. É isso que liga os dois.
Para saber onde os volumes ficam na sua máquina, use docker volume e docker inspect, que já mostrei na aula de oito comandos do Docker.
4Subir o ambiente
Na pasta do arquivo:
docker-compose up
O Compose lê o arquivo e levanta os dois serviços. Se você não indicar nenhum, ele sobe tudo o que está no arquivo. Também dá para subir só um deles.
Na primeira tentativa, deu erro no meu terminal: a porta 8080 já estava em uso por containers de um teste anterior. O Docker não consegue publicar duas coisas na mesma porta. Rodei docker ps, parei os dois containers com docker stop e repeti o comando.
Com tudo no ar, abra localhost:8080: aparece a página de instalação do WordPress. Escolhi português do Brasil, preenchi o título, o usuário, a senha e o e-mail, instalei e entrei na administração. A aplicação já conversava com o banco, sem eu configurar nada além do arquivo.
Com docker-compose up o log fica preso no terminal; o Ctrl+C para os containers. A pasta aparece no nome: os containers se chamam wordpress-compose-2_wordpress_1 e wordpress-compose-2_db_1, o prefixo do projeto mais o nome do serviço. Foi isso que isolou o ambiente.
Para rodar em segundo plano e liberar o terminal, use -d:
docker-compose up -d
5Derrubar o ambiente
docker-compose down
Na pasta do arquivo, o Compose lê os serviços e derruba cada um. Ele para e remove os dois containers e remove a rede que criou para eles se comunicarem. Depois, um novo docker-compose up -d levanta tudo de volta.

6Voltar ao ponto de partida
Depois do down, o WordPress subiu de novo já instalado. Sobrou o volume do banco, que guarda os dados. Isso ajuda no dia a dia, mas atrapalha em um ambiente de teste, em que você quer que tudo recomece do zero (por exemplo, subir o ambiente, rodar a bateria de testes e terminar).
Para apagar também os volumes, acrescente -v:
docker-compose down -v
A saída passa a mostrar a remoção dos volumes. Subi de novo com docker-compose up -d, que demorou um pouco mais porque o MySQL foi instalado do zero, e o WordPress voltou para a instalação inicial. Refiz o passo com outro usuário e entrei na administração. O banco estava zerado.

Checklist
- Confira com
docker-compose -vse o Compose está instalado. - Crie uma pasta por projeto e coloque nela o
docker-compose.yml. - Declare cada container em
services, com imagem (oubuild),restart,portseenvironment. - Para a aplicação achar o banco, use o nome do serviço do banco como host.
- Se a 8080 estiver ocupada por containers antigos, veja com
docker pse pare comdocker stop. - Suba com
docker-compose up -de derrube comdocker-compose down. - Para recomeçar do zero, derrube com
docker-compose down -v.
Com um arquivo e dois comandos, os dois containers sobem, se encontram pelo nome e somem sem deixar rede nem container para trás. Para levar esse mesmo arquivo para uma instância, veja WordPress na AWS com Docker, que cobre a EC2, o Docker e a porta 80.
O que os alunos dizem

“Eu sempre fugi da AWS. Achava complicado, distante da minha rotina de dev. Mas só a primeira aula do Bootcamp já mudou tudo: usei o conteúdo para resolver um problema real de um cliente e fui contratado por causa disso.”
André Scherrer, Engenheiro de Software
Ver depoimento
“Só quando coloquei a mão na massa com a Formação AWS é que avancei de verdade. Essa prática me levou ao próximo nível”
Caio, Desenvolvedor (Dev)
Ver depoimento
“Eu trabalhava há mais de 20 anos com TI tradicional e atendia empresas da região, mas sentia minha carreira estagnada.”
Carlos Souza, Consultor Cloud
Ver depoimento
Formação AWS
Aprenda AWS e IA na prática, com projeto real e acompanhamento. Converse com o time sobre a Formação AWS.
Agende uma conversaPrefere assistir?
A aula completa (23 min) está no canal Domine AWS. O vídeo toca aqui mesmo.

