Magnolia Tech

いつもコードのことばかり考えている人のために。

ISUCON12予選問題をdocker-composeで起動する

説明のために手順を確認したので、その覚書。

作業環境にリポジトリを用意する

github.com

$ git clone git@github.com:isucon/isucon12-qualify.git

Dockerをインストールする

www.docker.com

値上げが最近話題になりましたが、個人利用は無料です。

www.docker.com

次回はRancher Desktopを試してみます。

rancherdesktop.io

docker-compose.ymlを書き換える

一箇所だけ書き換えないと、起動しません。

Docker Hubから「mysql/mysql-server:8.0.29」のイメージが無くなっていて、MySQLが起動できません。8.0.30以降のバージョンを指定しましょう(無くなった理由は探せませんでした...)。

2022/11/06追記

mysql-serverのバージョンを上げるPRを作って、それが取り込まれたので、これからクローンした場合は、上記の修正は不要となっています。

github.com

また、Go言語以外の言語で動かす場合は、webappのサービスに指定されているbuildのパスを言語に合わせて書き換えます。

コンテナを起動します。

$ docker-compose up

initial_dataを展開する

初期データを展開します。

benchのコンテナにrootでログインします。

$ docker exec -u 0 -it isucon12-qualify-bench-1 bash

isuconディレクトリへ移動して、initial_data.tar.gzをダウンロードします。

$ cd /home/isucon
$ curl -LO https://github.com/isucon/isucon12-qualify/releases/download/data%2F20220712_1505-745a3fdfb5783afc048ecaebd054acd20151872d/initial_data.tar.gz
$ tar xvf initial_data.tar.gz

docker-compose.ymlのvolumesセクションで用意したストレージの権限がrootになっていて、このままだとアプリの実行時に権限エラーになるので、まとめて書き換えておきます。

$ chown -R isucon:isucon /home/isucon

一回抜けて、isuconユーザーで再ログインする。

$ docker exec -it isucon12-qualify-bench-1 bash

最後に、初期データを準備する。

$ cd /home/isucon/data
$ make build-for-docker-compose

これで準備完了。

最初のベンチマークを取得する

$ cd bench
$ ./bench

初期スコアを確認して、あとはチューニングを始めましょう。

チューニングの準備

当日のマニュアルは熟読しましょう。

ISUCON12 予選当日マニュアル · GitHub

そもそもアプリケーションの仕様が分からないと何もできないので、じっくり読みましょう。

github.com

webapp以下のディレクトリは、ビルドのたびにホストマシンのリポジトリの内容がコンテナ内のストレージにコピーされてからビルドが開始されます。 なので、アプリケーションコードの修正は、慣れた手元の環境でやると良いでしょう。

ISUCON本を用意する

用意ができたらISUCON本を見ながら、チューニングを始めましょう。

その他

  • Docker Desktop for Macではnetwork_modehost指定すると、本当のホストマシンであるmacから見えなくなってしまいます。せっかく作り込まれたフロントエンドの画面が見れないのはちょっと寂しいので、別の手段で環境を構築してみましょう。ネットワーク構成を作り直しても良いでしょう。
  • docker-compose.ymlや、Dockerfileの読み方は最低限理解しておくと良いでしょう。アプリケーションの切り替えや、再ビルドの方法がわからないとチューニングしても意味がないので。
  • 用意されている参照実装は一通り実行してみましょう。全部のソースを見るのは大変だけど、3種類くらい比較して見てみると面白いです。
  • useraddコマンドでグループ名を指定しない時の挙動が分からなかったので、調べたところ、/etc/default/useraddに書かれていました。そこなんだ?
# The default behavior (when -n and -g are not specified) is to create a
# primary user group with the same name as the user being added to the
# system.

2022/11/6 追記

MySQL 8.0.29の件、いくつか情報をいただきました。なるほどー酷いバグだ......

というわけで、PRを作成しておきました。

github.com

あと、Docker Desktop for Macのネットワークについても情報をいただきました。

docker-composeと、docker composeは違うとは......こちらも引き続き調べてみたいと思います。


現在では、docker-composeと、docker composeは同じV2を向いているようです。

qiita.com

Docker Desktop for Mac 4.13.1をクリーンインストールしたところ、docker-composeもV2を使う設定が最初からオンになっていました。