Dockerの台頭とメリット・デメリット

2 min read読了の目安(約2400字

コンテナ技術の台頭

最初に何故、コンテナ技術(特にDocker)に注目が集まり、広く使われているのか解説していきます。使われるようになった背景を知ることで周辺知識,流れを知ることができるので先に解説していきます。

コンテナ(Docker)の方が従来の仮想化技術よりも優れている

全てが優れているというわけではありませんがコンテナ技術、特にDockerの方が従来の仮想化技術よりも優れているので、広く使われています。では、「従来の仮想化技術」とはどのようなものがあるのでしょうか?

従来の仮想化技術について

主に二種類あります。

  • ホスト型仮想化
  • ハイパーバイザー型仮想化

それぞれ軽く解説していきます。

【ホスト型仮想化】

ホストOSの上で仮想化ソフトウェアが起動する形のことです。仮想化ソフトウェアがサーバーハードウェアの役名を担うことで、その上でアプリケーション,ミドルウェア,ゲストOSの実行を実現してくれています。仮想化ソフトウェアをインストールするだけで、仮想環境が構築できるので手軽です。しかし、ゲストOSを動かすために、ホストOSでの処理も必要になってくるため、処理に時間がかかってしまうデメリットがあります。

代表的な仮想化ソフトウェアにOracle VM VirtualBoxVMware Workstation Playerなどがあります。

【ハイパーバイザー型仮想化】

ハードウェアの上で「ハイパーバイザー」という仮想化技術を実現する制御プログラムを動かす形のことです。ハードウェアを直接制御するため、ホストOSを直接的に必要とするわけではないのでゲストOSの動作速度が「ホスト型仮想化」に比べて高速です。とはいえ、複数のゲストOSがサーバの資源を使うため、オーバーヘッドが起きたり、ゲストOSから起動させるために時間がかかるというデメリットがあります。

ハイパーバイザ型の仮想化ソフトウェアの代表例にXenServerHyper-Vがあります。

従来の仮想化技術のデメリット

ホスト型もハイパーバイザー型も下記のようなデメリットがあります。

  • 起動に時間がかかる
  • ゲストOSを起動するためにオーバーヘッドが多い

これらのデメリットをカバーするためにコンテナ型仮想化技術、特にDockerが台頭してきました。いよいよコンテナ型仮想化技術の仕組みやメリットについて解説していきます。

【参考】

コンテナ型仮想化技術の仕組み

コンテナ型仮想化技術は、ホストOS上に論理的な区画を作ります。 この論理的な区画のことをコンテナと呼ばれています。コンテナはミドルウェア,アプリケーションだけを格納しています。従来の仮想化技術との違いはゲストOSを持たず、コンテナレベルでホストOSのリソースを共有するということです。

Dockerの場合はDocker Engineというクライアント・サーバ型アプリケーションを利用することでこの仕組みを実現しています。

Docker Engineとは?

Docker Engineは下記の三つの構成要素から成り立ちます。

  • CLIクライアント
  • Dockerデーモン
  • Docker REST API

クライアント側からCLIコマンド(または、Docker REST API のスクリプト)を使うことでDockerデーモンを操作、制御を行うことができます。DockerデーモンはDockerオブジェクト(イメージ,コンテナ,ネットワーク,データ,ボリュームなど)を作成・管理しています。

【参考】

コンテナ型仮想化技術のメリット

コンテナ型仮想化技術のメリットはたくさんあります。例えば...

  • 環境構築が容易
  • デプロイ・ロールバックが容易
  • 環境を手軽に配布することが可能
  • ゲストOSを持たないので、起動が高速
  • オーバヘッドが従来の仮想化技術と比べて少ない

などなど。従来の仮想化と比べて、ゲストOSを起動する必要がないので起動が高速なのも良いのですが、筆者が一番嬉しいと感じる点は「デプロイ・ロールバックが容易」ということです。特にロールバックに関しては、コードデプロイと違って動作環境自体を保持しているので、安全に行えるというメリットは大きいかと思います。

また、「環境構築が容易」や「環境を手軽に配布可能」などのメリットから開発時のインパクトも大きいと思います。

とはいえ、コンテナにもデメリットはある

例えば、コンテナごとのOSを保持しているわけではないのでホストOSと異なるOSを使用することはできません。筆者はこれによる不便さを感じたことはまだありませんが、どこかで不便になる場面があるかもしれません。