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!

Vinicius Paes
Visão Geral sobre Privacidade (Privacy Overview)

Este site utuliza "cookies" para que possamos oferecer uma melhor experiência de usuário. As informações dos "cookies" são armazenadas em seu navegador e executam funções como reconhecê-lo quando você retorna ao nosso site e ajudar nossa equipe a entender quais seções do site você considera mais interessantes e úteis.