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 em seu computador.
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 ser seguido:
- 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 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
. Usar a palavra-chave latest
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.
Veja como fazer o download da versão 8.2, por exemplo:
$ docker pull mysql:8.2
Depois de fazer o download da imagem, ela deverá ser listada entre as imagens do Docker existentes:
A listagem de imagens do Docker também é possível por meio do 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 com OOP, pense nas imagens do Docker como classes. Assim como a criação de uma única classe permite a criação de vários objetos, as imagens do Docker permitem a criação de 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
A tag -e cria uma variável de ambiente que poderá ser acessada dentro do contêiner. É fundamental definirMYSQL_ROOT_PASSWORD
para que possamos executar comandos SQL posteriormente a partir do contêiner. Certifique-se de armazenar sua senha forte em um local seguro (não em seu cérebro).-d
: abreviação de detached (separado), a tag-d
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 do site 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 de sua máquina host, você pode instalar o cliente MySQL manualmente em seu 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 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 porta local 3307 será encaminhado para a porta 3306 do contêiner e o servidor MySQL poderá ser acessado nessa porta.-d
: Executa o contêiner no modo desconectado 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 gera 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…
Configuração do contêiner 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, devemos 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 dos dois 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, após essa etapa, que tipo de configurações podemos alterar? A resposta depende de seu caso de uso. Abordaremos essas questões a seguir.
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 consultas, que armazena as 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 dos 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 vincular 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. O ajuste desse valor pode evitar o esgotamento de recursos e garantir a eficiência da operação 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 em seus 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. O desacoplamento dos dados do contêiner torna-os 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. Criar um volume:
$ docker volume create test-mysql-data
O comando volume create
cria um armazenamento dedicado em seu 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
Dessa 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 nos documentos de 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
Portanto, 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 anterior my.cnf
no local desejado, além de criar um novo volume chamado final-mysql-data
e montá-lo.
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 pela leitura!
Comece sua jornada de aprendizado hoje mesmo!
curso
Introduction to 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