Skip to main content

Command Palette

Search for a command to run...

MySQL com Docker Compose: guia completo (com correção do erro "Public Key Retrieval is not allowed")

Updated
6 min readView as Markdown
MySQL com Docker Compose: guia completo (com correção do erro "Public Key Retrieval is not allowed")

Se você chegou aqui pesquisando o erro "Public Key Retrieval is not allowed" ao tentar conectar no MySQL pelo DBeaver, pode pular direto para essa seção. Se está começando do zero, siga o tutorial completo abaixo.

Neste guia você vai aprender a:

  • Subir um container MySQL com Docker Compose, com dados persistidos na sua máquina

  • Evitar os dois erros mais comuns dessa configuração

  • Conectar no banco usando o DBeaver

Pré-requisitos

  • Docker instalado (docker --version para conferir)

  • Docker Compose instalado, de preferência a versão mais recente, integrada como plugin (docker compose version, sem hífen)

  • DBeaver instalado (ou qualquer outro cliente MySQL de sua preferência)

💡
Atenção à versão do Compose. Existem duas versões: a legada docker-compose (Python, standalone, descontinuada) e a atual docker compose (plugin oficial, sem hífen). Se docker compose version não funcionar, instale com sudo apt install docker-compose-plugin.

Passo 1: criando o docker-compose.yml

Crie uma pasta para o projeto e, dentro dela, um arquivo docker-compose.yml:

services:
  mysql_knex:
    container_name: mysql_knex
    hostname: mysql_knex
    image: mysql:8.0
    restart: always
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
      - --innodb_force_recovery=0
    volumes:
      - ~/.MySQLDBData/mysqlonly/mysql_knex:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: senha
      MYSQL_DATABASE: base_de_dados
      MYSQL_USER: usuario
      MYSQL_PASSWORD: senha
      TZ: America/Sao_Paulo

Alguns pontos importantes desse arquivo:

Fixe a versão da imagem. Usar image: mysql sem tag puxa sempre a versão mais recente disponível no Docker Hub. Isso é perigoso: uma versão nova pode remover flags que seu comando usa, quebrando a inicialização do container. Fixando mysql:8.0, você garante um comportamento previsível.

O volume persiste os dados no seu host. A linha abaixo é o que garante que, se você derrubar o container, os dados não somem:

volumes:
  - ~/.MySQLDBData/mysqlonly/mysql_knex:/var/lib/mysql

Você pode confirmar seu caminho com echo $HOME. Se quiser evitar qualquer ambiguidade (por exemplo, ao rodar com sudo, onde ~ viraria /root), use o caminho absoluto direto no lugar do ~.

Passo 2: subindo o container

Na pasta onde está o docker-compose.yml, rode:

docker compose up -d

Confirme que subiu com:

docker ps

O container mysql_knex deve aparecer com status Up. Se aparecer Restarting, o processo está travando em loop — siga para a próxima seção.

Erro: unknown variable 'default-authentication-plugin'

Se você usou algum tutorial mais antigo como referência, é comum ver a flag --default-authentication-plugin=mysql_native_password no command: do compose. Em versões recentes do MySQL, essa flag não existe mais, e o servidor recusa iniciar, entrando em crash loop.

Para confirmar que é esse o problema, veja os logs:

docker logs mysql_knex --tail 50

Se aparecer algo como:

[ERROR] [MY-000067] [Server] unknown variable 'default-authentication-plugin=mysql_native_password'.
[ERROR] [MY-010119] [Server] Aborting

A solução é remover essa flag do command: (como já está no docker-compose.yml deste tutorial) e deixar o MySQL 8 usar seu método de autenticação padrão, o caching_sha2_password.

Se o container já tentou subir e crashou antes de terminar a inicialização, é seguro resetar o volume, já que nenhum dado real chegou a ser gravado:

docker compose down
sudo rm -rf ~/.MySQLDBData/mysqlonly/mysql_knex
docker compose up -d

Depois disso, confira os logs de novo e espere aparecer a linha:

[Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.43' ...

Isso confirma que o MySQL subiu corretamente e está pronto para aceitar conexões.

Passo 3: conectando pelo DBeaver

Abra o DBeaver e crie uma nova conexão MySQL, com os dados do seu docker-compose.yml:

  • Host: localhost

  • Port: 3306

  • Database: o valor de MYSQL_DATABASE

  • Username: o valor de MYSQL_USER

  • Password: o valor de MYSQL_PASSWORD

Erro: Public Key Retrieval is not allowed

Ao testar a conexão, é bem provável que apareça este erro:

Public Key Retrieval is not allowed

Isso acontece porque o MySQL 8 usa o plugin de autenticação caching_sha2_password, que exige buscar uma chave pública RSA do servidor para autenticar com segurança. Por padrão, o driver JDBC bloqueia essa busca automática — é uma proteção contra ataques man-in-the-middle. Em ambiente de desenvolvimento local, é seguro habilitar manualmente.

Como resolver no DBeaver:

  1. Abra a conexão em Edit Connection.

  2. Vá até a aba Driver properties.

  3. Localize a propriedade allowPublicKeyRetrieval e defina como true. Se não existir na lista, adicione manualmente clicando no ícone +.

  4. Confirme também que useSSL está como false, já que não há certificado SSL configurado para produção nesse ambiente local.

  5. Clique em OK e teste a conexão novamente.

Alternativa mais rápida: editar direto a URL JDBC, na aba Main:

jdbc:mysql://localhost:3306/base_de_dados?allowPublicKeyRetrieval=true&useSSL=false
💡
Essas duas flags são aceitáveis em desenvolvimento local. Em produção, o recomendado é configurar SSL de verdade em vez de desabilitar essas proteções.

TCP/IP vs Unix socket: por que a porta importa

Um detalhe que gera confusão: nos logs do MySQL você vai ver uma linha assim:

ready for connections. ... socket: '/var/run/mysqld/mysqld.sock' port: 3306

O MySQL aceita conexões de duas formas:

  • TCP/IP, via localhost:3306 — é o que o DBeaver usa, mesmo estando na mesma máquina, porque ele roda fora do container e precisa atravessar a rede até o processo do MySQL.

  • Unix socket, via o arquivo mysqld.sock — só acessível por processos dentro do mesmo container, como quando você entra nele diretamente com docker exec -it mysql_knex mysql -u root -p.

Por isso, garantir que a porta 3306:3306 esteja mapeada corretamente no docker-compose.yml é essencial para qualquer cliente externo, como o DBeaver, conseguir se conectar.

Bônus: comandos úteis para o dia a dia

Parar o container sem apagar dados:

docker compose stop

Voltar a subir depois de parado:

docker compose start

Ver logs em tempo real:

docker logs -f mysql_knex

Fazer backup do banco (dump):

docker exec mysql_knex mysqldump -u root -p base_de_dados > backup.sql

Restaurar um backup:

docker exec -i mysql_knex mysql -u root -p base_de_dados < backup.sql

Resetar tudo do zero (⚠️ apaga os dados permanentemente):

docker compose down
sudo rm -rf ~/.MySQLDBData/mysqlonly/mysql_knex
docker compose up -d

Conclusão

Com esse setup você tem um MySQL rodando em container, com dados persistidos fora dele (então derrubar o container não te faz perder nada), e uma conexão funcional via DBeaver para gerenciar o banco visualmente. Os dois erros cobertos aqui — a flag de autenticação obsoleta e a recuperação de chave pública — são praticamente um rito de passagem para quem sobe MySQL 8 em Docker pela primeira vez, então se você travou neles, está em boa companhia.