1. コンテナ技術の概要と基本概念
「Container(コンテナ)」という言葉は、日常生活においては衣类ケース、スーツケース、バックパックなど、物品を整理・収納し、運搬しやすくするための道具を指します。また、コンテナには「集積箱(集装箱)」という意味もあります。港の作業員が、異なる品物の入った規格の統一された箱を船に整然と積み込み、効率的に輸送する光景はその代表例です。
これらの集装箱(集装箱)がスムーズに輸送できる理由は、サイズが標準化されており、なおかつ内部の物品が安全に隔離されているからです。IT分野において「Container」という言葉を用いるときも同様に、アプリケーションをパッケージ化し、標準化され、隔離された状態にすることを意味します。
IT技術におけるコンテナは、一種の「サンドボックス(沙盒)技術」です。サンドボックスは集装箱のようにアプリケーションを内部に収容します。これにより、アプリケーション間に明確な境界が生まれ、相互の干渉を防ぎます。同時に、サンドボックスに収められたアプリケーションは環境を問わず簡単に移植できるため、これこそがPaaS(Platform as a Service)が目指す理想的な状態(可移植性、標準化、隔離性)となります。
コンテナはソフトウェア産業における「集積箱技術」と言えます。標準化によってパッケージングコストが削減され、輸送や荷役の効率が劇的に向上した伝統的な運輸業の変革と同様のことが、ソフトウェア開発でも起こっています。初期のソフトウェアプロジェクトでは、更新やリリースが非効率であり、開発・テスト・リリースのサイクルが長く、アジリティ(敏捷性)の確保が困難でした。コンテナ技術の登場により、その標準化という特性を活かして、生産効率を大幅に向上させることが可能になりました。
コンテナ技術は、仮想化、クラウドコンピューティング、ビッグデータに続く、現在最も注目されている新興技術です。ハードウェア資源の利用効率を高め、企業の業務システムにおける秒単位の高速な横方向への拡張(オートスケーリング)を容易にします。さらに、オーケストレーションツール(Kubernetesなど)と組み合わせることで、業務のダウンタイムからの自己修復功能(セルフヒーリング)も実現可能です(※OpenStack単体ではこの機能は提供されません)。そのため、今後数年間はコンテナ技術がさらに普及する時代が続くと予想されます。IT業界において非常に影響力と価値のある技術であり、エンジニアにとってこの技術を熟練させることは、将来性の高いキャリアへとつながります。
2. 容器技术の歴史
Dockerはコンテナ技術を頂点へと押し上げましたが、コンテナ技術自体はDockerから誕生したわけではありません。実際には、コンテナ技術は決して新しい技術ではなく、その誕生から今日にいたるまで長い歴史があります。以下に挙げる名称の中には、現在では聞き馴染みのないものもあるかもしれませんが、これらはすべてコンテナ技術の発展を支えてきた重要なアプリケーションです。
1. Chroot Jail
Linux環境でよく使われる chroot コマンドの仕組みです。1979年に登場し、最も初期のコンテナ化技術の1つとされています。特定のプロセスのファイルシステムを隔離する機能を提供します。
2. The FreeBSD Jail
FreeBSD Jailは、オペレーティングシステム(OS)レベルの仮想化を実現した技術であり、OSレベル仮想化の先駆者の一つです。2000年にFreeBSD 4.0のリリースとともに導入されました。
3. Linux VServer
Linuxカーネルに追加されたOSレベルの仮想化機能を利用して、専用の仮想サーバー(VPS)を実現する技術です。単一の物理サーバー上で、多数の独立した仮想専用サーバー(VPS)をネイティブ速度で同時に実行させ、ハードウェア資源を効率的に共有します。
VPSは従来の物理Linuxサーバーとほぼ同等の操作環境を提供します。SSH、メール、Web、データベースサーバーなどのすべてのサービスを、物理サーバーの時とほとんど(あるいは特殊なケースを除き全く)変更することなく起動できます。
各VPSは独自のユーザーアカウントデータベースとrootパスワードを持ち、他の虚拟サーバーから隔離されていますが、同一のハードウェア資源を共有します。2003年11月1日にVServer 1.0がリリースされました。
- 公式サイト: http://linux-vserver.org/
4. Solaris Containers
X86およびSPARCシステム向けに設計されたOSレベルの仮想化技术です。Solarisコンテナは、システムリソースの制御と、「ゾーン(Zone)」と呼ばれる仕組みによる境界隔離の組み合わせによって構成されています。
5. OpenVZ
LinuxにおけるOSレベルの仮想化技術の1つです。安全に隔離された複数のLinuxコンテナ(VPS)を単一の物理カーネル上で作成することができます。
6. Process Containers
Googleのエンジニアによって開発されたプロセス制御技術で、後に一般的に cgroups(control groups) と呼ばれるようになる仕組みの原型です。
7. LXC (Linux Containers)
LXCは「Linux Container」の略称です。プロセスとリソースを隔離するための軽量な仮想化環境を提供します。CPU命令の解釈メカニズム(エミュレーション)やフル仮想化(Full Virtualization)のような複雑なオーバーヘッドを必要としません。単一のOSが管理するリソースを孤立したグループに分割することで、グループ間で衝突するリソースの要求を適切にバランシングします。
Linux Containerは、単一のホストノード上で相互に隔離された複数のサーバーコンテナを同時に実行するメカニズムを提供します。LXCは chroot に似た、独自のプロセス空間とネットワーク空間を持つ仮想環境を提供しますが、仮想机(VM)とは異なります。LXCはあくまでオペレーティングシステム階層におけるリソースの仮想化であるためです。
8. Warden
初期の段階において、WardenはコンテナのランタイムとしてLXCを利用していました。現在ではCloud Foundry独自の技術に置き換わっています。
9. LMCTFY
LMCTFYは「Let me contain that for you」の略称です。Googleのコンテナ技術スタックのオープンソース版にあたります。
GoogleのエンジニアはDockerの libcontainer チームと協力し、LMCTFYの核心的な概念を抽象化してこのプロジェクトに移植していました。その後、このプロジェクト自体の進展は停止し、最終的には libcontainer へと統合・吸収されました。
10. Docker
Dockerは、アプリケーションとその依存関係(ライブラリや環境設定)をパッケージ化し、ほぼすべてのLinuxサーバー上で動作させることができるコンテナツールです。
11. RKT (Rocket)
RKTは「Rocket」の略称であり、セキュリティとオープンスタンダードに焦点を当てて開発されたアプリケーションコンテナエンジンです。
3. Dockerとは何か(Dockerの概要と主要目標)
3.1 Dockerの誕生背景
2010年、ソロモン・ハイクス(Solomon Hykes:後のDocker社CTO)と数人の若者により、米国サンフランシスコにPaaSプラットフォームを提供する「dotCloud」という会社が設立されました。同社は主に開発者向けの技術サービスを展開していました。
Dockerは2013年3月27日にオープンソースプロジェクトとして誕生しました。最初、これはdotCloud社内部のPaaSサービスに関わる実用的なアマチュア(課外)プロジェクトとしてスタートしたものです。Googleが開発したGo言語をベースに実装されました。その後、プロジェクトは大成功を収め、2013年10月には社名を「Docker Inc.」へと変更、本社を米国カリフォルニア州サンフランシスコに構えました。その後、Linux財団(Linux Foundation)に加入し、Apache 2.0ライセンスに従ってコードがGitHub上で管理・メンテされるようになりました。
3.2 技術的進化:LXCからruncへの脱却
DockerはLinuxカーネルをベースに実装されています。最初期はLinux標準のコンテナ技術である LXC(Linux Containers) を採用していました。LXCは軽量な仮想化を提供できるLinuxネイティブの技術であり、Dockerは当初、LXCの高度なラッパー(高階封裝)として標準的な設定方法や一連の強力な機能を追加する形で発展しました。なお、当時の代表的な仮想化技術であるKVM(Kernel-based Virtual Machine)はカーネルモジュールベースで実装されていたのに対し、LXCはOSレベルの仕組みでした。
その後、DockerはLXCへの依存を完全に排除するため、自社で開発しオープンソース化した runc(ランシー) 技術へと移行しました。これにより、LXCを徹底的に放棄し、コンテナを独立して制御する近代的なアーキテクチャへと進化しました。
3.3 仮想マシンとの違いとパフォーマンスの優位性
Dockerは、従来の仮想マシン(VM)と比較してデリバリー速度が圧倒的に速く、リソース消費が極めて低いという特徴を持っています。Dockerはクライアント/サーバー(C/S)アーキテクチャを採用しており、リモートAPIを介してコンテナの作成や管理を容易に行います。これにより、軽量で、可搬性(ポータビリティ)があり、自己完結したコンテナを簡単に作成できます。
Dockerのコアとなる3大理念は 「Build(構築)」「Ship(運輸)」「Run(運行)」 です。Linuxの Namespace(名前空間) や Cgroup(コントロールグループ) などの技術を利用して、リソースの隔離と安全性を保障します。
従来の仮想マシンは、何も処理をしていない「空運転(アイドル)」の状態でも物理マシンの約6〜8%のパフォーマンスをオーバーヘッドとして消費しますが、Dockerコンテナは実行時にそのような追加のリソース開口(オーバーヘッド)を必要としません。そのため、ハードウェアのリソース利用効率を大幅に向上させることができます。
要約すると、Dockerは斬新な方式で実現された「軽量な仮想マシン」のような存在ですが、その動作原理や実際のアプリケーションへの適用方法は従来のVMとは大きく異なります。そのため、コンテナ技術における正確な専門用語としては「アプリケーションコンテナ(Application Container)」と呼ばれます。
3.4 Dockerの主要目標
Dockerのメインミッションは “Build, Ship and Run Any App, Anywhere”(あらゆるアプリケーションを、どこでも構築・輸送・実行する)です。
アプリケーションコンポーネントのパッケージ化(Packaging)、配布(Distribution)、デプロイ(Deployment)、ランタイム(Runtime)といったライフサイクル全体を管理することにより、コンポーネントレベルでの「一次封裝、到处運行(一度パッケージ化すれば、どこでも動く)」を実現します。
ここで言うアプリケーションコンポーネントとは、単一のWebアプリケーションだけでなく、データベースサービスの一式、さらにはオペレーティングシステムそのものまで指すことができます。アプリケーションをDockerコンテナ上で実行することで、クロスプラットフォーム・クロスサーバーが実現し、一度関連する環境を構成してしまえばどこでも同様に実行できます。これにより、開発環境と本番環境の完全な一致性が保証され、アプリケーションと実行環境の互換性問題が解決され、デプロイ効率が極めて向上し、トラブルの可能性が最小限に抑えられます。
3.5 アプリケーションをコンテナ化(装箱)する意義
Dockerを使ってプログラムをコンテナ化することには、以下の「3つの統一」という重要なインフラ的意義があります。
① インフラ環境の統一 ➔ Docker環境
- ハードウェアの構成やプロビジョニングの差異を隠蔽
- オペレーティングシステム(OS)のバージョンの違いを吸収
- ランタイム環境の異質性(ヘテロジニアス環境)を統一
② プログラムのパッケージ化(装箱)方式の統一 ➔ Dockerイメージ
どのような言語で書かれたプログラムであっても、すべて同一の「Dockerイメージ」として一元的にパッケージされます。
- Javaプログラム
- Pythonプログラム
- Node.jsプログラム
③ 程序デプロイ(運行)方式の統一 ➔ Dockerコンテナ
従来のように言語やフレームワークごとに異なるコマンドを叩いて起動する必要はなく、すべて docker run という共通のインターフェースに統一されます。
- Javaの従来方式:
java -jar app.jar
➔ Docker化後:
docker run java-app
- Pythonの従来方式:
python manage.py runserver
➔ Docker化後:
docker run python-app
- Node.jsの従来方式:
npm run dev
➔ Docker化後:
docker run node-app


