3.4.4 コンテナの歴史
Docker登場以降、急激にコンテナが流行しましたが、コンテナとは何かそのメリットを紹介します。コンテナは「入れ物」や「容器」といった意味で、一言で言うと「リソースが隔離されたプロセス」です。
1つのOS上で複数同時稼働可能で、それぞれ独立したルートファイルシステム、CPU/メモリ、プロセス空間等々を使うことができる点が、ハードウェアの仮想化である仮想マシン(VM)とは異なります(図3.22)。
コンテナのルーツをたどると、1970年代にBSD(Barkley Software Distribution)UNIXやTCP/IP、viなどの開発者として有名なBill Joyが開発したchrootがルーツと言われています。
1970年代はコンピュータは非常に高価で、本番環境と開発環境を用意するには高い費用が必要でしたが、1つのコンピュータで本番環境と開発環境を共存させると誤ってファイルを変更したり削除してしまったりするリスクがありました。
この課題を解決するために生まれたchrootは、OSのルートディレクトリ以下の特定の階層以下へのアクセスをプロセスに許可する機能で、現在でもさまざまな分野で応用され利用されています。たとえば、Linuxのレスキューモード、FTPでユーザーごとのアクセス範囲限定、PostfixやBINDなどでのアクセス可能なディレクトリの限定などに活用されています。
1990年代にFreeBSD jailが登場し、「あるディレクトリ配下をルートディレクトリに見せる」chrootの概念に加え、アプリケーションのプロセスも隔離できるようになりました。その後、Bill Joyの所属していたサン・マイクロシステムズは2000年代にはSolarisコンテナと呼ばれるコンテナ機能を提供していました(Oracle Solaris 11ではOracle Solarisゾーンと呼ばれています)。
3.4.5 Docker の登場
その後も商用UNIXやオープンソースでコンテナ技術の開発は地道に続けられていましたが、2013年にファイルシステムとプロセスを分離する機能に加えて、ファイルシステムイメージのパッケージングとバージョニングができ、コンテナイメージをシェアできるDockerが登場したことでコンテナは一躍脚光を浴びました(図3.23)。
2014年にGoogleは、Googleのすべてのサービス、そしてGoogleの社内で使われているツールもすべて、Docker登場以前からコンテナ型仮想化技術の上で実行されていると発表しています[※3]。
Docker社は改名する前はdotCloud社で、2008年に言語中立なPaaSを構築するために設立しました。dotCloudのPaaSは開発したアプリケーションをクラウドにデプロイすると実行できるというものでしたが、アプリケーション周辺のフレームワークやライブラリなどのバージョンの不一致などでローカルでは動作したプログラムがクラウドでは動作しないといった問題が多発したため、元々クラウド内部の仕組みとして開発していたアプリケーション実行環境を自動構築して「Dockerイメージ」に固める技術を、クラウド以外の環境でも利用できるようにオープンソースとして公開しました。
さらにDocker Hubと呼ばれるパブリックなレジストリで、誰でもDockerイメージをシェアできるようにしたため、爆発的な人気を得ました。仮想マシンと比較してDockerのメリットとしては、以下のような点があります。
- コンテナはホストOSとOSカーネルを共有するため、コンテナの起動や停止が速い
- ホストOSのカーネルを共有するため、VMだけを使う場合に比べて、1台のホストマシンではるかに多くのコンテナを実行でき、リソース集約率が高くなる
- DockerはライブラリやフレームワークなどをDockerイメージに固めて共有できるため、ある人の環境では再現するが自分の開発環境では再現しないといった問題が起きにくくなり、効率的なバグフィックスが可能になる
※3 https://www.publickey1.jp/blog/14/google20.html
3.4.6 クラウドと仮想化技術
ハイパーバイザーやコンテナなどの仮想化技術はGoogleやFacebook、Amazon.comなどの大規模Webサービスの裏側で利用され、AWS(Amazon Web Services)、GCP(Google Cloud Platform)、Azure(Microsoft Azure)などのクラウドサービスでは、仮想マシンサービス、コンテナサービス、Function as a Service(FaaS)[※4]などのサービスとして、またはそのほかのサービスを支える裏側の機能として利用されています(図3.24)。
※4 機能(Function)の実行環境がサービスとして提供されるもの。