Dockerが注目されている理由を探る

Dockerとは
Dockerとは、Docker社が開発しているオープンソースのコンテナ型仮想化ソフトウェアである。Linux上でLXC(Linux Container)の技術を活用し、コンテナ型の仮想環境を作成するものだ。
Dockerの主な特徴は、以下の通りである。
- コンテナはカーネル部分をベースのOSと一部共有するため、リソース使用量が非常に少ない
- Docker社が用意しているリポジトリ(DockerHub)に、構築済みのコンテナイメージがあるので、構築作業が不要
- コンテナの作成からプロダクトのインストール・設定するまでの手順を、“Dockerfile”というテキストファイルに定義できる(インフラのコード化)。このDockerfileを用いることで、Dockerが導入されている環境であればどこであっても、準備した環境を稼働させられるため携帯性が高くなる。
これらの特徴からDocker環境では一台のサーバで多数のコンテナを同時に実行したり、実行していたコンテナを別環境で稼働させたりすることが可能だ。
サーバ仮想化方式ごとの特徴比較
コンテナ型の仮想化と、ハイパーバイザ型やホスト型の仮想化とは、どのような点が異なるのだろうか。まずは仮想化の方式の違いから見ていこう。
表1:仮想化方式の違い
コンテナ型仮想化 (Docker) | ハイパーバイザ型仮想化 (VMWare ESXi) | ホスト型仮想化 (Linux KVM) | |
---|---|---|---|
仮想マシン | OS部分を一部ホストOSと共有するため、VMごとにOSインストールをする必要はない | VMごとにOSをインストールする必要がある | VMごとにOSをインストールする必要がある |
稼働OSの種類 | Linuxのみ稼働可能 Windowsは現状稼働しない | Windows、Linux、一部のUnixも稼働可能 | Windows、Linux、一部のUnixも稼働可能 |
利用開始までの時間 | OSインストール不要のため、利用開始までの時間が短い | 初回構築時にはネットワーク・OSインストール等の作業が発生するため、利用開始までの時間が長い | 初回構築時にはネットワーク・OSインストール等の作業が発生するため、利用開始までの時間が長い |
ネットワーク | 標準では、ホスト側に作成されたDocker専用のNICとしか通信出来ない | ネットワークの作成が可能で、VMにも任意の数のvNICを付与可能 | ネットワークの作成が可能で、VMにも任意の数のvNICを付与可能 |
リソース | 標準ではHDDリソースの指定が出来ない。CPU、メモリについてはリソース割り当て上限を指定可能 | CPU、メモリ、HDDのリソースについて割り当てを指定する必要がある | CPU、メモリ、HDDのリソースについて割り当てを指定する必要がある |
オーバーヘッド | コンテナはホストOSから見ると単一のプロセスであり、オーバーヘッドはほぼない | VMから機器までのアクセス経路がハイパーバイザのみなので、ホスト型仮想化に比べるとオーバーヘッドは少ない | VMから機器までのアクセス経路が他の仮想化技術に比べ長いため、比較した場合には一番オーバーヘッドが大きくなる |
各方式の特徴は、以下の通りだ。
コンテナ型仮想化
コンテナ型仮想化は、ホストOS上でコンテナプロセスが実行されており、その上にコンテナが立ち上がってアプリケーションが実行される。他の方式との相違点として、コンテナはホストOSから見ると一つのプロセスとして認識されている点が挙げられる。またコンテナは、ホストOSのカーネル部分を共有するため、各コンテナにはOSは導入されていない。
ハイパーバイザ型仮想化
ハイパーバイザ型仮想化は、独自の仮想化管理ソフトであるハイパーバイザをサーバへ直接導入し、サーバ全体を仮想化に利用する。仮想環境上のアプリケーションからサーバまでの経路がホスト型仮想化製品よりも短いため、高いレスポンスが得られる。立ち上げられるVM数は、コンテナと比較すると少なくなる。
ホスト型仮想化
ホスト型仮想化は、ホストOS上で仮想化ソフトを実行させ、その上にゲストOSを稼働させる。ここで取り上げる3種の仮想化の中では一番オーバーヘッドが高くなる傾向にあるが、ホストOS上で直接実行しているアプリと並行利用できるため、個人環境での利用に人気がある。
各サーバ仮想化の実装方式を図で表すと、以下のようになる。図中の緑色の範囲が、仮想化の範囲である。
サーバ仮想化の実装方式(クリックで拡大)
サーバ仮想化範囲から見る相違点
コンテナ型とホスト型については、ホスト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についての知識が必要となる。知識が必要になるということは、属人性が高まることを意味する。この問題は、外部ツールを利用することで解決できるだろう。実際、稼働中のコンテナ一覧やコンテナの起動・停止等をブラウザ上から実行できるツールが、多くのベンダーからリリースされている
Dockerの使い道
ではDockerを利用し始めるにあたって、一体どこから導入を始めれば良いのだろうか?筆者が考えるDocker利用の3ステップをご紹介しよう。
最初の使い方
実際にDockerを使い始めるに際しては、テスト環境としての利用が良いだろう。リスクを抑え、なおかつDockerの持ち味を活かせるからだ。最初にテストに必要な設定を構築し、Dockerイメージとして保存する。後はテストのたびに最初に構築したDockerイメージからコンテナを作成し、テストを行えば良い。もしバグが発生すれば、コンテナをイメージとして保存すれば良い。こうすることで、バグ発生時の状態を確実に再現出来る。
次の使い方
次のステップとしては、開発環境にDockerを利用することをお勧めしている。テストの時と同様、必要な設定を最初に構築しDockerイメージとして保存する。後は作成したイメージからコンテナを立ち上げて、利用するだけで良い。Dockerを用いて開発を行う場合、非常に大きなメリットがある。それはユーザ個々の環境で発生しうる特定環境によるエラー等がなくなることだ。開発環境が配布出来る状態(コンテナ)として完成していれば、チームに新規参画者が来たとしても1時間もあれば、開発に取り掛かってもらえることだろう。
最後に目指す使い方
最終的なステップとしては、Dockerコンテナを本番環境としてWebサービス等のサービス提供基盤での利用を目指すべきだろう。コンテナだけをセキュアに外部公開するには少々骨が折れることだろうが、外部ツールと組み合わせて利用することよって実現可能になっている。公開期間が終了すれば、コンテナをイメージ化して保存することによって、再度必要になった時にも環境ごと復元出来る。
Dockerの魅力を探る
最後に、筆者の考える「Dockerが注目される理由」を、技術者と企業のそれぞれの視点から紹介しよう。
技術者が注目する理由としては、大きく以下の3点が考えられる。
- OSS技術であること
特定ベンダーにロックインされることなく、技術検証や周辺ツールの開発が行いやすい。 - オーバーヘッドが小さいこと
ハイパーバイザのような仮想OS部分がないため、家庭用のPCでも利用出来るほど軽量・高速である。わざわざ専用機材を購入しなくても、どこでもいつでもDockerに触れられる。 - インフラをコードに出来ること
仮想環境をゼロからコード化し、自動化する技術は、これまでOSS界隈では存在しなかった。このようなDocker独自のおもしろさが技術者を引き付けている。
一方、技術を採用する立場である企業がDockerに注目する理由としては、以下の2点が考えられる。
- 独自のコンテナ技術の置き換え
Googleのコンテナ技術やRed HatのGear等、各社が独自に利用してきたコンテナ技術とそのノウハウをDockerへ伝えることによって、これまで利用してきた独自コンテナ技術をDockerへ置き換えたいのではないだろうか? この置き換えが進み、Dockerがコンテナ技術のデ・ファクト・スタンダードとなった時、利用者はGoogleのIaaS環境からRed HatのPaaS環境へとDockerを移動させるといったような移行が、容易に行えるようになる。 - 業界全体への技術支援
コンテナ技術というのは元々Solaris Container等、商用製品での利用が活発だった。そのため、オープンな技術として伝聞されてこなかったということも多分にあるだろう。このような背景から、コンテナ技術はこれまで注目されていなかった。Dockerの登場により、OSSの世界にもコンテナ技術が登場したことから、ノウハウを持っている各社は参画して技術支援を図り、業界全体のスキルアップを狙っているのではないだろうか。