オープンソースのコンテナー管理ソフトウェアDockerについて主な機能と特徴、使用技術、動作環境などを紹介。ハイパーバイザー型とコンテナー型の仮想化の違いも解説します。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
「Docker」とは、Docker社(旧dotCloud)が開発するオープンソースのコンテナー管理ソフトウェアの1つです。
コンテナーとはWebサーバーなどアプリケーションの実行環境を抽象化する技術であり、VMware ESXiやLinux KVMなどの「ハイパーバイザー型の仮想化」に対して、「コンテナー型の仮想化」と呼ばれることもあります。
コンテナー管理ソフトウェア自体の歴史は古く、UNIX/Linuxであれば「FreeBSD Jails」「OpenVZ」「LXC(Linux Container)」Windowsアプリケーション向けでは「VMware ThinApp」などがあります。
Dockerは、コンテナーでアプリケーションを実行するために以下の機能を持ちます。
Dockerの特徴の1つとして、新しい独自技術はほとんど使っていないということがあります。コンテナー管理に必要となる既存のOSS(オープンソースソフトウェア)を組み合わせて、コマンドラインおよびREST APIで手軽かつ効率良くコンテナー管理ができるようになっていることが、Dockerが広く支持され、注目されている理由だと思います。
例えば、レッドハットのPaaS(Platform as a Service)であるOpenShiftの次期プラットフォームではDockerが採用されるようです。また、AWS(Amazon Web Services)やGCE(Google Compute Engine)などのクラウド環境で動作するのも大きな特徴です。
ハイパーバイザー型の仮想マシンを仮想マシン上で実行する“Nested仮想マシン”(二重の仮想化)は、クラウド環境ではサポートされないことがほとんどである一方、コンテナー型の仮想化はそのような制約が無いため、多くのクラウド環境で動作します。
では、Dockerを使用することでどのような利点があるのでしょうか。アプリ開発者とインフラ管理者の双方が協調する「DevOps」のためのツールとしてさまざまなメリットがあります。
コンテナー型の仮想化はハイパーバイザー型の仮想化に比べ、CPUなどコンピューターリソースのオーバーヘッド(仮想化のために必要になる余分なリソース)が少ないため、リソースの少ないハードウェアでも実行できます。
最近注目されているITキーワードとして「Immutable Infrastructure(不変のインフラ構成)」があります。Immutable Infrastructureはアプリの実行環境を使い捨てとし、環境を都度作り直すことにより構成変更を行う、アプリの実行環境をより管理しやすくする考え方です。
詳細は記事「継続的デリバリ/デプロイを実現する手法・ツールまとめ」を参照してください。
DockerはImmutable Infrastructureを実現するために必要な機能が一通りそろっており、実際の環境に適用できます。
また、Dockerはコンテナーの構成を全て「Dockerfile」というテキストファイルに記述できるため、「Infrastructure as Code(インフラ構成をGitHubなどのコードリポジトリで管理)」を実践するツールとしても利用できます。モダンなインフラ構成管理にうってつけのツールです。
FROM ubuntu:14.04 RUN echo deb http://archive.ubuntu.com/ubuntu trusty main > /etc/apt/sources.list RUN apt-get update RUN apt-get install -y nginx RUN echo "daemon off;" >> /etc/nginx/nginx.conf EXPOSE 80 CMD ["nginx"]
Dockerには、コンテナーの元となるDockerイメージを異なるホスト間で共有する、「Docker Registry」「Docker Export/Import」という機能があります。これらを利用することで、チーム開発において例えば開発用マシンで作成したイメージを他のメンバーのマシンに簡単にコピーできます。さらにコピー先を本番マシンにすれば、アプリケーションのデプロイツールとして利用することも可能です。
コンテナーにはアプリケーションを実行するための構成が全てそろっているため、かっこいい言い方をすればアプリケーションのポータビリティ(移植性)やインターオペラビリティ(相互運用性)を高める手段として活用できるともいえます。
コンテナーは、Dockerを実行するホスト上で他のアプリケーションと同様のプロセス単位で管理されるため、ハイパーバイザー型の仮想化マシンでいうOSのブート処理が必要ありません。そのため、コンテナーの起動はハイパーバイザー型の仮想マシンに比べ、かなり高速です(参考:Software Defined Boden: KVM and Docker LXC Benchmarking with OpenStack)。
先日、AWS Elastic BeanstalkというAWSのPaaSライクなサービスでDockerサポートが追加されました。
従来のElastic Beanstalkではあらかじめ決められたプログラミング言語やミドルウェアしかサポートされなかったのに対し、Dockerコンテナーであればそれらを自由に構成できるようになりました。また、開発用マシンで作成したDockerイメージをAWSの本番環境でデプロイすることもできる、素晴らしい機能追加だと思います。
代表的なPaaSであるHerokuやOSSのPaaSプロジェクトである「Cloud Foundry」でも、「Buildpacks」というミドルウェアや環境設定をカスタマイズする仕組みが追加されており、PaaSは構成に柔軟性が持てるように進化していることがうかがえます。
また、DockerにせよBuildpacksにせよ、複数のPaaSで環境をカスタマイズする仕組みが共通で提供されれば、PaaS間の相互互換性を保つことができ、開発者にとってより使いやすいものになるのではないでしょうか。
Dockerは、Go言語で開発されています。また、Linuxカーネルの機能やLinux向けファイルシステムに依存するため、Linuxでのみ動作します。
前述の通り、DockerはLinuxカーネルおよびファイルシステムの機能に依存します。比較的新しい機能を利用するため、対応するLinuxディストリビューションのバージョンに注意してください。
またDockerの開発は現在非常に活発で、たびたび仕様変更があるため、各動作環境で利用できるDockerの最新バージョン(原稿執筆時点では0.11.1)を可能な限り使うようにしましょう。
今回はDockerの概要ということで、Dockerの特徴と機能、動作環境を紹介しましたが、いかがでしたでしょうか。次回は、Dockerのインストールと使い方を解説しますので、お楽しみに。
大瀧隆太
所属/職種:クラスメソッド株式会社 シニアソリューションアーキテクト
ビール片手に邦楽ロックバンドのライブ/フェスへの参加をこよなく愛する。業務ではAWS導入支援やAWS研修の講師に携わる一方、自動化/デプロイツールの活用でクラウドエンジニアがどこまでスケールできるのか日々試行錯誤している。
ブログURL:http://dev.classmethod.jp/
Copyright © ITmedia, Inc. All Rights Reserved.