Virtualbox
もVagrant
も廃れて結局残ったのがDocker
というのが現在(2021-06-16)のステータスです。しかし仮想環境というのが流行りだした経緯はつまるところオンプレのシステムというものが高価であり柔軟性がなく構築がやたらと煩雑という背景があったわけで、いきなり仮想環境が生まれたわけではありません。オンプレはテスト環境や開発環境をひとつ構築するのにもどえらいお金と時間がかかるという代物であり、これはイケてない!と思い立った有志たちが開発に挑んだのが仮想環境です。この仮想環境は自分のPC内にオンプレのサーバー環境とほぼ同等の開発環境を構築することができるという無料ソフトであり、かつ構築が容易であり設定がやたらと柔軟というすぐれものでした。これは一種の発明だったわけです。
そのような時代を経て生き残ったのがDockerです。しかし事実このDockerは「仮想」という姿から実態へと認識が変化して今はもうアプリケーションの実態になりました。つまり、Dockerをまるごとプロダクト環境にデプロイするということによってこれまで問題になってきた環境依存を克服し環境をまるごとデプロイするというシステムにまで発展しました。アプリケーションをOSごと開発するので、環境依存がない、ローカル環境と全く同じ状態でデプロイできる、アプリケーションを最小単位で開発できるなどメリットがたくさんあります。とはいえ、勿論よいことだけではありません。実際にやってみると(これまで書いてきたこととは反対に)複雑奇っ怪で何やら怪しげな設定が多数あり、特にネットワーク関連の設定はほんとにようわからんといった次第です。マウントストレージもやたらと細かく設定できるので設定を突き詰めると何やら複雑でグロテスクなストーレージ構成になっていたりします。
さて、そういう中でDockerの醍醐味はいったい何かというと、1.カーネル共有による軽量化、2.更新ディレクトリの局所化、3.アプリケーションの細分化の3つになります。そしてこの3つがそのままDockerの最も醜悪な部分と言うこともできます。
正直、このお話は開発者にとって無意味です。読み飛ばしてもらって大丈夫です。セックスとはいったい何かと哲学的に考える前に子供を産んだ方が吉です。ですが、それでも興味があるという場合はこの賞を読む意味がいくらかあります。
ご存知の通り、コンピューターの中身のほとんどを占めるのがカーネルといわれる頭脳です。つまり計算機のコア部分です。コンピューターはこのカーネルによって成り立っており、カーネル=コンピューターと言っても過言ではありません。このカーネルの開発は膨大な手間ひまと年月と、更にその繊細さを必要とします。みなさんの知っているGitもこのカーネル開発管理のために作成されたものです。
仮想環境がPCの中に別のOS環境を作成するということはすなわちカーネルをその個数分インストールすることです。しかしDockerはこのカーネルを一つのカーネルで賄おうとしました。Virtualbox
もVagrant
に比べて抜群に軽量なのはこのためです。一台のPCにWindowsとMacOSをインストールするみたいなことをやっている方もおられますが、あれもOSの重さに結構やられます。そういう意味でカーネルを共有すると独立して管理しなければならないものはもはやメモリとストレージのみみたいな話になるわけです。