Tutorial criar docker container do MySQLTuner

Objetivo

Criar um container com o software MySQLTuner integrado a uma base de dados, utilizando o docker compose.

Condições de contorno

Neste tutorial, vamos realizar teste em um container com a base de dados MariaDB (fork do mysql) em um sistema operacional linux em um processador ARM.

Passo a passo para utilizar o mysqltuner como um container com o docker compose

Passo 1: Conexão SSH

Conecte no seu servidor por SSH, por exemplo:

ssh vinicius@192.168.1.100

Passo 2: Criar diretórios para arquivos do container

Vamos criar um diretório dentro da pasta do usuário chamado docker, e depois uma pasta chamada MySQLTuner dentro desta pasta:

mkdir ~/docker
mkdir ~/docker/mysqltuner
cd ~/docker/mysqltuner

Passo 3: Criar o arquivo .env

O arquivo environment (.env) irá guardar as informações de conexão na base de dados. Vamos utilizar de exemplo a base de dados do container do moodle deste tutorial: container moodle

nano .env

Inserir as informações dentro do arquivo:

DOMAIN=cursos.viniciuspaes.com
HOST=moodledb
USER=root
PASS=senha_banco_dados
PORT=3306
MEM=8192

Lembrando que nas informações acima, o nome do HOST é o nome do nosso container do mariadb. Como estamos utilizando o exemplo do container que hospeda o moodle, o nome dele é moodledb (container da imagem do mariadb). A porta utilizada é a porta interna do container, que a padrão do mysql/mariadb é a 3306. A variável MEM, é relativa a memória ram disponível do HOST. A variável DOMAIN é utilizada para dar nome ao container, como estamos utilizando o exemplo do container do moodle, mantivemos o nome do subdomínio para ficar organizado dentro do portainer quando formos procurar pela stack.

Passo 4 – Criar a rede privada do mysqltuner

Para evitar abrir porta externa do container do mariadb, vamos ter que colocar o container do MySQLTuner na mesma rede do container do mariadb que queremos inspecionar. Primeiro, vamos criar então uma rede chamada MySQLTuner:

docker network create mysqltuner

Passo 5 – Editar o docker compose do seu container do mariadb

Se não tiver criado ainda um container do mariadb, basta criar. Se já tiver um container criado, basta adicionar a rede mysqltuner no container do mariadb. No exemplo abaixo destacamos apenas o update que realizamos no container do mariadb para adicionar a rede do mysqltuner e ativar o performance-schema:

  moodledb:
    image: mariadb:latest
    container_name: ${DOMAIN}_db
    command: '--default-authentication-plugin=mysql_native_password --performance-schema'
    volumes:
      - ./db_data:/var/lib/mysql
      - ./mariadb-conf/my.cnf:/root/.my.cnf
    restart: always
    env_file: .env
    environment:
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_DATABASE=${MYSQL_DB}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD}
      - MARIADB_CHARACTER_SET=utf8mb4
      - MARIADB_COLLATE=utf8mb4_unicode_ci
    networks:
      - default
      - mysqltuner

networks:
  default:
    name: rede_${DOMAIN}
  rede_proxy_reverso:
    external: true
  mysqltuner:
    external: true

No código acima, repare que mapeamos o arquivo my.cnf para acesso externo ao container. Desta forma, caso tenha o desejo de realizar modificações de performance nessa instância do mysql, basta editar o arquivo e adicioná-las.

Passo 6 – Criar o docker compose do container do mysqltuner

Vamos criar agora o docker compose do container do MySQLTuner:

nano docker-compose.yml

Inserir o conteúdo abaixo dentro do arquivo:

services:

  mysqltuner:
    container_name: ${DOMAIN}_mysqltuner
    build: .
    volumes:
     - ./projects:/srv/projects
    env_file:
      - .env
    networks:
      - mysqltuner
    stdin_open: true
    tty: true
    command: --host ${HOST} --port ${PORT} --user ${USER} --pass ${PASS} --forcemem ${MEM}

