Pular para o conteúdo principal

Como instalar e configurar o MySQL no Docker

Saiba como instalar e configurar o banco de dados MySQL dentro de contêineres do Docker. O tutorial inclui conceitos como conexão com servidores MySQL, execução de clientes MySQL para conexão com contêineres e assim por diante.
24 de abr. de 2024  · 12 min de leitura

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:

image2.png

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.

image3.png

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:

image4.png

A listagem de imagens do Docker também é possível por meio do terminal:

$ docker images

image5.png

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
  • runcria 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=valueA tag -e cria uma variável de ambiente que poderá ser acessada dentro do contêiner. É fundamental definir MYSQL_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_nameO 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:

image6.png

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.

image1.gif

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:

Obrigado pela leitura!

Temas

Comece sua jornada de aprendizado hoje mesmo!

curso

Introduction to SQL

2 hr
876.4K
Learn how to create and query relational databases using SQL in just two hours.
Ver DetalhesRight Arrow
Iniciar Curso
Ver maisRight Arrow
Relacionado

tutorial

Tutorial do MySQL: Um guia abrangente para iniciantes

Descubra o que é o MySQL e como começar a usar um dos sistemas de gerenciamento de banco de dados mais populares.

tutorial

Tutorial de visão geral do banco de dados SQL

Neste tutorial, você aprenderá sobre bancos de dados em SQL.
DataCamp Team's photo

DataCamp Team

3 min

tutorial

Introdução aos acionadores SQL: Um guia para desenvolvedores

Saiba como usar os acionadores SQL para automatizar tarefas, manter a integridade dos dados e melhorar o desempenho do banco de dados. Experimente exemplos práticos como os comandos CREATE, ALTER e DROP no MySQL e no Oracle.
Oluseye Jeremiah's photo

Oluseye Jeremiah

13 min

tutorial

Tutorial de SQLAlchemy com exemplos

Aprenda a acessar e executar consultas SQL em todos os tipos de bancos de dados relacionais usando objetos Python.
Abid Ali Awan's photo

Abid Ali Awan

13 min

tutorial

Tutorial do Insert Into SQL

A instrução "INSERT INTO" do SQL pode ser usada para adicionar linhas de dados a uma tabela no banco de dados.
DataCamp Team's photo

DataCamp Team

3 min

tutorial

Exemplos e tutoriais de consultas SQL

Se você deseja começar a usar o SQL, nós o ajudamos. Neste tutorial de SQL, apresentaremos as consultas SQL, uma ferramenta poderosa que nos permite trabalhar com os dados armazenados em um banco de dados. Você verá como escrever consultas SQL, aprenderá sobre
Sejal Jaiswal's photo

Sejal Jaiswal

21 min

See MoreSee More