Docker Compose: uma aplicação com o seu banco de dados

Node.js, Python e DockerDocker e contêineres·· 1.014 visualizações· 4 min de leitura

O Docker Compose descreve num único arquivo uma aplicação inteira: o programa, o banco de dados, as redes entre eles e os volumes onde os dados ficam. Um comando, docker compose up -d, levanta tudo. Fica aqui um exemplo com a aplicação e o PostgreSQL, num VPS com o Docker já instalado (veja como). A mesma estrutura serve para MariaDB ou MySQL: muda a imagem e as variáveis.

Montar o projeto

1 Crie uma pasta só para o projeto e entre nela: mkdir meu-projecto && cd meu-projecto. O nome da pasta torna-se o nome do projeto no Compose.
2 Crie o arquivo .env com as senhas, e proteja-o: DB_PASSWORD=ponha-aqui-uma-palavra-passe-longa-e-aleatoriachmod 600 .env. Se usar Git, ponha o .env no .gitignore. Nunca o publique.
3 Crie o arquivo compose.yaml (o nome docker-compose.yml também funciona):services:
  app:
    build: .
    restart: unless-stopped
    env_file: .env
    environment:
      DB_HOST: db
    ports:
      - "127.0.0.1:3000:3000"
    depends_on:
      db:
        condition: service_healthy
  db:
    image: postgres:16
    restart: unless-stopped
    environment:
      POSTGRES_USER: appuser
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: appdb
    volumes:
      - db_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U appuser -d appdb"]
      interval: 10s
      timeout: 5s
      retries: 5
volumes:
  db_data:
4 Levante tudo e veja o estado: docker compose up -d
docker compose ps
docker compose logs -f app
O Compose cria uma rede privada para o projeto.

O que cada parte faz

Parte O que faz Por quê assim
DB_HOST: db A aplicação encontra o banco de dados pelo nome do serviço. Dentro da rede do Compose não se usa localhost nem o IP: cada serviço é um computador à parte.
127.0.0.1:3000:3000 Publica a porta da aplicação só no próprio servidor. Quem a mostra ao mundo é um proxy com HTTPS: veja nginx como proxy reverso.
Nenhuma porta no db O banco de dados não é alcançável de fora. É o desejado. Os outros serviços chegam-lhe pela rede interna.
db_data (volume) Onde ficam os dados do banco de dados. Sem volume, apagar o contêiner apaga os dados.
healthcheck e service_healthy A aplicação só inicia quando o banco de dados já aceita conexões. depends_on sozinho só espera que o contêiner exista, não que esteja pronto.

O endereço de conexão, dentro da aplicação, fica assim: postgres://appuser:SENHA@db:5432/appdb. Se a senha tiver caracteres especiais (@, :, /), têm de ir codificados no endereço, ou escolha uma sem eles.

As variáveis POSTGRES_* só valem na primeira vez. Servem para criar o banco de dados quando o volume está vazio. Se mudar a senha no arquivo depois de a base existir, o banco de dados não muda, e a aplicação deixa de entrar. Muda-se com um comando dentro do banco de dados. E o docker compose down -v apaga os volumes, ou seja, os dados: sem o -v, um down só remove os contêineres.
Escolha uma versão da imagem do banco de dados e fixe-a (postgres:16 em vez de postgres:latest). Passar de uma versão principal para a seguinte não se faz mudando só o número: exige uma cópia e uma restauração. Veja cópias com mysqldump e pg_dump, e como atualizar sem perder nada em atualizar uma aplicação Docker. A escolha entre motores está em PostgreSQL ou MySQL.

O VPS tem de ser seu, com root. Se ainda não tem, veja os planos: o Docker e a aplicação ficam à sua conta, e a rede e o servidor à nossa.

Ver os servidores VPS

VEJA TAMBÉM

Nginx como proxy reverso à frente de um contêiner

Atualizar uma aplicação Docker sem perder dados

Cópias com mysqldump e pg_dump, e restaurar a cópia

PRODUTO RECOMENDADO

Servidor VPS com acesso root

Recursos só seus, o sistema que escolher, reinstalação quando quiser. desde R$ 46,20/mês (plano de 3 anos, com cupom)

Ver planos
Esta resposta foi útil? Sua resposta nos ajuda a melhorar este artigo.