Rodar bancos de dados em containers é uma das formas mais eficientes de manter seu ambiente de desenvolvimento limpo e organizado. Neste artigo, vou mostrar como subir uma instância do MySQL 8.0 configurada com persistência de dados, ajuste de timezone e configurações personalizadas usando o Docker Compose.

Por que essa configuração? Link para o cabeçalho

Muitas vezes, ao subir o MySQL 8 padrão, enfrentamos problemas de autenticação com clientes antigos ou restrições de importação de arquivos. A configuração que vamos utilizar resolve três problemas comuns:

  1. Autenticação: Força o uso do mysql_native_password para compatibilidade.
  2. Timezone: Configura o horário para America/Sao_Paulo.
  3. Importação de Arquivos: Libera o secure_file_priv via arquivo de configuração customizado.

1. Estrutura de Pastas Link para o cabeçalho

Para começar, crie uma pasta para o seu projeto e organize a estrutura da seguinte forma:

meu-projeto-mysql/
├── custom/
│   └── my.cnf
└── docker-compose.yml

2. O Arquivo de Configuração (my.cnf) Link para o cabeçalho

Dentro da pasta custom, crie o arquivo my.cnf. Este arquivo é crucial se você pretende realizar operações como LOAD DATA INFILE ou exportações que exigem permissões de escrita no sistema de arquivos.

[mysqld]
secure_file_priv=""

Nota: A diretiva secure_file_priv="" desabilita a restrição de diretório para importação e exportação de dados, o que é muito útil em ambientes de desenvolvimento.

3. O Arquivo Docker Compose Link para o cabeçalho

Na raiz do projeto, crie o arquivo docker-compose.yml. Note que mapeamos um volume relativo ao docker compose (./data/mysql) para garantir que os dados persistam mesmo se o container for destruído.

services:
  db:
    image: mysql:8.0
    container_name: mysql-local
    restart: always
    # Comando essencial para compatibilidade com clientes SQL mais antigos
    command:
      - "--default-authentication-plugin=mysql_native_password"
    environment:
      - MYSQL_DATABASE=app
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_USER=user
      - MYSQL_PASSWORD=12345678
      - TZ=America/Sao_Paulo
    ports:
      - '3306:3306'
    volumes:
      # Persistência de dados
      - ./data/mysql:/var/lib/mysql
      # Injeção da configuração customizada
      - ./custom/my.cnf:/etc/mysql/conf.d/my.cnf

Detalhes Importantes da Portabilidade: Link para o cabeçalho

  • Volumes:
  • ./data/mysql:/var/lib/mysql: O prefixo ./ indica que a pasta data/mysql será criada dentro da mesma pasta onde você executa o docker-compose up. Isso é o ideal para projetos portáteis.
  • ./custom/my.cnf:/etc/mysql/conf.d/my.cnf: O MySQL lê automaticamente arquivos .cnf montados neste diretório do container, aplicando nossas regras personalizadas.

4. Executando o Container Link para o cabeçalho

Abra seu terminal na pasta do projeto e execute:

docker-compose up -d

O Docker irá baixar a imagem do MySQL 8.0 (se ainda não tiver) e iniciar o serviço na porta 3306.

5. Testando a Conexão Link para o cabeçalho

Agora você pode conectar no seu banco de dados usando seu cliente favorito (DBeaver, Workbench, HeidiSQL) com as credenciais:

  • Host: localhost

  • Port: 3306

  • Database: app

  • User: user

  • Password: 12345678

Pronto! Agora você tem um ambiente MySQL robusto, persistente e configurado para o fuso horário brasileiro rodando isolado no seu sistema, com a vantagem de que o projeto é totalmente portátil.