PaaS プロバイダの dotCloud が,自社プラットフォームの重要なコンポーネントである Docker をオープンソースとして公開した。Docker は LXC(LinuX Container) テクノロジの実装で,Unixプロセスを分離実行する軽量仮想化 (lightweight virtualization) ソリューションを実現した高レベル API を拡張機能として備えることにより,ソフトウェア展開の自動化に必要な,再現性を持ったセキュアな実行環境を提供する。
Dockerでは標準コンテナ(Standard Container)という概念を用いている。これはソフトウェアコンポーネントとその依存対象 – バイナリ,ライブラリ,定義ファイル,スクリプト,仮想環境,jarファイル,gemファイル,tarアーカイブファイルなど – をひとつにまとめたもので,cgroup をサポートする x64-bit Linux カーネル上で稼働する。このコンテナによって維持される適切な動作環境をラップトップや分散インフラストラクチャ,クラウドなどに展開することが可能で,継続的デプロイ(Continuous Deployment)やWebデプロイ,データベースクラスタ,SOAなど広い用途に応用できる,と Mike Kavis氏がブログで説明している。
アプリケーション技術者である私に関係のある Docker のユースケースは,継続的デリバリのプロセス合理化への応用です。メインフレームの頃からクライアントサーバ,そしてクラウドの現在まで,私はさまざまな場所で仕事をしてきました。そのキャリアすべてにおいて,アプリケーションのテストを成功させるために動作環境を統一するという作業は,悪夢以外の何ものでもなかったのです。作業プロセスの優劣の問題ではありません。コードが開発からQA,さらに製品ステージへと移行する過程において,これらの環境が一環して同じであったことは一度としてありませんでした。結局は製品リリースでの品質が最終結果ということになるのです。"テストでは動いていました" というのは,"いま小切手を送るところです" というのと同じくらい,当てにならないフレーズでした。
継続的デリバリ (CD/Continuous Delivery) が実現すれば,コードととともにその実行環境全体も開発からQA,製品ステージへと引き継げるようになります。設定が問題だとか,システムが違うとか,弁解する必要はもはやありません。製品で動作しないものはテストでも動かないからです。Docker を使うことで,このような CD プロセスを自動化するスクリプトの記述が可能になります。新しい環境の構築が,セットアップや設定の問題に対処する必要なく,素早くできるようになりますから,マーケットへの製品展開も迅速になるでしょう。
dotCloud の CEO である Solomon Hykes氏は PyCon でデモを行ったとき,Docker は再現性のある軽量仮想ソリューションである,なぜなら "プロセスレベルで独立していて,自身のファイルシステムを所有している " からだ,と説明していた。APIを使うことでシステム管理者は,コンテナ上で起動,停止,コピー,一時停止,コミット,標準ストリームへのアタッチ,ファイルシステム更新のリストなど,数多くの操作を実行することが可能になる。
Docker の 主な機能 は次のようなものだ。
ファイルシステムの分離: 各プロセスコンテナは完全に独立したルートファイルシステム上で動作する。
リソースの分離: CPUやメモリなどのシステムリソースは cgroup を使用して,各プロセスコンテナに別々に割り当てることができる。
ネットワークの分離: 各プロセスコンテナは自身のネームスペース内で動作し,自身の仮想インターフェースとIPアドレスを保持する。
コピー・オン・ライト: ルートファイルシステムはコピー・オン・ライトを使用して作成されている。これによってデプロイが極めて高速になるとともに,メモリおよびディスクの使用量も軽減される。
ロギング: 各プロセスコンテナの標準ストリーム(stdout/stderr/stdin) は収集され,リアルタイムあるいはバッチ取得のためにログされる。
更新管理: コンテナのファイルシステムの変更を新たなイメージにコミットして,別のコンテナを作成するために再利用することができる。テンプレートや手作業による設定の必要はない。
対話型シェル: Docker では仮想ttyをアロケートして,任意のコンテナの標準入力にアタッチすることができる。一時的な対話型シェルを実行するようなことも可能だ。
現時点では,Docker は Ubuntu 12.04 および 12.10 でテストされている。ただし dotCloud によれば,Linux 2.6.24 以降であれば動作可能なはずだ。Vagrant を使用すれば,VirtualBox を通じて Windows や Mac OS X にもインストールすることができる。 Docker は Go で記述されていて,Linux の cgroup と ネームスペース,AUFS – コピー・オン・ライト機能を持ったファイルシステム,LXC スクリプトなどを利用している。