開発環境にDockerを採用した時に大変だったこと

ローカル開発環境としてDockerを採用してみました。
導入までの間で、いくつか大きなハードルがあったのでまとめておきます。

環境

AppVersion
boot2docker1.3.1
VirtualBox4.3.18

達成しなくてはいけない前提条件

  • OSXとWindows両方でほぼ同等の環境を用意すること
  • 手元のソースコードを転送したりせず、そのままビルドできること
  • MySQLのデータだけは永続化させること
  • SSH接続してログを確認するという従来の方法を維持させること

実際に大変だったこと

1) VirtualBoxの共有フォルダにsymlink作れない問題

OSXでは解消したもののWindowsで同じ事が起きてしまい、調査しても解決できなかったため別の方法をとることにしました。主に何が問題だったかというと、npm installがコケて異常終了するという状況でした。

解決方法

仕方が無いのでnpmだけはWin環境で実施するという策に変更して、何とかビルド環境はクリアしました。ただ、、かなり無理矢理なので、今後の大きな課題です。

2) マウントする際のパーミッション指定

ただのデータ共有用で利用するだけならパーミッションはそれほど問題にならないんですが、MySQLのデータフォルダとなると話は別で、mysqlユーザーじゃないとサービスとして起動させるのが大変なんですね。コンフィグ調整すりゃいいんですが、本番環境との差違が生まれるのもなるべく避けたいので、何としてでもクリアしたい点でした。

解決方法

マウント時にパーミッション指定する方法を発見して何とか解決。

3) /var/lib/mysqlをマウントすると手順が増える問題

永続化する場合、MySQLのデータフォルダをホストからマウントさせる必要が出てきますが、マウントすると、初回はゲスト側のデータフォルダが空の状態になるためmysql_install_dbを実施させたりする必要があり、MySQLインストール直後の状態を作り上げるための手順が増えてしまいます。

解決方法

これをやるのは初回だけなので、ミスが起きないよう細かい手順書を用意しました。

良かったところ

  • 作業のやり直しが一瞬でできる
  • ゲスト自体のレスポンスはとても良い
  • インフラがコードとして管理できる(シンプルで直感的)

大体事前に分かってたことしか無かったので少ない印象ですが、インフラエンジニアから見ると、この三つはかなり大きなメリットに感じます。
特に、作業のやり直しが一瞬というのは一番のメリットで、

  • ミドルウェアの依存関係でトラブってApache動かなくなった
  • 大事なコンフィグ消しちゃった
  • このコマンドの影響範囲広すぎて戻したい・・・

とか、作業前に戻してしまえば良いのです。

「VMで十分じゃん」なんて声が聞こえてきそうですが、KVMやXenだとゲストのダンプに時間かかるし容量も食うという問題があります。しかし、dockerはコミットしないだけでOKなんです!
まさにコード管理。gitと同じ感覚で作業ができるというこの生産性の高さ!最高!

微妙だったところ

  • マウントしたフォルダのディスクI/Oパフォーマンスが悪いためビルドが遅すぎる
  • 学習コストが高いため、利用者が微調整しにくい
  • 柔軟性に難あり(通常できることが難しかったりする)

まとめ

Windows環境でホスト側(Win内)でミドルウェア入れないとどうしようもないケースがあったのがちょっと痛かったのと、手元のソースコードを転送無しでそのまま利用したいという要件をクリアするのがdockerには向いていなかった気がします。

基本、次の二択だと思うんですが、

  • scpなどで転送
  • マウントしちゃう

永続化しないでscpしたら毎回全ファイル転送になって「生産性あげる気ある?」って言われそうだったのでパフォーマンスを犠牲にしてマウントしちゃいました。

pushしてからgit cloneしてくるとか、工程増えすぎて本末転倒だしなぁ。。
他にもこんな方法あるよ!って方いたら是非教えて下さい!