LinuCレベル2 201試験の出題範囲「2.06.1 コンテナの仕組み」の技術的内容についての解説をまとめました。
重要度 2 概要 基本的なコンテナの仕組みについて理解している。 詳細 物理マシン、仮想マシン、コンテナの特徴と違いを理解している。
コンテナのファイルシステムとイメージの関係を知っている。
コンテナを実現する技術の概念を知っている。
・名前空間, cgroups

コンテナの構成(物理マシン、仮想マシン、コンテナの特徴)
LPI-JAPANがpdfで公開しているコンテナの構成に関する図を紹介します。参考までにコンテナの構成はこの図のようになっています。

https://lpi.or.jp/news/event/docs/20200531_linuc2.pdf
コンテナ型仮想化の特徴
コンテナ型仮想化技術の特徴については、LinuC公式サイトに記載があります。
この内容を熟読し、理解しておくことでLinuCの対策をしましょう。
コンテナ型仮想化は、
- コンテナエンジンを動作させる「ホストOS」
- コンテナの動作を管理する「コンテナエンジン」
- サーバーのプロセスやリソースを区画化した「コンテナ」
から構成されます。
ホスト上に区画化された空間を実現することを「コンテナ型仮想化」、実現方法を「コンテナ技術」と呼んでいます。コンテナは、アプリケーションだけでなく、動作に必要となるライブラリや設定ファイルなど、実行環境をまとめたものです。
コンテナ型仮想化の特徴としては、以下のような点が挙げられます。
- コンテナを起動するために、仮想マシンやゲストOSを起動する必要がない。
- コンテナエンジンがホストOSに常駐し、コンテナの操作・管理を行う。
- 各コンテナはコンテナエンジンが動作しているホストOSのカーネルを共有している
- 各コンテナの機能を構成するプロセスをプロセス群として扱うことができ、コンテナ間で互いのプロセスは参照できない。
上記のようにコンテナ型仮想化は、仮想マシンやゲストOSのリソースや負荷がないので、
- 仮想マシン型に比べるとコンテナのサイズは小さく、リソース消費量を抑えられる。
- ゲストOSの起動停止が不要なので、起動が高速である
- 仮想マシンは数GBのサイズになることが多いが、コンテナは数百MB以内の容量であることが多く、すべてのユーザーに同じ環境を提供することが容易になる。
などのメリットが得られます。

コンテナソフト、Dockerの概要
Dockerの概要に関しては、LinuCレベル1 101試験でもまとめています。
Dockerはコンテナエンジンで、コンテナの管理をすることができるソフトウェアです。Dockerの詳細は以下の記事でまとめています。
Linuxのコンテナ型仮想化における名前空間(ネームスペース)の概要
LinuCで出題される仮想化での名前空間(ネームスペース)は、コンテナ間の分離に関する概念です。
コンテナ型仮想化では、名前空間(ネームスペース)という技術を使用して、コンテナとよばれるワークスペース間の分離(isolation)を実現しています。コンテナエンジンはコンテナごとに名前空間の集合を生成します。
名前空間はプロセス(プログラム)から利用することができます。名前空間をプロセス(プログラム)から利用するには、名前空間を扱うAPI(Application Programming Interface)を使用します。
名前空間を扱うAPI(関数)には以下のようなものがあります。
- clone: 新たなプロセスを生成する
- setns: 呼び出したプロセスを既存の名前空間に参加させる
- unshare: 呼び出したプロセスを新しい名前空間に移動させる

名前空間の例はLinuC公式サイトで以下のように紹介されています。
コンテナ型仮想化で使用される名前空間には以下のようなものがあります。
- IPC名前空間 (プロセス間通信のリソースを分離)
- マウント名前空間 (ファイルシステムツリーを分離)
- ネットワーク名前空間 (ネットワークインターフェースを分離)
- PID名前空間 (プロセスID空間を分離)
- ユーザー名前空間(UID/GIDを分離)
- UTS名前空間(nodename, domainameのシステム識別子を分離)
各名前空間は、/proc/{pid}/ns/以下で確認できます。

cgroups(コントロールグループ)の概要
cgroupsは、コンテナ型仮想化環境下で、CPUやメモリなどの割り当て等を行っているLinuxカーネルの機能です。
コンテナ型仮想化では、cgroupsを用いてリソース(CPUやメモリ)などの割り当てを行います。これに対してnamespace(名前空間)では、名前空間ごとに識別用のノード番号を割り当てて、リソースの分離を実行していました。
cgroupはLinuxカーネルの機能で、システムリソースの割り当て、優先度の変更、拒否、管理や監視レベルの制御などを行えます。
参考資料
本記事の作成に使用した参考資料を掲載します。
https://lpi.or.jp/news/event/docs/20200531_linuc2.pdf



