コンテナについてネットで調べると、さまざまな情報が出てきます。
しかし、「OSレベルの仮想化」などあまりピンとこない表現が多く使われているように思います。
そこで本記事では、コンテナとは一体なんなのか、その本質を説明したいと思います。
コンテナとは何か?
OSの機能を利用して、隔離環境を作る技術
コンテナ技術とは、一言で言えば「OSのカーネルが持つ機能を使って、隔離された環境を作る技術」です。
「隔離環境」とは、具体的には以下のような特徴を指します。
- 他の環境から独立したプロセスが動く(他のプロセスから見えない)
- ファイルシステムが独自に存在する(隔離された環境専用のファイルやディレクトリが使える)
- 専用のネットワーク環境が与えられる(IPアドレスなどが他の環境と共有されず、独立して使える)
- リソース使用量が制限される(CPUやメモリなどの資源を管理・制限できる)
コンテナはよく仮想マシンと対比されますが、個人的には「OSのユーザ管理をさらに強化したもの」と考えた方がイメージしやすい気がします。
なぜなら、ユーザ管理の仕組みとコンテナの仕組みはどちらも「OSが持つ仕組みを使って、環境を分離する」という点で共通しているからです。
ユーザ管理とは、管理者アカウントを作成したり、家庭内で複数ユーザを作成する等の一般的なユーザ管理を指しています。

OSのユーザ管理とコンテナの隔離環境を比較すると以下のようになります。
| 項目 | OSのユーザ管理 | コンテナの隔離環境 |
|---|---|---|
| 分離のレベル | ユーザ間の分離は権限でのみ行われる | プロセス、ファイルシステム、ネットワーク等を完全に分離 |
| プロセスの隔離 | 他ユーザのプロセス自体は見える(権限による操作制限あり) | 他コンテナのプロセスは一切見えない(完全に独立) |
| ファイルシステム | 基本的に同じファイルシステムを共有(権限によるアクセス制限あり) | 専用のファイルシステムがある(完全に独立) |
| ネットワーク | 共有(隔離なし) | 仮想ネットワークにより専用のIPアドレスを持つ |
| リソース管理 | 制限なし(共通利用) | CPUやメモリ使用量を制限可能 |
コンテナを実現する技術
コンテナを実現する代表的なツールはDockerですが、それ以外にもコンテナを実現するツールは様々存在します。
(以下の記事に詳しく載っています)
ただ、基本的にはLinuxカーネルの機能を利用しているため、ここではコンテナの仕組みを支えるLinuxカーネルの主な機能を簡単に紹介します。
- Namespace(名前空間):プロセスやネットワークインターフェース、ファイルシステムなどを隔離する機能
- Control groups(cgroups):プロセスをグループ化し、グループ内のプロセスに対して共通のリソース(CPU、メモリ等)管理を可能にする技術
これらの技術の詳細は以下資料が参考になります。

余談ですが、Network Namespaceはネットワークの勉強にも大いに活用することができ、例えば以下の本ではNetwork Namespaceを利用しながらネットワークの学習が可能です。
コンテナと仮想マシン、仮想化の関係性
コンテナについて調べると、よく「OSレベルの仮想化」という表現を見ますが、私はこの表現にかなり違和感があります。
そもそも仮想化とは、「物理リソースを抽象化し、実際の状態とは異なる状態のように見せかけること」です。(※)
仮想化の定義はただこれだけであり、OSレベルって何??と思ってしまうのは私だけでしょうか。
例えば仮想マシンでは、仮想化技術を利用して、あたかも独立した物理的リソース(CPU, メモリ, ストレージ, ネットワークインターフェース等)を各仮想マシンが持っているかのように”見せかけて”います。(実際には一つしかないのに)
ではコンテナでは何をしているかというと、
- ネットワークは仮想化技術を使用
具体的には、前述したNetwork Namespaceの仮想ネットワークインタフェースを利用し、各コンテナに独立したネットワーク環境を構築している。 - それ以外はOSカーネル機能を利用して隔離環境を実際に作成
前述した、Namespace, cgroupsを利用します。
これらの機能は「見せかける」仮想化ではなく、実際にOSの一機能で各環境を厳密に分離しています。
コンテナの実体としてはこれ以上でもこれ以下でもなく、これをOSレベルの仮想化と呼ぶのは、ピンときません。
また、できることは仮想マシンと類似しているため、仮想マシンとの比較で語られることが多いですが、使用している技術は根本的に異なります。
なので、コンテナはあくまで「OSのカーネルが持つ機能を使って、隔離された環境を作る技術」であって、仮想マシンとは全くの別物である、という認識を持つことが重要だと思います。
※仮想化の定義

さいごに
コンテナについて調べると、「仮想化の一種」「仮想マシンの進化系」等々、仮想マシンと比較しての説明がほとんどなのですが、これがコンテナの正確な理解を妨げているのでは、と感じます。
今回の記事がコンテナ技術の理解を深めるきっかけになれば幸いです。

コメント