Dockerが注目されている理由を探る
サーバ仮想化範囲から見る相違点
コンテナ型とホスト型については、ホストOSの上に仮想化アプリケーションをインストールしている。そのためホストOS上に特定のアプリケーションを稼働させることもできるが、その分リソースは消費されてしまうし、また管理も煩雑になるだろう。その点ハイパーバイザ型は、サーバ全体を仮想化するので管理がしやすいが、その反面柔軟さに欠けている側面を持つ。仮想化方式を選択する際には、それぞれの得意・不得意をしっかりと把握することが重要だ。
Dockerの特徴
Dockerの特徴や、ハイパーバイザ型の仮想化製品との差異とそれらに伴うメリット、デメリットを整理していきたい。Dockerの特徴は、「軽量」「携帯性」「揮発性」の3つのキーワードで表される。
軽量
前述のように、DockerコンテナはベースOSとカーネルを共有する。これにより、コンテナ自体が使用するメモリやハードディスクのリソース使用量が小さくなる。またデバイスへのI/Oが、ベースOSからエミュレートなしに直接行われるため、動作も高速になる。このように、リソース使用量だけではなく、実行自体のオーバーヘッドを少なくすることも実現している。
携帯性
「携帯性」とは、作成したDockerイメージやDockerfileをDockerが導入されている別のベースOSで実行できることを意味する。作成したDockerイメージを別環境に持ち出せることによって、開発チームからテストチームへの環境引き渡しがスムーズに行え、さらには環境依存による不具合発生のリスクも低減できる。
揮発性
「揮発性」とは、Dockerのイメージ自体は起動されても更新は保存されず、明示的に保存(コミット)をしなければコンテナ破棄時に変更分が消えてしまう仕様を意味する。Dockerではこの仕様を、AUFSというファイルシステムを利用して実現している。
AUFSは“Another Union File System”の略で、異なるファイルシステムのファイルを透過的に重ね、一つのファイルツリーを構成するものである。身近な例で言えば、OSのLive CDに利用されている。Live CDから起動し、変更を加えると起動している間は変更されているように見えるが、再起動すると変更は消えてしまう。
Dockerのメリット
Dockerのメリットとしてはまず導入が簡単であることがあげられるだろう。
Dockerのパッケージをダウンロードしてきてパスを通しても良いし、yumやapt-getなどを用いたパッケージインストールも可能である。特に難しい設定を加えなくとも利用を始められる。さらにコンテナイメージのリポジトリであるDockerHubが存在しており、Dockerfileの書き方がわからない初心者でもDockerHubからイメージをダウンロードしてきて実行するだけでDockerの世界を体験できる。DockerHubには個人が作成したものから企業が作成したものまで幅広いイメージがアップロードされており、カーネルを共有出来るのであれば、ほとんどのディストリビューションをDockerコンテナ上で利用してみることも出来る。この場合も、OSのインストールは不要だ。
次のメリットとしては、特徴にも書いたが軽量であること。そのためにDockerの検証や利用に新しいサーバを購入する必要はなく、手持ちのLinuxサーバ、またはLinuxデスクトップからでも利用が可能だ。もちろんVMにDockerを導入しても良い。
注意するべき点として、現状ではまだWindows上でDockerを利用出来ないことが挙げられる。これについては先日Microsoftから発表があり、次期Windows Server OSよりDockerを正式サポートするようだ。
Dockerコンテナは、ホストOS上のシステム領域に影響を及ぼさないというのも大きなメリットだろう。Dockerコンテナではカーネルは共有しているが、ユーザ領域は完全に分けられているので、Dockerコンテナ上で環境を変えたとしてもホストOS側には一切影響しない。
Dockerのデメリット
Dockerにももちろんデメリットはある。まず挙げられるのが、ポートフォワードの問題だ。ポートフォワードは、コンテナを外部公開するためにDockerが標準で用意している技術である。ポートフォワードは、その仕様としてポートを専有するため、複数のコンテナで同一ポートを利用して外部へ公開したい場合には、Docker標準の機能では実現が難しい。
またDockerコンテナが揮発性である点もデメリットの一つだ。これはメリットにもなっているのだが、DockerコンテナはAUFSを利用しているため、明示的に保存を行わければ更新が破棄されてしまう。特に、意図せずしてコンテナが削除された場合には、それまでに行った更新分は全て破棄されてしまうのだ。このデメリットを回避するためには、コミットの自動化や更新データの外部メディアへの退避といった対策が必要となる。
さらに、Dockerの管理が現状ではCLI上でのコマンド操作しか準備されていない点も挙げられる。Dockerの管理や操作は直感的ではなく、管理者や運用者はDockerについての知識が必要となる。知識が必要になるということは、属人性が高まることを意味する。この問題は、外部ツールを利用することで解決できるだろう。実際、稼働中のコンテナ一覧やコンテナの起動・停止等をブラウザ上から実行できるツールが、多くのベンダーからリリースされている