ほんのちょっとだけdockerわかった気になった

週末にこれ

qiita.com

を書いていて、ほんのちょっとだけdockerをわかった気になったので思ったことをつらつら書いていく。

元としてはCoreOS上でdroneをビルドしていて、"gitとdockerさえあれば何でもできるな"。と思ったのがポイント。droneのビルドのためにgolangが入った環境が必要だから、イメージに対してソースを渡してその中でビルド実施。アウトプットされたバイナリファイルを実行する環境が必要となったら今度は実行用の超軽量イメージにファイルを渡して実行。と言った形で、コンテナそのものはほぼ単一の目的に対してのみ提供される。モノリシック→マイクロサービスの流れとかcatしてgrepしてcutするunix哲学に似ているのかなぁと思った。

dockerを使ってシステムを組む時のメリットは、アプリケーションが載った環境を名前空間によって簡単に分割できる点だと理解している。それって要はマイクロサービスじゃん。単体でデプロイ&動作できるし、コンテナ同士の連鎖や掛け算によって大きなシステムを構築することもできる。的な。

もう少し具体的なイメージに落とすと、もしかしてdockerが出てきた背景は"疎結合,高凝集"みたいなオブジェクト指向の概念をインフラ世界に持って行きたかったのかも。アプリケーションは疎結合にすることはできた。一方でアプリケーションは動作するOS含めたインフラに依存するが、インフラを疎結合にすることはできない。例えば、同一ホスト内で複数アプリケーションが動いていたとして、片方は最新のlinuxカーネルに対応しているがもう片方はそうでない場合、インフラ起因でアプリケーションのアップデートができなくなる。結果技術的負債が貯まる。ドメインモデルの成長(つまり事業の成長)を阻害する原因になる。それをdockerという形でアプリケーションが依存するインフラはdockerコンテナ内に押し込め、つまり"カプセル化し"、結果疎結合になる。要するに境界づけられたコンテキストがdockerの名前空間よってインフラレベルで線引きができるようになる。やったぜ!的な。ぶっちゃけVMでも同じことできるはできるけど、VMだと抽象化レイヤーが少し低くて、VM同士を関連付けて動かしてとか結構面倒。dockerはライトにやれるのがとにかくでかい。

クラウドによってコンピューターリソースを抽象化して自由に伸縮させられる、dockerでアプリケーションを完全に隔離された環境を構築できる。かつそれらをWeb APIによって簡易にできる。極めて低いレイヤーをプログラマブルに扱える。結果サーバリソースが最適化され、コンピューティングに対するエネルギー効率が良くなる。地球にやさしい!!

と、ここまで書いていて気づいたが、
dockerってPaaSやってるdocCloud社が仮想環境をライトにポコポコ建てるために作ったものだったから、疎結合云々は私の拡大解釈でしかないのかも。ただ、そんなに大きくずれた事は言っていないんじゃないかな。

お酒飲んだ後だから全くまとまった文章じゃないんだけど、そんなかんじ。

明日朝早く出社できるように頑張ります。