Open3

private-isuをdockerでセットアップした時のメモ

eichisandeneichisanden

前提

  • ポート番号80と3306をexposeします

セットアップ

  1. ポジトリをクローンする
git clone https://github.com/catatsuy/private-isu.git
cd private-isu
  1. 大量テストデータ生成するsqlファイル(1.2Gある)をダウンロード

docker-compose.ymlの中で、webapp/sqlフォルダをmysqlのコンテナの/docker-entrypoint-initdb.dにマウントしているので、sqlを置いておけばコンテナ起動時に実行される

cd webapp/sql
curl -L -O https://github.com/catatsuy/private-isu/releases/download/img/dump.sql.bz2
bunzip2 dump.sql.bz2
  1. アプリをruby以外の実装にしたい場合はこのタイミングで変更しておく。ここではphpに変更する。
cd ..
sed -i -e 's/build: ruby/build: php/' docker-compose.yml
# for Mac
sed -i "" -e 's/build: ruby/build: php/' docker-compose.yml

appの書き換わっていること

% git diff
diff --git a/webapp/docker-compose.yml b/webapp/docker-compose.yml
index aa026f8..96c23fc 100644
--- a/webapp/docker-compose.yml
+++ b/webapp/docker-compose.yml
@@ -11,7 +11,7 @@ services:

   app:
     # Go実装の場合は golang/ PHP実装の場合は php/
-    build: ruby/
+    build: php/
     environment:
       ISUCONP_DB_HOST: mysql
       ISUCONP_DB_PORT: 3306
  • nginxの設定ファイルをphp用に用意されているものに差し替える
mv etc/nginx/conf.d/default.conf etc/nginx/conf.d/default.conf.org
mv etc/nginx/conf.d/php.conf.org etc/nginx/conf.d/php.conf
  1. docker composeで起動する
docker compose up -d
  1. アプリを変更したらappのイメージを作り直してコンテナを再作成する
docker compose stop app && docker compose rm -f app && docker compose build app && docker compose up app -d
  1. appコンテナでtopコマンドなどを使いたい場合はコンテナに入ってapt install procpsを実行する

ps, top, vmstat, sysctl, w, kill, skill, nice, snice, pgrep, free, tload, uptime, watchがリリースされます

benchmarkerのセットアップ

  • benchmark実行で使用する画像をダウンロードする
cd ../benchmarker/userdata
curl -L -O https://github.com/catatsuy/private-isu/releases/download/img/img.zip
unzip img.zip
rm img.zip
cd ..
  • benchmarkerのdockerイメージをビルド
    ローカルでも実行できるけど、Goのセットアップが不要なのでコンテナを使うと便利
docker build -t private-isu-benchmarker .
  • benchmarker実行の実行方法
docker run --rm --network host -i private-isu-benchmarker /opt/go/bin/benchmarker -t http://localhost -u ./userdata

ツールのセットアップ

  • alpのインストール
# for Mac
brew install alp

他の環境へのインストール方法は公式を見てください。
https://github.com/tkuchiki/alp/blob/main/README.ja.md

  • pt-query-digestをインストール
# mysqlコンテナにインストールする場合
apt update && apt install percona-toolkit
# for Mac
brew install percona-toolkit
eichisandeneichisanden

コマンド チートシート

  • コンテナのログを流しっぱなしにする(mysqlに絞りたい場合はdocker compose logs mysql -f)
docker compose logs -f
  • コンテナの中に入る
docker compose exec -it nginx bash
docker compose exec -it app bash
docker compose exec -it mysql bash

mysqlの操作

  • mysqlコマンド起動
docker compose exec -it mysql mysql -uroot -proot isuconp

以下、mysqlコマンドの操作

  • データベース一覧表示
show databases;
  • データベース切り替え
use isuconp;
  • テーブル一覧表示
show tables;
  • テーブル定義表示
show create table users;
show create table posts;
show create table comments;
  • プロセスリストを取得
show processlist;
  • 設定一覧を取得
SHOW VARIABLES;
  • SQLファイルを実行
cat sql/dump.sql|docker compose exec -T mysql mysql -uroot -proot
  • alpでアクセスログ確認
cat logs/nginx/access.log|alp json

同類のアクセスを集約して見たい場合は、-m "/image/.+,/posts/[0-9]+,/@.+"の用にオプションを付与する

  • pt-query-digest実行
pt-query-digest logs/mysql/mysqlslow.log
  • コンテナのCPUやメモリ使用率などを確認する
docker stats

出力

CONTAINER ID   NAME                 CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O         PIDS
11c9ba37fc91   webapp-nginx-1       0.00%     4.629MiB / 7.752GiB   0.06%     1.05kB / 0B       1.28MB / 0B       5
81854fd3a751   webapp-app-1         0.01%     37.74MiB / 1GiB       3.69%     1.02MB / 5.5kB    51MB / 2.85MB     4
b66277ea328a   webapp-memcached-1   0.01%     3.777MiB / 7.752GiB   0.05%     1.38kB / 0B       975kB / 0B        10
2f95540c4d2f   webapp-mysql-1       1.17%     397.1MiB / 1GiB       38.78%    1.49kB / 0B       44.9MB / 15.4MB   38