Hatena::ブログ(Diary)

技術野郎の復習 このページをアンテナに追加 RSSフィード Twitter

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で話がありました

ここで提案されているワークアラウンドはこうです。

  1. nsenterで該当コンテナのネームスペースには入れ
  2. /procrwでリマウントしろ
  3. kernel.shmmaxを変更しろ
  4. /procroでリマウントしろ

このnsenterというのはLXCのユーザランドツールのlxc-attachと同じような代物で、ホスト側からコンテナのネームスペースに入ってコマンドを実行できるというものです。コンテナ内からカーネルパラメータを変更できるというのはあまり好ましくないということなんでしょうね。

ただ、このやり方になると、docker run一発でDBは起動せず、ホスト側からnsenterするっていう一手間が必要になってしまうのが残念なところです。でも、このあたりは今後改善されていくような気がしますが。

余談

このnsenterなどは、ホスト側でcronを回して各コンテナでなにか実行したいときに使えそうですね。コンテナ内に余計なプロセスを入れないで済みます。このへんの話書くだけでもPV稼げるんじゃないでしょうか。

参考

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/toromoti/20140622/1403457110