MySQL e Dockers ... não são novos conceitos, as pessoas estão se mudando para o Dockers há algum tempo. Para alguém que está apenas se movendo para isso em desenvolvimento, isso pode ter alguns obstáculos.
Enquanto o MySQL funciona bem em execução local, se você estiver
testando código em diferentes versões do MySQL, é bom ter várias versões
facilmente disponíveis. Uma opção há anos, é claro, é https://mysqlsandbox.net/ de Giuseppe Maxia. Esta é uma solução muito válida para poder obter várias instâncias e testar a replicação, etc. Dockers agora também são outro cenário frequentemente usado quando se trata de testar versões diferentes do MySQL. A seguir, serão apresentados alguns passos para obter várias versões instaladas facilmente. Eu uso o OSX, então esses exemplos são para o OSX. Você precisa do Docker para iniciar e, claro, e o Docker Desktop é uma ferramenta útil para você poder acessar facilmente.
Depois de configurar o Docker, posso preparar meu ambiente para o MySQL.
Aqui, criei uma pasta Docker que contém os diretórios de dados do
MySQL, os arquivos de configuração e o diretório de arquivos mysql, se
necessário.
mkdir ~/Docker ;
mkdir ~/Docker/mysql_data;
mkdir ~/Docker/mysql-files;
mkdir ~ / Docker / cnf;
Agora dentro do mysql_data
cd ~/Docker/mysql_data;
mkdir 8.0;
mkdir 5.7;
mkdir 5.6;
mkdir 5.5;
Agora eu configurei arquivos cnf simples para este exemplo. A principal coisa a observar é o endereço de ligação. Isso está definido para garantir que seja aberto para alcançarmos o MySQL fora da janela de encaixe.
Você também pode observar que esses arquivos podem ser usados para
configurar informações adicionais de configuração, conforme você
entender por instância do estivador do MySQL.
cd ~/Docker/cnf;
cat my.8.0.cnf
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= /var/lib/mysql-files
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
bind-address = 0.0.0.0
port=3306
server-id=80
# Custom config should go here
!includedir /etc/mysql/conf.d/
cat my.5.7.cnf
[mysqld]
bind-address = 0.0.0.0
server-id=57
max_allowed_packet=32M
$ cat my.5.6.cnf
[mysqld]
bind-address = 0.0.0.0
server-id=56
$ cat my.5.5.cnf
[mysqld]
bind-address = 0.0.0.0
server-id=55
OK. Agora que temos os arquivos de configuração configurados, precisamos construir as janelas de encaixe. Algumas coisas a serem observadas nos comandos de construção.
--name Definimos uma referência nomeada para a janela de encaixe.
Aqui estamos mapeando os arquivos de configuração, o diretório de dados e o diretório mysql-files para a janela de encaixe. Isso nos permite ajustar o arquivo my.cnf e etc facilmente.
-v ~ / Docker / cnf / my.8.0.cnf: /etc/mysql/my.cnf
-v ~ / Docker / mysql_data / 8.0: / var / lib / mysql
-v ~ / Docker / arquivos mysql: / var / lib / arquivos mysql
Queremos alcançar essas instâncias do MySQL fora da janela de encaixe,
portanto, precisamos publicar e mapear a porta de acordo.
-p 3306: 3306 Isso significa 3306 local para 3306 dentro da janela de encaixe
-p 3307: 3306 Isso significa 3307 local para 3306 dentro da janela de encaixe
-p 3308: 3306 Isso significa 3308 local para 3306 dentro da janela de encaixe
-p 3309: 3306 Isso significa 3309 local para 3306 dentro da janela de encaixe
Também passamos algumas variáveis de ambiente.
-e MYSQL_ROOT_HOST =% -e MYSQL_ROOT_PASSWORD = <defina uma senha aqui>
Então, juntando tudo ...
docker run --restart always --name
mysql8.0 -v ~/Docker/cnf/my.8.0.cnf:/etc/mysql/my.cnf -v
~/Docker/mysql_data/8.0:/var/lib/mysql -v
~/Docker/mysql-files:/var/lib/mysql-files -p 3306:3306 -d -e
MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here>
mysql:8.0
docker
run --restart always --name mysql5.7 -v
~/Docker/cnf/my.5.7.cnf:/etc/mysql/my.cnf -v
~/Docker/mysql_data/5.7:/var/lib/mysql -v
~/Docker/mysql-files:/var/lib/mysql-files -p 3307:3306 -d -e
MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here>
mysql:5.7
docker
run --restart always --name mysql5.6 -v
~/Docker/cnf/my.5.6.cnf:/etc/mysql/my.cnf -v
~/Docker/mysql_data/5.6:/var/lib/mysql -v
~/Docker/mysql-files:/var/lib/mysql-files -p 3308:3306 -d -e
MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here>
mysql:5.6
docker
run --restart always --name mysql5.5 -v
~/Docker/cnf/my.5.5.cnf:/etc/mysql/my.cnf -v
~/Docker/mysql_data/5.5:/var/lib/mysql -v
~/Docker/mysql-files:/var/lib/mysql-files -p 3309:3306 -d -e
MYSQL_ROOT_HOST=% -e MYSQL_ROOT_PASSWORD=<set a password here>
mysql:5.5
Após cada execução dos comandos acima, você deve obter um ID retornado.
exemplo: 3cb07d7c21476fbf298648986208f3429ec664167d8eef7fed17bf9ee3ce6316
Você pode iniciar / reiniciar e acessar cada terminal docker facilmente
através do Docker Desktop ou apenas anotar os IDs relacionados e
executá-los através do terminal.
O Docker Desktop também mostra todas as variáveis que você passou para que você possa validar.
Obviamente, você também pode acessar a CLI aqui, parar e iniciar ou destruí-la facilmente.
$ docker exec -it 3cb07d7c21476fbf298648986208f3429ec664167d8eef7fed17bf9ee3ce6316 /bin/sh; exit
# mysql -p
Se o contêiner do Docker já estiver em execução, você poderá acessar o MySQL através do seu terminal localhost.
$ mysql --host=localhost --protocol=tcp --port=3306 -p -u root
Agora, se você estiver tendo algum problema de acesso, lembre-se de
garantir que as contas do MySQL estejam corretas e que suas portas e
mapeamento estejam corretos.
- Conexão perdida com o servidor MySQL ao 'ler o pacote de comunicação inicial'
- ERRO 1045 (28000): acesso negado para o usuário 'root'@'192.168.0.5' (usando a senha: YES)
Agora você pode ver que todos estão ativos e disponíveis e os IDs do
servidor correspondem ao que definimos por eariler de arquivo cnf.
$ mysql --host=localhost --protocol=tcp --port=3306 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| 58e9663afe8d | 8.0.19 | 80 |
+--------------+-----------+-------------+
$ mysql --host=localhost --protocol=tcp --port=3307 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| b240917f051a | 5.7.29 | 57 |
+--------------+-----------+-------------+
$ mysql --host=localhost --protocol=tcp --port=3308 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| b4653850cfe9 | 5.6.47 | 56 |
+--------------+-----------+-------------+
$ mysql --host=localhost --protocol=tcp --port=3309 -e "Select @@hostname, @@version, @@server_id "
+--------------+-----------+-------------+
| @@hostname | @@version | @@server_id |
+--------------+-----------+-------------+
| 22e169004583 | 5.5.62 | 55 |
+--------------+-----------+-------------+