連載
» 2016年01月06日 05時00分 UPDATE

Tech Basics/Keyword:Docker

Dockerとは、軽量で互換性の高いコンテナ型の仮想実行環境である。ハイパーバイザ型の仮想実行環境よりも必要なリソースが少なく、管理も容易で、利用できるコンテナイメージも豊富なため、現在急速に普及が進みつつある。

[打越浩幸,デジタルアドバンテージ]
Tech Basics/Keyword
Windows Server Insider


「Tech Basics/Keyword」のインデックス

連載目次

 「Docker」(ドッカー)とは、軽量なコンテナ型の仮想実行環境を使った、主にソフトウェアの自動デプロイメント(展開)を支援するシステムである。dotCloud社(現Docker社)が開発し、2013年にオープンソースのプロジェクトとして公開された。ソフトウェアの高速な配布・実行や容易なイメージのカスタマイズ、導入運用の手軽さ、豊富なプレビルドイメージの提供などの理由により、パブリッククラウドからオンプレミスシステム、開発環境構築まで、さまざまなシーンで急速に普及しつつある。

軽量なコンテナ型の仮想実行環境

 コンテナ型の仮想実行環境とは、Linuxに備わっている「コンテナ」技術やControl Groups(cgroups)などのリソース管理機能を使って、アプリケーションのプロセス実行環境を他のプロセスから隔離し、その中でアプリケーションを動作させる技術である。

 仮想実行環境といえば、従来はハイパーバイザ型やホスト型の仮想実行環境が一般的であった。これらの環境では、仮想化されたハードウェア上でゲストOSが動作し、さらにその上で目的のアプリケーションのプロセスが動作している。アプリケーションを実行するためにはまずゲストOSを稼働させなければならず、時間もかかるし、CPUやメモリ、ディスクなどのリソースも多く消費する。

従来型の仮想実行環境 従来型の仮想実行環境
ハイパーバイザ型やホスト型の仮想実行環境では、ホストOS上でまず仮想的な仮想マシン環境を作成/実行し、さらにその中でゲストOSを実行している。最終的なアプリケーションを動かすために、仮想マシンやゲストOSを実行させねばならず、それら全てがオーバーヘッドとなる。

 これに対してコンテナはLinuxの通常のプロセスとほぼ同じで、ホストOSの上で直接動作している。そのため展開や起動は素早いし、ゲストOSの実行やハードウェアのエミュレーションなどのオーバーヘッドはない。

 DockerアプリケーションはLinuxの1プロセスとして実行される。ただし、同一ホスト上で動作している他のプロセスからは隔離されており、ファイルシステムやネットワーク、名前空間なども分離していて、それぞれが独立したLinuxマシン上で動作しているかのように振る舞う。

Dockerの実行環境 Dockerの実行環境
Dockerでは、最終的なアプリケーションはホストOSのプロセスとして実行されているため、余計なオーバーヘッドがない。ただし通常のLinuxのプロセスと違って、Linuxカーネルのサポートする「コンテナ」技術などをベースにしている。コンテナは、他のプロセスからは隔離された、ある程度独立したプロセス実行環境である。コンテナごとにファイルシステムやネットワークI/F、名前空間などが独立している。

 上図にある「Docker Engine」はDockerのコンテナの実行をサポートするためのモジュールであり、外部からはDocker APIを使って制御される。

Dockerアプリケーションのカスタマイズ

 Dockerではアプリケーションとその実行環境、展開/操作方法(スクリプト)などをまとめて1つのパッケージにし、それを「Dockerイメージ」として保存/配布している。イメージは公式なレポジトリで配布されているもの(ベースイメージ)を取得してきてもよいし、自作することもできる。

 DockerイメージをDocker Engine上で起動したものがDockerのコンテナになるが、コンテナ中で必要なアプリケーションをインストールして、各部をカスタマイズした後、それを保存すれば、新しいDockerイメージとして利用できる。イメージファイルは互換性が高く、これは基本的にはどのDockerホスト上でも動作する。

 ただしこの方法は、すでに存在するイメージや新しいベースイメージをカスタマイズする場合には不便である。手動でカスタマイズした内容を、新しいイメージに対してもう一度適用しなければならないからだ。

 こんな場合は「Dockerfile」というスクリプト機能を使うことになる。このファイル中には、イメージに対して適用する指示を記述しておく。例えばrubyとmysqlのパッケージを追加し(ADDコマンド)、さらにapp1コマンドを実行する(RUNコマンド)、というようなスクリプトを記述する。Dockerfileを既存のイメージに適用すれば、どのイメージに対しても簡単に同じソフトウェア環境をすぐに用意できることになり、これはDevOps的なアプローチにも有用だ。

