MySQL no Docker
Numa definição muito simplista, o Docker é um modo de virtualização mais leve. Na virtualização “tradicional” para ter imagem utilizável você precisa criar a máquina virtual e depois instalar o Sistema Operacional. Com o Docker você pode ter várias imagens sobre o mesmo SO ao mesmo tempo em que mantém o isolamento das aplicações e bibliotecas em cada imagem.
Ao invés de múltiplas VMs, teremos múltiplos containers. Múltiplos SOs dão suporte à tecnologia de containers, em destaque o Linux. Sendo assim, o kernel do SO provê o suporte aos containers e o Docker é uma camada de abstração para facilitar seu uso, similar ao que o Vagrant faz para VMs. Isto nos dá a vantagem adicional do Docker ser agnóstico ao hardware e à plataforma, ou seja, os containers podem ser executados em qualquer lugar, desde seu laptop até grandes máquinas, sejam eles virtuais ou físicas e de qualquer fornecedor. Se você está interessado em detalhes de como a tecnologia de containers funciona, um bom ponto de partida é a documentação do Oracle Linux, cap. 9.
Na prática, se comparado com VMs, os containers usarão muito menos recursos da máquina para ter várias aplicações ou instâncias de aplicações devidamente isoladas, com suas respectivas bibliotecas. Isto traz um grande benefício não só para desenvolvedores que desejam ter múltiplas versões de aplicações, mas também para Administradores de Sistemas que precisam gerenciar múltiplas instâncias de aplicações e extrair o máximo do hardware.
O MySQL também está disponível para uso com Docker. Portanto, é uma ótima opção usar o Docker para ter múltiplas instâncias de MySQL na mesma máquina, ou seja, uma alternativa ao mysql_multi. Por exemplo, podemos usar esta tecnologia para ajudar o desenvolvedor a ter múltiplas instâncias de MySQL na mesma máquina para testar a replicação com read-write split ou o isolamento de instâncias por cliente (simular multi-tenant).
Se você é novo na utilização do Docker, é recomendado seguir este rápido tutorial: https://www.docker.com/tryit.
Instalação do Docker no Oracle Linux 7
Vamos utilizar o Oracle Linux 7 como SO para testar o MySQL no Docker. Você encontra um tutorial de como criar uma VM com Oracle Linux aqui: http://www.alastori.com.br/2014/11/tutorial-ambiente-de-testes-com-mysql.html. Neste tutorial, você pode ignorar a seção de instalação do MySQL Enterprise.
Para os testes, desabilite temporariamente o SELinux ou deixe no modo Permissive:
# setenforce Permissive
Para instalar o Docker, primeiro habilite add ons do Oracle Linux 7. Edite as configurações do repositório public-yum para enabled=1 na seção [ol7_addons]
# vi /etc/yum.repos.d/public-yum-ol7.repo
[ol7_addons]
name=Oracle Linux $releasever Add ons ($basearch)
baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL7/addons/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle>
gpgcheck=1
enabled=1
Agora prossiga com a instalação do Docker via YUM:
# yum install docker
Para inicializar simplesmente faça:
# systemctl start docker.service
Adicione a inicialização no boot:
# systemctl enable docker.service
Pronto! Se você deseja utilizar o Oracle Linux 6, o procedimento é muito parecido, veja https://docs.docker.com/installation/oracle. Se quiser utilizar outro SO, veja a respectiva documentação no site do Docker https://docs.docker.com/installation.
MySQL no Docker
Pensando no Docker como uma “VM light”, o próximo passo é intuitivo: instalar o MySQL. Isso é perfeitamente possível, porém a Oracle já disponibiliza imagens otimizadas com o MySQL pré-instalado. Estas imagens estão disponíveis em no Docker Hub Registry https://registry.hub.docker.com/u/mysql/mysql-server.
Para criar uma nova instância com a versão mais recente estável do MySQL basta executar:
# docker run --name container-teste-mysql -e MYSQL_ROOT_PASSWORD=senha-mysql -d mysql/mysql-server:latest
Se tudo ocorreu bem, você verá a seguinte mensagem:
Status: Downloaded newer image for mysql/mysql-server:latest
...
Veja os containers que estão em execução com:
# docker ps
CONTAINER ID IMAGE ... NAMES ...
08cd9827bf73 mysql/mysql-server:latest ... container-teste-mysql ...
Agora você pode acessar o shell do container e testar o MySQL:
# docker exec -it container-teste-mysql bash
# mysql -uroot -p
(senha definida no passo anterior como senha-mysql)
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 1
Server version: 5.6.23 MySQL Community Server (GPL)
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 5.6.23 |
+-----------+
1 row in set (0.00 sec)
mysql> quit
# exit
Você pode parar ou pausar o container com os comandos stop, start, pause, unpause. Por exemplo:
# docker stop container-teste-mysql
# docker ps -a
# docker start container-teste-mysql
# docker ps -a
Simples! Não é mesmo?
Acesso ao MySQL fora do container
Esta imagem está pré-configurada para que o MySQL escute a porta padrão (3306). A maneira mais usual de acessar externamente um container é linkar com outro container que contém a aplicação.
Usaremos o mysql client (linha de comando) a partir de outro container para conectar ao container-teste-mysql que já iniciamos anteriormente. Para este teste simples, vamos reutilizar a mesma imagem MySQL, pois ela já possui o mysql client instalado. Para iniciar um novo container com o link para o container original faça:
# docker run -it --link container-teste-mysql:mysql1 --name novo-container-teste-mysql -e MYSQL_ROOT_PASSWORD=senha-mysql -d mysql/mysql-server:latest
# docker ps
CONTAINER ID IMAGE ... NAMES ...
2b65839aecba mysql/mysql-server:latest ... novo-container-teste-mysql ...
08cd9827bf73 mysql/mysql-server:latest ... container-teste-mysql ...
No parâmetro –link especificamos o nome do container que queremos linkar e também um alias. Dentre outras coisas, o alias é usado para atualizar o arquivo /etc/hosts da nova “máquina” com o IP da “máquina” linkada. Usaremos este nome como rota de acesso.
Entre na linha de comando do novo-container-teste-mysql e tente conectar-se a container-teste-mysql
# docker exec -it novo-container-teste-mysql bash
# mysql -uroot -p --host=mysql1
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 5
Server version: 5.6.23 MySQL Community Server (GPL)
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
mysql>
Antes de usar em produção
Como toda tecnologia nova, tome alguns cuidados antes de usar em produção, principalmente com as questões de segurança. Veja a documentação do Docker que possui algumas informações específicas sobre segurança.
No caso específico de MySQL, não deixe de ler a seção “Where to Store Data” do MySQL no repositório Registry Hub.
Conclusão
O Docker é um projeto muito interessante que facilita o uso da tecnologia de containers. Tanto desenvolvedores quanto Administradores de Sistema podem beneficiar-se do uso desta tecnologia. Como o MySQL escala tipicamente usando uma abordagem horizontal, conhecer esta tecnologia pode facilitar muito o desenvolvimento e deploy de múltiplas aplicações. Este artigo é apenas uma introdução e há muito mais o que explorar! Deixe nos comentários sugestões para novos artigos.
Referências
- https://www.docker.com/tryit/
- http://dev.mysql.com/doc/refman/5.7/en/mysqld-multi.html
- https://github.com/docker/docker
- http://docs.oracle.com/cd/E37670_01/E37355/html/ol_containers.html
- https://docs.docker.com/installation/oracle/
- https://docs.docker.com/installation/
- https://docs.docker.com/introduction/understanding-docker/
- https://registry.hub.docker.com/_/mysql/
- https://docs.docker.com/articles/security/