2014-06-22 (Sun)
Docker 1.0 でDBを動かすときの共有メモリの設定
長らくブログ書いてなかったので、どうでもいい話をちょっと書こう。
Blue-Greenでチヤホヤされる運命のDockerで、DBを動かすという需要はあんまりないとは思いますが、コンテナでDBを動かすというのもそれはまた一興です。
DBを動かすとなると共有メモリをたくさん使うことになるかと思います。そういう共有メモリの設定に関して、バージョン1.0が出てからいままでのやり方が通用しなくなったので、それについて書きます。
これまで
これまで、僕はDockerでPostgreSQLコンテナを動かすとき、まずコンテナ内で起動スクリプト的なシェルを実行するようにしていました。そのなかで、以下のようにカーネルパラメータshmmax
の値を大きくしていました。
sysctl -w kernel.shmmax=4418740224
なぜならコンテナ内のshmmax
の値がなぜか小さく設定されているために、素の状態だとPostgreSQLが起動しないからです。
1.0だと
しかし、1.0にアップデートしたらこれができなくなりました。具体的には起動スクリプト的シェルの該当の箇所でエラーが出ます。
error: "Read-only file system" setting key "kernel.shmmax"
この件についてはdocker-devで話がありました。
ここで提案されているワークアラウンドはこうです。
-
nsenter
で該当コンテナのネームスペースには入れ -
/proc
をrw
でリマウントしろ -
kernel.shmmax
を変更しろ -
/proc
をro
でリマウントしろ
このnsenter
というのはLXCのユーザランドツールのlxc-attach
と同じような代物で、ホスト側からコンテナのネームスペースに入ってコマンドを実行できるというものです。コンテナ内からカーネルパラメータを変更できるというのはあまり好ましくないということなんでしょうね。
ただ、このやり方になると、docker run
一発でDBは起動せず、ホスト側からnsenter
するっていう一手間が必要になってしまうのが残念なところです。でも、このあたりは今後改善されていくような気がしますが。
余談
このnsenter
などは、ホスト側でcronを回して各コンテナでなにか実行したいときに使えそうですね。コンテナ内に余計なプロセスを入れないで済みます。このへんの話書くだけでもPV稼げるんじゃないでしょうか。