curso
Como instalar e configurar o MySQL no Docker
O MySQL é a ferramenta de banco de dados relacional mais popular, com uma participação de mercado de mais de 40%. Em comparação com seus concorrentes, PostgreSQL (16%) e Oracle Database (11%), seus números parecem muito bons.
O MySQL é popular porque é simples, mas poderoso. Aqui estão seus melhores recursos:
- Relacional: segue o modelo relacional e usa SQL para gerenciar bancos de dados.
- Código aberto (licença GNU): a comunidade adora. As empresas adoram.
- Escalável: pode lidar com aplicativos de pequeno porte a nível empresarial.
- Seguro: oferece autenticação de usuário, gerenciamento de acesso e criptografia.
- Alto desempenho: conhecido por sua velocidade e eficiência no tratamento de consultas complexas e grandes volumes de dados.
- Replicação e backup: possui opções para replicação e backup de dados, permitindo estratégias de recuperação de desastres.
Quanto ao uso do MySQL dentro de contêineres Docker, bem, isso é apenas uma combinação feita nas nuvens. Se você já trabalhou com o Docker antes, todos os seus benefícios também se aplicam aos contêineres do Docker do MySQL:
- Isolamento e consistência: A instância do MySQL será isolada de outros softwares e dependências, evitando possíveis conflitos
- Controle de versão: O Docker permite que você crie versões de toda a sua pilha de software junto com o MySQL. Isso significa que você pode reproduzir seu ambiente a qualquer momento, facilitando o desenvolvimento e os testes.
- Escalabilidade e gerenciamento de recursos: Com o Docker, você pode dimensionar seu aplicativo MySQL alocando facilmente mais recursos, como memória ou CPU.
- Gerenciamento de dependências: O Docker encapsula sua instância do MySQL, permitindo que você gerencie diferentes versões dela sem incomodar nada em seu computador local.
O mais importante de tudo é que seu aplicativo MySQL funcionará em qualquer lugar, não apenas no seu computador.
Se você quiser comparar o MySQL com seu segundo concorrente mais popular, confira nossa análise detalhada PostgreSQL vs. PostgreSQL. MySQL comparação.
Portanto, hoje, você aprenderá os fundamentos da execução do MySQL em conjunto com o Docker. Vamos começar!
Pré-requisitos
Como este artigo se concentra nos contêineres do MySQL Docker, ele tem alguns pré-requisitos para que você possa acompanhá-lo:
- Acesso à linha de comando/terminal: você precisa de um ambiente local com acesso ao terminal. Se você estiver em um ambiente Jupyter como o Colab, mude agora.
- Uma instância do Docker em execução: você deve ter o Docker Desktop já instalado (instruções em nosso tutorial Docker para ciência de dados). Quando estiver totalmente operacional, a parte inferior esquerda da interface apresentará uma baleia bebê verde:
e o comando docker --help
funciona sem erros no terminal.
- Familiaridade básica com o Docker: embora eu vá explicar todos os comandos usados no artigo, o conhecimento básico do Docker aumentará significativamente os benefícios que você poderá obter com este artigo.
- SQL: o mesmo vale para o SQL - não explicarei nenhum comando SQL usado neste artigo, pois isso nos desviará do tópico principal. Se suas habilidades em SQL estiverem um pouco enferrujadas, você poderá revisitar os tópicos mais importantes deste curso de SQL.
Baixando a imagem oficial do MySQL Docker
Começaremos fazendo o download da imagem oficial do MySQL Docker com o seguinte comando:
$ docker pull mysql:latest
docker pull
requer o nome e a versão da imagem com a sintaxe image:version
. Usando a palavra-chave latest
, você faz o download da versão estável mais recente.
Se você visitar a página oficial da imagem do MySQL no Docker Hub, poderá ver muitas outras versões para diferentes finalidades.
Aqui está como você pode fazer o download da versão 8.2, por exemplo:
$ docker pull mysql:8.2
Depois que você baixar a imagem, ela deverá ser listada entre as imagens do Docker existentes:
Você também pode listar imagens do Docker pelo terminal:
$ docker images
Lembre-se: As imagens do Docker são projetos para a criação de contêineres. Assim como uma planta permite que você construa uma casa, uma imagem do Docker contém todas as instruções e componentes necessários para criar uma instância em execução de um aplicativo ou serviço.
Se você vem de uma experiência em OOP, pense nas imagens do Docker como classes. Assim como a criação de uma única classe permite que você crie vários objetos, as imagens do Docker permitem que você crie vários contêineres a partir delas.
Execução e gerenciamento de um contêiner do servidor MySQL
Agora, vamos criar nosso primeiro contêiner com a imagem mysql
. Aqui está o comando que usaremos:
$ docker run --name test-mysql -e MYSQL_ROOT_PASSWORD=strong_password -d mysql
run
cria um novo contêiner ou inicia um já existente--name CONTAINER_NAME
: dá um nome ao contêiner. O nome deve ser legível e curto. Em nosso caso, o nome étest-mysql
.-e ENV_VARIABLE=value
Se você não tiver uma variável de ambiente, poderá usá-la para criar uma variável de ambiente: a tag -e cria uma variável de ambiente que poderá ser acessada dentro do contêiner. É fundamental definirMYSQL_ROOT_PASSWORD
para que você possa executar comandos SQL posteriormente no contêiner. Certifique-se de armazenar sua senha forte em algum lugar seguro (não em seu cérebro).-d
-d
: abreviação de detached (separado), a tag faz com que o contêiner seja executado em segundo plano. Se você remover essa tag, o comando continuará imprimindo logs até que o contêiner pare.image_name
O argumento final é o nome da imagem a partir da qual o contêiner será criado. Nesse caso, nossa imagem émysql
.
Se o comando retornar uma longa sequência de caracteres sem sentido (o ID do contêiner), isso significa que o contêiner foi iniciado. Você pode verificar seu status em docker ps
:
Lembre-se: um contêiner do Docker é um emulador avançado de um sistema operacional. Além de executar o MySQL, você pode realizar qualquer tarefa que normalmente faria com o terminal do seu computador a partir do contêiner.
Para acessar o terminal dentro do seu contêiner, você pode usar o seguinte comando:
$ docker exec -it container_name bash
Isso iniciará uma sessão bash.
Conectando-se ao contêiner do servidor MySQL localmente
Todos os contêineres do MySQL iniciam um servidor MySQL que inclui tudo para criar e gerenciar bancos de dados usando SQL. Para se conectar ao servidor, os contêineres também vêm com um cliente MySQL que nos permite executar consultas SQL. O cliente é apenas um nome sofisticado para o comando do terminal mysql. Vamos usá-lo no terminal do test-mysql
:
1. Abra o terminal bash de test-mysql
:
$ docker exec -it test-mysql bash
2. Conecte-se ao cliente como usuário root:
$ mysql -u root -p
Enter password: ...
mysql>
Estamos usando a tag -u
para especificar o nome de usuário (root
) e adicionando a tag -p
para inserir a senha quando solicitado.
Também é possível conectar-se ao servidor MySQL fora do contêiner. Por exemplo, para se conectar a partir da máquina host, você pode instalar o cliente MySQL manualmente no sistema.
Para instalar o MySQL e seu cliente no Windows, você pode seguir as instruções do guia de instalação oficial do MySQL.
Para Mac, você pode usar o Homebrew:
$ brew install mysql
Para Linux ou WSL2 (minha escolha), você pode usar sudo
:
$ sudo apt update
$ sudo apt install mysql-client
Após a instalação, se você estiver executando o contêiner, pare e remova-o:
$ docker stop test-mysql
test-mysql
$ docker rm test-mysql
Em seguida, reiniciaremos o contêiner mapeando uma porta do contêiner para uma porta em nossa máquina local:
$ docker run -d --name test-mysql -e MYSQL_ROOT_PASSWORD=strong_password -p 3307:3306 mysql
Esse comando faz o seguinte:
-p 3307:3306
: Mapeia a porta 3306 do contêiner (a porta padrão do MySQL) para a sua porta local 3307. Isso significa que qualquer tráfego enviado para a sua porta local 3307 será encaminhado para a porta 3306 do contêiner e o seu servidor MySQL poderá ser acessado nessa porta.-d
: Executa o contêiner no modo desanexado novamente.--name test-mysql
: Reutiliza o mesmo nome de contêiner "test-mysql".-e MYSQL_ROOT_PASSWORD=strong_password
: Define a senha da raiz novamente para o servidor MySQL.mysql
: Especifica a imagem do Docker a ser executada, que é a imagem oficial do MySQL.
Depois que o terminal gerar um novo ID para o contêiner, podemos verificar os mapeamentos de porta:
$ docker port test-mysql
3306/tcp -> 0.0.0.0:3307
Foi um sucesso! Agora, em seu computador local, você pode se conectar ao servidor na porta 3307 usando o cliente mysql
:
$ mysql --host=127.0.0.1 --port=3307 -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.2.0 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates…
Torne-se certificado em SQL
Configuração do contêiner do MySQL
Você pode configurar os contêineres do MySQL para muitas definições usando um arquivo de configuração. Normalmente, o arquivo será armazenado em um dos seguintes diretórios do contêiner:
/etc/mysql/
/etc/mysql/conf.d
/etc/mysql/mysql.conf.d
Os diretórios mudam de imagem para imagem. Mas o nome de arquivo e a extensão padrão para um arquivo de configuração são my.cnf
. Se o arquivo não existir em nenhum dos diretórios listados acima, isso significa que o contêiner requer um arquivo de configuração personalizado. Esse é o caso do nosso contêiner test-mysql
:
$ ls /etc/mysql/conf.d/ # Returns no output
Em situações como essa, precisamos tomar as seguintes medidas cuidadosas:
1. Pare e remova o contêiner:
$ docker stop test-mysql; docker rm test-mysql
2. Crie um arquivo de configuração vazio localmente (em seu computador):
$ sudo mkdir -p /etc/docker/test-mysql # Create a dir
$ sudo touch /etc/docker/test-mysql/my.cnf # Create a config file inside dir
3. Reinicie o contêiner vinculando os dois arquivos .cnf
vazios:
$ docker run \
--name test-mysql \
-v /etc/docker/test-mysql:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=strong_password \
-d mysql
Estamos escrevendo uma nova tag: -v
, que é a abreviação de volume. A tag pode ser usada para vincular diretórios entre o contêiner e a máquina local. No jargão da ciência da computação, esse processo é chamado de montagem.
Portanto, no comando acima, estamos montando o diretório local /etc/docker/test-mysql
no diretório /etc/mysql/conf.d
do contêiner. Isso vinculará o conteúdo de ambos os diretórios. Todas as alterações feitas em um dos diretórios serão refletidas em ambos.
A montagem nos permite editar o arquivo my.cnf
em nosso computador local para alterar as configurações dos contêineres do Docker. E a melhor parte é que as configurações modificadas persistirão em nossa máquina local mesmo depois que o contêiner for interrompido ou removido. Ele será reutilizável.
Então, depois dessa etapa, que tipo de configurações podemos alterar? A resposta depende do seu caso de uso. Abordaremos esses assuntos a seguir.
Você gostaria de obter a certificação Docker? Confira nosso guia para você obter uma certificação Docker!
Quais opções você deve configurar?
Embora a configuração padrão dos contêineres do MySQL Docker funcione para muitos cenários comuns, você deve modificar determinadas configurações para otimizar o desempenho, a segurança e o uso de recursos. Aqui estão algumas das opções de configuração mais comumente alteradas:
Desempenho
- innodb_buffer_pool_size: Essa configuração determina a quantidade de memória alocada para o pool de buffers do InnoDB, que armazena em cache os dados acessados com frequência para uma recuperação mais rápida. Aumentar esse valor pode melhorar o desempenho de cargas de trabalho com muita leitura, mas também consome mais memória.
- query_cache_size: Essa configuração controla o tamanho do cache de consulta, que armazena consultas executadas anteriormente para uma reexecução mais rápida. O aumento desse valor pode melhorar o desempenho de consultas repetitivas, mas também consome mais memória e pode não ser eficaz para consultas dinâmicas.
- thread_pool_size: Essa configuração determina o número máximo de conexões simultâneas com as quais o servidor pode lidar. O ajuste desse valor com base na carga de tráfego esperada pode otimizar a utilização de recursos e evitar gargalos.
Segurança
- bind-address: Essa opção restringe o servidor MySQL a escutar somente em interfaces de rede específicas, limitando o acesso de fontes não autorizadas.
- mysql_bind_host: Essa configuração permite que você vincule o servidor MySQL a endereços IP específicos em vez de escutar em todas as interfaces.
- validate_password_policy: Essa opção permite requisitos de senha mais rígidos para aumentar a segurança.
Utilização de recursos
- max_connections: Essa configuração controla o número máximo de conexões simultâneas permitidas. Se você ajustar esse valor, poderá evitar o esgotamento de recursos e garantir uma operação eficiente do servidor.
- innodb_file_per_table: Essa opção armazena cada tabela do InnoDB em um arquivo separado, o que pode melhorar o desempenho, mas aumenta os requisitos de espaço de armazenamento.
- innodb_io_capacity: Essa opção define o IOPS (operações de entrada/saída por segundo) estimado para o sistema de armazenamento, permitindo que o mecanismo otimize o uso do pool de buffer e as operações de disco.
Outras modificações comuns
- character_set_server: Essa opção define o conjunto de caracteres padrão para o servidor, garantindo a codificação e o tratamento consistentes dos dados.
- collation_server: Essa opção determina as regras de agrupamento padrão usadas para classificação e comparação de dados de caracteres.
- log_bin: Essa opção permite o registro binário da atividade do servidor, o que pode ser útil para a solução de problemas e a replicação.
Para ver a lista completa de opções de configuração, você pode executar o seguinte comando:
$ docker run -it --rm mysql:tag --verbose --help
Você pode editar o arquivo .cnf
com qualquer editor de texto. Aqui está a sintaxe que você deve seguir:
[mysqld]
max_connections=200
other_params=value
...
Como preservar os dados armazenados no contêiner do MySQL Docker
A persistência dos dados armazenados nos contêineres MySQL é crucial por vários motivos:
- Persistência de dados: Quando você interrompe ou remove um contêiner, todos os dados são perdidos, inclusive o banco de dados. Ao desacoplar os dados do contêiner, você os torna sempre acessíveis.
- Compartilhamento de dados entre contêineres: A desvinculação dos dados do contêiner permite que vários contêineres tenham acesso a eles. Dessa forma, você pode evitar a duplicação de dados e simplificar a sincronização entre projetos que usam os mesmos dados.
- Portabilidade e backup: os dados persistentes podem ser facilmente armazenados em backup e compartilhados de forma independente, proporcionando uma maneira confiável de se recuperar de perda de dados ou exclusão acidental.
- Desempenho e escalabilidade aprimorados: Ao armazenar dados acessados com frequência em armazenamento persistente, como SSDs, você pode melhorar o desempenho do seu aplicativo em comparação com a dependência da camada gravável do contêiner, que normalmente é mais lenta.
O processo é o mesmo que já vimos: vamos criar um volume e montá-lo no local onde os dados estão armazenados em nosso contêiner. Aqui estão as etapas:
1. Crie um volume:
$ docker volume create test-mysql-data
O comando volume create
cria um armazenamento dedicado no sistema de arquivos local para o volume. Depois que o volume for montado, todos os dados do contêiner serão vinculados a ele.
2. Reinicie o contêiner com o volume montado:
$ docker stop test-mysql; docker rm test-mysql
$ docker run \
--name test-mysql \
-v test-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=strong_password \
-d mysql
Desta vez, a sintaxe está no seguinte formato: -v volume_name:directory_in_container
. Todos os volumes criados devem ser montados no diretório /var/lib/mysql
, conforme especificado na documentação da imagem do MySQL.
Portanto, agora, todos os bancos de dados ou tabelas criados em test-mysql
serão mantidos localmente, mesmo depois que o contêiner for interrompido ou removido.
O comando final
Ao longo do artigo, nosso comando docker run
evoluiu significativamente. Portanto, vamos reunir todas as suas variações em um único comando mestre final. Temos que parar e remover o contêiner novamente. Também removeremos o volume para começar do zero:
$ docker stop test-mysql; docker rm test-mysql
$ docker volume rm test-mysql-data
Então, aqui está o comando mestre final:
$ docker run \
--name final-mysql \
-e MYSQL_ROOT_PASSWORD=strong_password \
-p 3307:3306 \
-v /etc/docker/test-mysql:/etc/mysql/conf.d \
-v final-mysql-data:/var/lib/mysql \
-d mysql
Esse comando monta nosso arquivo local my.cnf
anterior no local desejado, além de criar um novo volume chamado final-mysql-data
e montá-lo. Você pode usar o comando para montar o arquivo local.
Gerenciando configurações complexas do MySQL com o Docker Compose
Para configurações mais avançadas que envolvem vários contêineres, como a execução do MySQL juntamente com outros serviços (por exemplo, servidores da Web ou back-ends de aplicativos), o Docker Compose simplifica o processo, permitindo que você defina e gerencie aplicativos de vários contêineres com um único arquivo de configuração.
Aqui está um exemplo básico de um arquivo docker-compose.yml
para um contêiner MySQL:
version: '3.9'
services:
db:
image: mysql:8.3.0
container_name: mysql-db
environment:
MYSQL_ROOT_PASSWORD: strong_password
MYSQL_DATABASE: example_db
MYSQL_USER: user
MYSQL_PASSWORD: user_password
ports:
- "3306:3306"
volumes:
- db_data:/var/lib/mysql
- ./mysql-config:/etc/mysql/conf.d
volumes:
db_data:
Etapas para usar o Docker Compose:
- Crie um arquivo
docker-compose.yml
: Salve o arquivo de configuração no diretório do projeto. - Inicie os serviços: Execute o seguinte comando para iniciar todos os serviços definidos no arquivo:
docker-compose up -d
- Interrompa os serviços: Quando terminar, encerre os serviços:
docker-compose down
Benefícios do Docker Compose para MySQL:
- Configuração simplificada: Gerencie as configurações, as portas e os volumes do MySQL em um único arquivo.
- Dimensionamento mais fácil: Amplie facilmente o banco de dados ou integre-o a outros serviços em sua pilha de aplicativos.
- Dados persistentes: Gerencie automaticamente os volumes para persistência de dados entre reinicializações de contêineres.
O uso do Docker Compose é particularmente útil para gerenciar vários ambientes (por exemplo, desenvolvimento, preparação e produção) ou ao colaborar com equipes.
Conclusão
Este artigo abordou os aspectos essenciais da execução e do gerenciamento de bancos de dados MySQL dentro de contêineres do Docker. Aprendemos como fazer download e configurar imagens do MySQL, iniciar servidores MySQL dentro de contêineres, como modificar esses contêineres e adicionar volumes para configuração personalizada e persistência de dados.
Para saber mais sobre o assunto, recomendo os seguintes recursos:
- Introdução ao Docker para ciência de dados
- Curso de introdução ao Docker
- Containerização do Docker e do Kubernetes para aprendizado de máquina
- Documentação da imagem do Docker do MySQL
- Manual de referência do MySQL
Obrigado a você por ler!
Torne-se um engenheiro de dados
Perguntas frequentes
Posso usar o Docker Compose para gerenciar vários contêineres do MySQL?
Sim, o Docker Compose é uma excelente ferramenta para gerenciar vários contêineres do Docker, incluindo o MySQL. Você pode definir as configurações do serviço MySQL em um arquivo docker-compose.yml
, permitindo que você inicie, pare e gerencie vários serviços com um único comando.
Como faço para atualizar o MySQL para uma versão mais recente em um contêiner do Docker?
Para atualizar o MySQL em um contêiner do Docker, você precisa obter a nova versão da imagem do MySQL no Docker e, em seguida, recriar o contêiner com essa nova imagem. Certifique-se de que você tenha backups de seus dados antes de prosseguir com a atualização.
Posso executar vários contêineres do MySQL no mesmo host?
Sim, você pode executar vários contêineres do MySQL no mesmo host. Cada contêiner deve ser atribuído a uma porta exclusiva no host usando a opção -p
para evitar conflitos de porta.
Quais são as práticas recomendadas de segurança para executar contêineres MySQL?
As práticas recomendadas de segurança incluem não expor os contêineres do MySQL à Internet pública sem medidas de segurança adequadas, usar senhas fortes, atualizar regularmente as imagens do Docker e do MySQL e usar segredos do Docker para informações confidenciais, como senhas.
Como posso automatizar o backup de bancos de dados MySQL no Docker?
Você pode automatizar os backups criando um cron job na máquina host que usa o docker exec
para executar omysqldump
dentro do contêiner. Como alternativa, você pode usar volumes do Docker para manter os dados e lidar com backups diretamente do host.
Posso me conectar ao contêiner do MySQL Docker a partir de outro contêiner?
Sim, você pode se conectar a partir de outro contêiner, garantindo que os dois contêineres estejam na mesma rede do Docker. Você pode usar o nome do contêiner como o nome do host ao se conectar.
Como faço para solucionar problemas de conexão com meu contêiner MySQL?
Solucione problemas de conexão verificando se o contêiner está em execução (docker ps
), verificando os mapeamentos de porta (docker port
), verificando as configurações de rede e garantindo que o servidor MySQL dentro do contêiner esteja configurado para aceitar conexões do seu host ou de outros contêineres.
É possível usar um arquivo de configuração personalizado do MySQL sem montá-lo no host?
Sim, você pode criar um arquivo de configuração personalizado dentro do próprio contêiner. No entanto, é mais comum montá-lo no host para facilitar o gerenciamento e a persistência.
Como posso monitorar o desempenho do meu contêiner MySQL?
Você pode monitorar o desempenho usando ferramentas como mysqladmin
para métricas específicas do MySQL, o comando stats incorporado do Docker (docker stats
) ou soluções de monitoramento de terceiros, como o Prometheus, com exportadores para o Docker e o MySQL.
O que devo fazer se o meu contêiner do MySQL Docker falhar?
Se o contêiner falhar, primeiro verifique os registros usando docker logs
para identificar quaisquer erros. Verifique se a configuração e as variáveis de ambiente estão corretas e se não há restrições de recursos (CPU, memória). Reinicie o contêiner e monitore seu desempenho.

Sou um criador de conteúdo de ciência de dados com mais de 2 anos de experiência e um dos maiores seguidores no Medium. Gosto de escrever artigos detalhados sobre IA e ML com um estilo um pouco sarcástico, porque você precisa fazer algo para torná-los um pouco menos monótonos. Produzi mais de 130 artigos e um curso DataCamp, e estou preparando outro. Meu conteúdo foi visto por mais de 5 milhões de pessoas, das quais 20 mil se tornaram seguidores no Medium e no LinkedIn.
Comece sua jornada de aprendizado hoje mesmo!
programa
Containerization and Virtualization
curso
Intermediate Docker
tutorial
Tutorial do MySQL: Um guia abrangente para iniciantes
tutorial
Tutorial de visão geral do banco de dados SQL

DataCamp Team
3 min
tutorial
Introdução aos acionadores SQL: Um guia para desenvolvedores

Oluseye Jeremiah
13 min
tutorial
Tutorial de SQLAlchemy com exemplos
tutorial
Tutorial do Insert Into SQL

DataCamp Team
3 min
tutorial