Dockerイメージの履歴管理

 Dockerのコンテナ中ではイメージ中のファイルシステムは全て書き込み禁止になっており、書き込まれた内容は全て新しい「レイヤー」に保存される。これはいわゆる「コピー・オン・ライト」方式の世代管理機能であり(仮想マシンの差分ディスク機能のようなもの)、元のイメージの内容を保ったまま、更新されたデータだけを別ファイルとして取り扱うことができる。これにより、少ないディスク領域で多数のコンテナの実行が可能になる。

レイヤー化されているDockerのファイルシステム レイヤー化されているDockerのファイルシステム
Dockerではイメージに書き込みを行うと、それは新しいレイヤーとして保存される。レイヤーをコミットして新しいイメージを作成したり、以前のイメージ戻したりといったことが簡単に行える。

 レイヤーの内容は適宜「コミット」することにより、新しいイメージとして保存できる。これにより、ソフトウェアのバージョン管理のように、すぐに以前のイメージに戻したり、新しい派生版で試験したりといったことが簡単にできるようになっている。

Dockerの管理

 Dockerのコンテナやイメージなどは、基本的にはCUIのdockerコマンドで管理する。具体的には次のような操作を行う。

 最初にdocker imagesコマンドで利用できるイメージを確認し、不足していたらdocker pullなどでDockerレジストリから必要なイメージを入手したり、Dockerfileとdocker buildコマンドで新しいイメージを構築したりする。

 イメージが用意できたら、docker runで起動し、docker psで実行中のコンテナを確認する。Dockerのコンテナは独立したネットワークを持つプロセスとして動作するため、外部と通信させたければ、docker portコマンドなどを使ってネットワークのポートフォワードの設定を行う。

 一度実行したコンテナは終了後もディスクイメージが残っているので次回は素早く起動できるし、docker commitすれば新しいイメージとして保存できる。

DockerレジストリとDockerハブ

 Dockerのイメージは互換性があるため、他のユーザーが作成したイメージを使ったり、自分の作成したイメージを譲渡したりすることもできる。このためには「Dockerレジストリ」を利用する。これはDockerのイメージを交換するための場所/サービスである。

 Dockerレジストリサイトはプライベートで構築することもできるし、企業などが構築して公開しているものもある。Docker社では「Docker Hub」というサイトを運営しており、基本的なベースイメージの公開やユーザーによるイメージの交換などを支援している。

Linux以外のOSでのDockerの利用

 DockerはLinuxアーキテクチャにおけるプロセスやAPI、コンテナの技術(LXCやcgroupsなど)をベースにしているため、Dockerコンテナの実行モジュール(Docker Engine)はLinux上でしか動作しない。

 Mac OS XやWindows OSの場合は、まず何らかの仮想環境上で64bit版のLinuxを動作させ、その中でDocker Engineを起動する。

 一方、DockerのクライアントツールはLinuxの機能に依存していないため、それぞれのOS向けのものが利用できる。

 Dockerは、Linuxベースのコンテナを動作させるためのプラットフォームであるが、コンテナさえ動けば、そもそもLinuxの全機能を必要としない。最近ではDockerのコンテナが実行できる(Linuxベースの)軽量なOSが開発されている。例えば「CoreOS」や「Project Atomic」「Snappy Ubuntu Core」などがある。

 またクラウドサービスでも従来の仮想マシンに加えて、Dockerの実行環境を用意しているところが増えてきている。

Windows ServerでのDockerのサポート

 2016年リリース予定のWindows Server 2016では、Dockerをサポートすることを表明している。これはLinuxコンテナの実行をサポートするものではなく、Windowsコンテナというまったく別の種類のコンテナをサポートするものである。ただし、コンテナの管理方法はDockerと同じなので、Dockerの管理用ツールなどは相互運用性があるし、PowerShellでも管理できる。

■関連リンク


「Tech Basics/Keyword」のインデックス

Tech Basics/Keyword

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。