DevOps - MySQL no Docker
Autor: Fernando Anselmo | Publicado: 2016-11-26T14:16:00-02:00

Terceiro artigo da série DevOps, continuação do livro Docker que pode ser acessado através do site&nbsp;Academia.edu.

Entre todas as linguagens que um desenvolvedor possa utilizar, pelo menos um banco de dados é comum a todas elas: MySQL. Utilize PHP, C, Java, Python (talvez não .NET que o pessoal é meio paranoico com Microsoft), ou qualquer outra linguagem o banco de testes será um MySQL.




Então neste artigo veremos como utilizar o MySQL com o Docker (essa mesma técnica pode ser aplicada para o MariaDB ou Postgres - respeitando obviamente a porta deste último). São apenas 3 passos a realizar:

1º) Baixar imagem oficial:

$ docker pull mysql
2º) Rodar o contêiner:

$ docker run --name mybanco -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql
3º) Chamar o administrativo do banco:

$ docker exec -it mybanco mysql -p
Obviamente que não iremos parar por aqui pois não teria a menor graça. Vamos acessar o banco através de um programa Java, ainda com o administrativo aberto crie uma base de dados com o seguinte comando:

&gt; create database teste;
&gt; use teste;
&gt; show tables;

Agora precisamos de um editor para o Java, para meus testes sempre utilizo o BlueJ e o Conector JDBC do MySQL deve ser disponibilizado, para proceder isso:


Baixar o conector JDBC do MySQL no driver oficial ou através desse link.
Acessar no menu principal "Tools | Preferences".
Ir para a pasta "Libraries".
Pressionar o botão "Add" e localizar o conector baixado.

Uma vez adicionado sair e entrar novamente no BlueJ para ativar a biblioteca. Agora é só criar o programa para testar a conexão (através do botão "New Class..."):

import java.sql.*;
import java.text.SimpleDateFormat;

public class Conexao {
    
    private Connection con;

    public static void main(String [] args) {
        new Conexao().executar();
    }
    
    public void executar() {
        try {
            criar();
            selecionar();
        } catch (ClassNotFoundException e) {
            System.out.println(e.getMessage());
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }

    }
    private void conexao() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection(
         "jdbc:mysql://localhost:3306/teste", "root", "root");
    }
         
    private void criar() throws ClassNotFoundException, SQLException {
        conexao();
        // Criar a tabela
        Statement stm = con.createStatement();
        stm.executeUpdate(
            "CREATE TABLE funcionario (" +
            " matricula INT NOT NULL, " +
            " nome VARCHAR(50)," +
            " PRIMARY KEY (matricula))");  
        stm.close();

        // Adicionar 100 funcionarios
        PreparedStatement pstm = con.prepareStatement(
            "INSERT INTO funcionario (matricula, nome) VALUES (?, ?)");
        int tot = 0;
        for (int i = 0; i &lt; 100; i++) {
            pstm.setInt(1, i);
            pstm.setString(2, "Funcionário " + i);
            tot += pstm.executeUpdate();
        }
        System.out.println("Inseridos : " + tot);
        pstm.close();
        con.close();
    }

    private void selecionar() throws ClassNotFoundException, SQLException {
        SimpleDateFormat fdt = new SimpleDateFormat("hh:mm:ss:SSSS");
        conexao();
        // Varrer todos os dados
        Statement stm = con.createStatement();
        ResultSet res = stm.executeQuery(
            "SELECT nome, matricula FROM funcionario");
        int x = 0;
        String nome = null;
        int matricula;
        System.out.println("Tempo Inicial: " + fdt.format(new java.util.Date()));
        while (res.next()) {
            nome = res.getString(1);
            matricula = res.getInt(2);
            x += 1;
        }
        System.out.println("Tempo Final: " + fdt.format(new java.util.Date()));
        System.out.println("O último que li foi " + nome);
        System.out.println("Total de " + x);
    }
}

Na primeira parte deste programa será criada uma tabela na base teste e populada com 100 registros de funcionário, na segunda parte é realizada uma consulta para verificar a existência dos registros e o tempo de performance de leitura.

Assista o vídeo para tirar quaisquer dúvida de como proceder:





Pronto o MySQL está pronto para seus testes, uma boa vantagem é que podemos criar várias instâncias (contêineres) do banco para múltiplos testes ou mesmo destruir sem deixar rastro de quaisquer dados.

Obrigado e até a próxima
Fernando Anselmo