Docker Compose
Docker Compose
é uma ferramenta escrita em Python para definir e rodar aplicações multi-contêineres Docker. Através do Docker Compose
, você define a configuração dos serviços da sua aplicação. Em um arquivo yml
, é descrita a configuração de cada um dos serviços, bem como o relacionamento entre eles. Através de um comando, você pode criar, atualizar ou remover todos os serviços.
Arquivo YML
Para este exemplo, criaremos uma aplicação blog composta de 2 serviços:
- Servidor web:
ghost
(Ghost) - Banco de dados:
postgres
(PostgreSQL)
Crie um diretório chamado blog para armazenar a configuração:
# acessando o home do usuário
cd ~
# criando o diretório
mkdir blog
# entrando no diretório
cd blog
Crie um arquivo chamado docker-compose.yml
com o seguinte conteúdo:
version: '3.0'
services:
ghost:
image: ghost:5.87.0
ports:
- 2368:2368
restart: always
environment:
database__client: mysql
database__connection__host: "ghost-db"
database__connection__user: "ghostuser"
database__connection__password: "pass"
database__connection__database: "ghostdb"
links:
- ghost-db:ghost-db
depends_on:
- ghost-db
volumes:
- ~/blog/ghost:/var/lib/ghost/content
ghost-db:
image: mariadb:10.3
ports:
- 3306:3306
restart: always
environment:
MYSQL_DATABASE: "ghostdb"
MYSQL_PASSWORD: "pass"
MYSQL_RANDOM_ROOT_PASSWORD: 'true'
MYSQL_USER: "ghostuser"
volumes:
- ~/blog/ghost-db:/var/lib/mysql
Detalhando o arquivo docker-compose.yml
- version: versão do docker-compose
- services: descrição dos serviços
- ghost
- ghost-db
- image: imagem utilizada pelo serviço
- ports: porta em que o serviço executará (lado esquerdo: host, lado direito: contêiner)
- restart: configuração de reinicialização do serviço
- environment: variáveis de ambiente dentro do contêiner
- links: link um contêiner em um outro serviço através do apelido fornecido
- depends_on: monta uma lista de dependências, para que o docker organize qual a ordem desejada de criação dos serviços (Exemplo: cria o banco de dados primeiro, depois cria o servidor web que precisará se conectar no banco)
- volumes: o mapeamento da pasta no host e a respectiva pasta dentro do contêiner (lado esquerdo: host, lado direito: contêiner)
Note que nas configurações do tipo environment
os mesmos valores passados no serviço de banco de dados são passados no serviço do blog. Você pode customizar esses valores, no entanto não se esqueça de atualizar nos dois serviços.
Quando subir um serviço em produção, não se esquecer de alterar os valores padrão das variáveis, especialmente as credenciais de acesso (nome de banco, nome do usuário, senha, etc).
Comandos básicos
Para os exemplos abaixo, os comandos foram executados no diretório em que se encontra o arquivo docker-compose.yml
:
Dica: em algumas instalações mais recentes o comando docker-compose
pode ser acessado como docker compose
(note o espaço entre as palavras). Os comandos a seguir deste treinamento serão efetuados sempre como docker-compose
, se for o caso, faça a respectiva substituição pelo comando com espaço na sua área de desenvolvimento.
Criando a aplicação
Criar a aplicação descrita no arquivo docker-compose.yml
, a tela exibirá o log:
docker-compose up
O serviço de banco iniciará, depois que ele estiver disponível a aplicação web irá se conectar no banco e fará a inicialização das tabelas padrão do sistema. Depois de alguns segundos você visualizará os logs cessarem com a rolagem e poderá ver algo como:
blog-ghost-1 | [2024-07-03 13:46:47] INFO Ghost booted in 9.523s
blog-ghost-1 | [2024-07-03 13:46:47] INFO Adding offloaded job to the queue
blog-ghost-1 | [2024-07-03 13:46:47] INFO Scheduling job update-check at 1 24 6 * * *. Next run on: Thu Jul 04 2024 06:24:01 GMT+0000 (Coordinated Universal Time)
blog-ghost-1 | [2024-07-03 13:46:47] INFO Running milestone emails job on Fri Jul 05 2024 13:46:47 GMT+0000 (Coordinated Universal Time)
Note que o terminal ficará travado neste execução. Os logs dos serviços da stack será exibidos no terminal. Para finalizar, utilize o atalho CONTROL + C
. A execução da stack será finalizada.
Saída:
Gracefully stopping... (press Ctrl+C again to force)
Aborting on container exit...
[+] Stopping 2/2
✔ Container blog-ghost-1 Stopped 0.5s
✔ Container blog-ghost-db-1 Stopped 2.5s
canceled
Vamos criar a aplicação novamente, desta vez com a sua execução em background (-d Detached mode):
docker-compose up -d
Saída:
[+] Building 0.0s (0/0)
[+] Running 2/2
✔ Container blog-ghost-db-1 Started 0.4s
✔ Container blog-ghost-1 Started
Conferir se a stack está rodando sem problemas:
docker-compose ps -a
Saída:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f67c51906df4 ghost:5.87.0 "docker-entrypoint.s…" 5 minutes ago Up 54 seconds 0.0.0.0:2368->2368/tcp, :::2368->2368/tcp blog-ghost-1
7c87994584ea mariadb:10.3 "docker-entrypoint.s…" 5 minutes ago Up 54 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp blog-ghost-db-1
- O servidor web pode ser acessado no navegador no seguinte endereço: http://localhost:2368
- O servidor de banco de dados está acessível na porta
3306
Acessando o serviço de blog hospedado localmente via docker
Visualizar os logs:
docker-compose logs
Visualizar os logs e travar e tela na exibição neles:
docker-compose logs -f
Removendo a aplicação
Remover os contêiners da aplicação:
docker-compose down
Saída:
[+] Running 3/3
✔ Container blog-ghost-1 Removed 0.5s
✔ Container blog-ghost-db-1 Removed 1.9s
✔ Network blog_default Removed
Note que nós fizemos o mapeamento de volumes
tanto do servidor de banco de dados como da aplicação web do blog ghost, portanto mesmo que você remova a aplicação, quando você criá-la novamente as alterações realizadas serão persistidas.
Conferir os arquivos persistidos no host:
ls -la ~/blog
Saída:
total 20
drwxr-xr-x 4 evertonpaiva evertonpaiva 4096 jul 3 10:46 .
drwxr-xr-x 80 evertonpaiva evertonpaiva 4096 jul 4 14:01 ..
-rw-r--r-- 1 evertonpaiva evertonpaiva 750 jul 3 10:46 docker-compose.yml
drwxr-xr-x 11 evertonpaiva root 4096 jul 3 10:46 ghost
drwxr-xr-x 5 999 systemd-journal 4096 jul 3 11:08 ghost-db
- ghost: pasta local para os arquivos do servidor web ghost
- ghost-db: pasta local para os arquivos do servidor de banco maria-db
Quando você acessa imagens docker no Docker Hub, geralmente você encontrará informações sobre os principais parâmetros para configuração do serviço, as portas padrão que o serviço é executa e dicamos de como realizar a persistência ou seja, quais pastas deverão ser mapeadas para volumes para não perder os dados quando o contêiner for encerrado.
Página do serviço ghost no Docker Hub como informações de configuração do serviço.