最近Dockerとか、serfとかその辺りのツールが流行ってる。その中でとりあえずDockerはテスト環境やCIでは使えるかもしれないけど、実際にwebサービスが動いているものに使えるかどうかはまだわかんないねーという流れになっていた。
まあでもとりあえず動いているwebサービスをDockerでやったらどうなるかというのを知りたいというのがあって、いろいろ機会があったので4人で3日くらいやってプロトタイプ実装というのをしてみて試した。
結局出来たこと
結局以下の様なものが実際に動くところまで行った。
- AWSのような環境がなくてもDockerさえ動けばブルーグリーンデプロイ出来る
- web n台くらいを一セットとみなした環境をボタンひとつで簡単に作れる
- Docker imageのビルドが終わっていれば10秒程度
- アプリケーションコードの変更のみを使って差分image buildしたかったら2分くらいで
- 全体docker buildし直しなら30分程度
- もちろんサーバのスペックにもよります
- docker imageのbuildはjenkinsが勝手にやってくれる
- 全buildし直し、アプリケーションコードの差分buildだけで分けてやってくれる
- 本番用docker imageそのものに対して、アプリケーションのテスト、インフラのテストを行う
- 本当にそのものに対して行った、テストが終わったコンテナは捨てる
- 実際にdocker containerをどこに立てるかはリソース制御しているところが勝手に決めてくれる
- docker container一つはweb 1台に相当します
- docker containerの状態や一つの環境の状態は中央にログが送られてグラフ化される
- アクセス数・アクセスのステータスコード比率・CPU使用率・メモリ使用量・etc
- ログ転送はfluentdなどで
- サーバのmetrics収集はsensuなどで
- グラフ化はgraphiteなどで行われた
今回はサンプルwebアプリをデプロイしまくっただけだったけど、概ね動いていて、とりあえずプロトタイプ実装としては成功したかなという感じだった。大体遊びでデプロイしまくってたらすぐに100デプロイくらい行った。
結局どうだったか
僕の感想としては以下の様なものだった。
- 社内用やテスト用途には普通に使えそう
- 本番のwebサービスではまだまだ使えない
例えば僕が感じた問題だけで以下の様な問題があった。
- Dockerがまだまだ安定していない
- commitすると前のimageが持っていたCMDやEXPOSEなどの情報が消える https://github.com/dotcloud/docker/issues/1141
- AUFSの層を42以上作れない https://github.com/dotcloud/docker/issues/1171
- DockerfileでRUNなどを42回以上使えない
- Dockerを動かしているサーバのkernel processが無駄に増えていた?
- dockerのimageをおいているストレージの容量がかなり大きくなる
- docker-registryにpingが通らなくなる時がある(loopで何回かやってるとつながる)
- アプリケーションレイヤーのテストを本番と同等の環境でやるのが難しい
- リソースの最適な配置を決めてくれるツールがまだ安定していない
- marathon, mesos, mesos-dockerなど
- 普通にうまく動かない時があり、コードを読んでドキュメントを作ったり、軽いパッチを当ててなんとか動いたという感じ
まとめ
まあこういうことをやってみましたという感じです。今回はとりあえずやったことと問題のリストアップだけしましたが、もうちょっと詳しく書いて欲しい要望があればなんか書きます。
詳しいエントリ書きました Docker, Mesos, Sensu等を利用したBlue-Green Deploymentの仕組み - $shibayu36->blog;