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!