こんにちは。よっしーです(^^)
今日は、DockerでMySQLの開発環境を構築する方法についてご紹介します。
背景
MySQLの開発環境をDockerで構築する機会があったので、そのときの内容を備忘として残しています。
この記事のベースとなっている環境については、下記の記事を御覧ください。
MySQLTunerとは
MySQLTunerは、Perlで書かれたスクリプトで、MySQL (MariaDB) のパフォーマンスと安定性を高めるためのチューニングについてのポイントを表示してくれます。
MySQLTunerを使用すると、以下のことができます:
- MySQL (MariaDB) の設定を最適化するための推奨事項を提供します。
- パフォーマンスの向上や安定性の確保に役立つアドバイスを表示します。
- MySQLTunerはさまざまな項目についての推奨事項を表示します。例えば:
- ストレージエンジンの統計
- セキュリティの推奨事項
- パフォーマンス指標
- MyISAM指標
- InnoDB指標
- AriaDB指標
- レプリケーション指標
- 推奨事項に基づいて、MariaDBの設定ファイルを変更することで、パフォーマンスを向上させることができます。例えば、スロークエリをログに出力したり、各種変数を調整したりすることができます。
MySQLTunerは、データベースの健康診断やチューニングに役立つツールであり、MariaDBの運用を改善するために活用できます。
ファイル一覧
下記のファイルを作成、修正します。ファイルの内容は次のセクションに記載しています。
modified: Makefile
modified: compose.yml
new file: mysql_tuner/Dockerfile
mysql_tuner/Dockerfile
FROM ubuntu:18.04
RUN apt-get update \
&& apt-get install -yq --no-install-recommends \
apt-utils \
curl \
wget \
perl \
perl-doc \
mysql-client \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Installing MySQL Tuner
RUN set -eux \
&& echo "Downloading MySQL Tuner script ..." \
&& wget --no-check-certificate https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl -O /mysqltuner.pl \
&& wget --no-check-certificate https://raw.githubusercontent.com/major/MySQLTuner-perl/master/basic_passwords.txt -O /basic_passwords.txt \
&& wget --no-check-certificate https://raw.githubusercontent.com/major/MySQLTuner-perl/master/vulnerabilities.csv -O /vulnerabilities.csv
ENTRYPOINT ["sh", "-c", "perl mysqltuner.pl --host ${MYSQL_HOST} --user ${MYSQL_USER} --pass ${MYSQL_PASS}"]
このDockerfileは、Ubuntu 18.04のベースイメージを使用しています。以下にコードの詳細を解説します。
RUN apt-get update ...
: この行は、Ubuntuパッケージマネージャーを使用してパッケージリストを更新しています。apt-get update
は、新しいパッケージの利用可能性を確認し、システムを最新の状態に保ちます。RUN apt-get install -yq ...
: この行は、必要なパッケージをインストールしています。具体的には、apt-utils
、curl
、wget
、perl
、perl-doc
、およびmysql-client
がインストールされます。-yq
オプションは、対話型のプロンプトを無効にし、静かなモードで実行することを意味します。RUN apt-get clean ...
: この行は、インストール時に生成されたキャッシュや一時ファイルをクリーンアップしてディスクスペースを解放します。RUN rm -rf /var/lib/apt/lists/*
: この行は、apt-get update
で生成されたパッケージリストのキャッシュを削除して、ディスクスペースをさらに解放します。RUN set -eux ...
: この行は、シェルスクリプトのエラーハンドリングを設定しています。-e
オプションは、エラーが発生した場合にスクリプトを終了することを意味し、-u
オプションは未定義の変数を使用した場合にエラーを出すことを意味します。- MySQL Tunerのインストール:
wget
コマンドを使用して、MySQL Tunerスクリプトと関連ファイルをダウンロードしています。--no-check-certificate
オプションは、SSL証明書のチェックを無効にしています。- ダウンロードされたファイルはそれぞれ
/mysqltuner.pl
、/basic_passwords.txt
、および/vulnerabilities.csv
に保存されます。
ENTRYPOINT ["sh", "-c", "perl mysqltuner.pl ..."]
: この行は、コンテナが起動されたときに実行されるコマンドを指定しています。具体的には、perl mysqltuner.pl
スクリプトを実行して、MySQL Tunerを起動しています。--host
、--user
、および--pass
オプションは、MySQLホスト、ユーザー、およびパスワードを指定します。
MySQL Tunerは、MySQLおよびMariaDBのパフォーマンスチューニングに役立つツールであり、診断結果に基づいて設定の改善を提案します。
compose.yml
緑のセンテンスを追加します。
+ mysql_tuner:
+ build: ./mysql_tuner
+ container_name: mysql_tuner
+ environment:
+ MYSQL_HOST: mysql_server
+ MYSQL_USER: root
+ MYSQL_PASS: P@ssw0rd
+ networks:
+ - net
+ profiles:
+ - tools
このコードはDocker Composeの設定ファイルで、MySQL TunerをDockerコンテナとして実行するためのものです。以下にコードの詳細を解説します。
mysql_tuner:
: これはサービスの名前です。Docker Composeでは、各サービスは名前で識別されます。build: ./mysql_tuner
: この行は、カレントディレクトリ内の./mysql_tuner
ディレクトリからイメージをビルドすることを指定しています。Dockerfile
が存在するディレクトリを指定することで、Dockerイメージをビルドします。container_name: mysql_tuner
: この行は、コンテナの名前を指定しています。この場合、コンテナの名前はmysql_tuner
です。environment:
: このセクションは、環境変数を設定しています。MySQL Tunerコンテナが実行される際に、以下の環境変数が使用されます:MYSQL_HOST
: MySQLサーバーのホスト名またはIPアドレス(ここではmysql_server
として指定されています)。MYSQL_USER
: MySQLのユーザー名(ここではroot
として指定されています)。MYSQL_PASS
: MySQLのパスワード(ここではP@ssw0rd
として指定されています)。
networks:
: このセクションは、コンテナが所属するネットワークを指定しています。- net
は、名前がnet
のネットワークにコンテナを接続することを意味します。profiles:
: このセクションは、Docker Composeのプロファイルを指定しています。プロファイルは、特定の環境や設定に対してサービスをグループ化するために使用されます。ここではtools
プロファイルにコンテナを追加しています。
簡潔に言えば、このDocker ComposeファイルはMySQL Tunerを実行するための設定を定義しており、MySQLサーバーへの接続情報とネットワークの設定を指定しています。
Makefile
+# mysql_tunerの実行
+.PHONY: run_mysql_tuner
+run_mysql_tuner:
+ cd $(WOKR_DIR) \
+ && docker compose --profile tools run -it mysql_tuner
このMakefileのセクションは、mysql_tunerコンテナを実行するためのターゲットを定義しています。以下に詳細を解説します。
# mysql_tunerの実行
: このコメントは、このターゲットがMySQL Tunerコンテナの実行に関連していることを示しています。.PHONY: run_mysql_tuner
:.PHONY
は、make
に対して仮想的なターゲットであることを伝えます。run_mysql_tuner
は、このターゲットの名前です。run_mysql_tuner:
: この行は、run_mysql_tuner
ターゲットの定義を開始しています。cd $(WOKR_DIR)
: この行は、指定されたディレクトリに移動することを意味します。$(WOKR_DIR)
は、環境変数として定義されているディレクトリパスです。&& docker compose --profile tools run -it mysql_tuner mysql_tuner
: この行は、Docker Composeを使用してMySQL Tunerコンテナを実行しています。--profile tools
は、tools
プロファイルを使用してコンテナを実行することを指定しています。-it
オプションは、対話型モードでコンテナを実行することを意味します。mysql_tuner
は、実行するコンテナの名前です。
このMakefileは、MySQL Tunerコンテナを起動するための便利な方法を提供しています 。
動作確認
下記のコマンドを実行します。
make build
make up
make run_mysql_tuner
下記のような結果が出力されていれば成功です。
-------- Recommendations ---------------------------------------------------------------------------
General recommendations:
11 CVE(s) found for your MySQL release. Consider upgrading your version !
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.
Reduce or eliminate unclosed connections and network issues
We will suggest raising the 'join_buffer_size' until JOINs not using indexes are found.
See https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_join_buffer_size
Be careful, increasing innodb_redo_log_capacity means higher crash recovery mean time
Variables to adjust:
*** MySQL's maximum memory usage is dangerously high ***
*** Add RAM before increasing MySQL buffer variables ***
join_buffer_size (> 256.0K, or always use indexes with JOINs)
innodb_redo_log_capacity should be (=32M) if possible, so InnoDB Redo log Capacity equals 25% of buffer pool size.
おわりに
今日は、DockerでMySQLの開発環境を構築する方法についてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント