DockerでMySQLを自動起動する
Dockerはデーモン関係の取り扱いが弱いというか、一癖あるというか、ハマる人が多いような気がしている。
なぜそんな気がしているかというと、調べても情報が少ないっ!
なぜ調べていたかというと、自分がはまっていたから。
環境
環境はUbuntu 12.04。
Ubuntu系ならだいたい似たような感じと想定。
CentOSはわからない。
Docker上でMySQLを動作させる注意点
いくつか注意点があるので順番に紹介していく。
- Upstartが動作しない。
- 自動起動の方法がわからない。
- 初期化処理が実行されない。
これだけ抑えればちょっと変わったプロセスでもSupervisorを使った自動起動ができるようになると思う。
Upstartが動作しない
まず、インストール時に躓く可能性がある。
DockerはUpstartの処理を変えているらしくそのままだと動作しないらしい。
詳細は下記あたりを参考にどうぞ。
▶Container cannot connect to Upstart · Issue #1024 · dotcloud/docker
https://github.com/dotcloud/docker/issues/1024
上記ページにも書いてあるけど、initctlを書き換えて上げる必要があるらしい。
dpkg-divert --local --rename --add /sbin/initctl ln -s /bin/true /sbin/initctl
MySQLの場合はインストール時にエラーが発生して、正常終了しなかった。
まずは上記コマンドを実行しておいて、MySQLのインストールが正常に終了するようにしてあげる。
自動起動の方法がわからない
前項のコマンドでUpstartが正常に動作するようになるかというと、そうでもないらしい。
MySQLの動作については動いているのか動いていないのかよくわからない状態だった。
どちらにせよ、Supervisorを使おうと思っていたのでUpstartによる自動起動は停止しておいた。
Supervisorについての説明は省略するが、「daemontoolsのようなもの」で通じる人には通じると思う。
フォアグラウンドで動作するような何の変哲もないプログラムなら簡単にSupervisorの管理下におけるのだが、MySQLの場合はmysqld_safeで起動を行い、プロセスとMySQLが直結しないのでpidproxyなるツールを用いてこれをなんとかする。
詳細は下記ページを参考にどうぞ。
▶Subprocesses — supervisor 3.1a1-dev documentation
http://supervisord.org/subprocess.html#pidproxy-program
command=/path/to/pidproxy /path/to/pidfile /path/to/mysqld_safe
「こう書く」ってまんま載ってる。
これで無事にMySQLが動作するかというと、まだ動作しない。
Supervisorからの起動は正常にされているっぽいんだけど、MySQLの起動で失敗しているっぽい。
初期化処理が実行されない
Supervisor経由だとMySQLが正常に起動しないのはなぜかというと、そんなことはない。
問題なく起動する。
正常に起動しないのは単にMySQLの初期化が済んでいないためである。
/var/lib/mysqlディレクトリの中が空っぽだったら初期化されていないと判断できるので、確認することをおすすめしておく。
これだけのことなのでMySQLの初期化を行う。
/usr/bin/mysql_install_db
初期化を行うと言っても、このコマンドを実行するだけ。
本来ならUpstartがMySQLを実行するときに初回に実行してくれていたと思うんだけど、Upstartを使わないがために初期化処理もされていなかったのだ。
まとめ
- Dockerで自動起動するときはUpstartではなくSupervisorを使う。
- Upstartは使わないけど、パッケージインストール時にこけることがあるのでinitctlの初期設定はしておく。
- Upstartの起動スクリプトは使わないことになるので、初期化処理がされているかは確認しておく。
- プロセスと直結しない起動の場合にはSupervisorと一緒にインストールされるpidproxyを使う。
おまけのDockerfile
具体的なDockerfileが気になる方は下記をどうぞ。
▶teaplanet/wordpress-docker
https://github.com/teaplanet/wordpress-docker