networks:
  mysqltuner:
    external: true

Passo 7 – Realizar download de arquivos necessários do MySQLTuner

Precisamos agora realizar o download dos arquivos necessários para o funcionamento do MySQLTuner:

wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/vulnerabilities.csv
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/basic_passwords.txt
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/template_example.tpl

Passo 8 – Criar o arquivo Dockerfile

Vamos construir nosso próprio container do MySQLTuner, então precisamos criar um arquivo do tipo Dockerfile:

nano Dockerfile

Inserir o código abaixo dentro do arquivo:

FROM ubuntu:latest

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt upgrade -y && apt-get install -yq --no-install-recommends \
    apt-utils \
    curl \
    wget \
    perl \
    perl-doc \
    mysql-client \
    libjson-perl \
    libtext-template-perl \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* \
    && mkdir -p /results

RUN apt clean all

WORKDIR /

COPY ./mysqltuner.pl /mysqltuner.pl
COPY ./vulnerabilities.csv /vulnerabilities.txt
COPY ./basic_passwords.txt /basic_passwords.txt
COPY ./template_example.tpl /template.tpl

ENTRYPOINT [ "perl", "/mysqltuner.pl", "--passwordfile", "/basic_passwords.txt",\
             "--cvefile", "/vulnerabilities.txt", "--nosysstat", "--defaults-file", \
             "/defaults.cnf", "--dumpdir", "/results", "--outputfile", \
             "/results/mysqltuner.txt", "--template", "/template.tpl", \
             "--reportfile", "/results/mysqltuner.html" ]

CMD ["--verbose" ]

Passo 9 – Criar o container do mysqltuner

Agora é a última etapa! Para utilizar o docker compose para iniciar o container:

docker compose up -d

Se tudo correu bem e as configurações foram realizadas da forma correta, é possível inspecionar o log do container do MySQLTuner e verificar a saída do diagnóstico:

docker logs cursos.viniciuspaes.com_mysqltuner

No comando acima, você pode substituir o nome do container pelo seu ID de identificação. Primeiro utilize o comando:

docker ps

Agora anote o ID do container do mysqltuner, por exemplo:

CONTAINER ID   IMAGE             COMMAND                  CREATED             STATUS           NAMES
ab81292190a2   mariadb:latest    "docker-entrypoint.s…"   45 minutes ago      Up 45 minutes    cursos.viniciuspaes.com_db
jh370de553a5   mysqltuner        "perl /mysqltuner.pl…"   About an hour ago   Up 5 seconds     cursos.viniciuspaes.com_mysqltuner

No código acima, vemos que o ID do container do MySQLTuner é:

jh370de553a5

Podemos então acessar o log do container pelo comando:

docker logs jh370de553a5

Vamos ter como saída algo como:

-------- Recommendations ---------------------------------------------------------------------------
General recommendations:
    MySQL was started within the last 24 hours: recommendations may be inaccurate
    Reduce your overall MySQL memory footprint for system stability
    Dedicate this server to your database for highest performance.
    Be careful, increasing innodb_log_file_size / innodb_log_files_in_group means higher crash recovery mean time
Variables to adjust:
  *** MySQL's maximum memory usage is dangerously high ***
  *** Add RAM before increasing MySQL buffer variables ***
    table_definition_cache (600) > 792 or -1 (autosizing if supported)
    innodb_log_file_size should be (=32M) if possible, so InnoDB total log file size equals 25% of buffer pool size.
    innodb_log_buffer_size (> 16M)

Conclusão

O MySQLTuner é uma boa ferramenta para avaliar possibilidades de melhoria no seu setup de banco de dados. O tutorial descreve uma forma de criar um container funcional para o MySQLTuner, e os passos para configurar sua conexão ao banco de dados.

Qualquer dúvida ou sugestão, basta informar nos comentários!