CTOになるまで続けるブログ

My daily personal tech notes

Linux コンテナとは何か

Linux コンテナに関する理解が浅いので、イチから調査してまとめようと思う。 ちなみに、RHEL7 のドキュメントにある Linux コンテナの解説が、なかなかわかりやすかった。

Linux コンテナとは

一つのホスト上で、複数の隔離された環境を走らせる技術のこと。 略して LXC(LinuX Containers) と呼ぶ。 一般に Docker アプリとして利用される。

ユーザ目線でみると仮想マシンとよく似ているが(※1)、違いは遥かに軽量であること。 具体的には、立ち上げが速いのですぐに環境ごと作り直すことができるし、 メモリ消費が少ないのでより多くの環境を作ることができる。

仮想化と仮想マシン

LXC は、仮想化技術の一つである。 OS レベルでの仮想化を提供する技術として知られていて、OpenVZ と同じカテゴリに分類される。(※1)

一方、OS レベル仮想化で作られた環境は、仮想マシンと呼ばれない。 代わりにコンテナと呼ばれる。(※2)

  • ※1: 仮想化とコンテナを区別するような見方もあるようだが、個人的には偏った見方のように感じる。
  • ※2: ハイパーバイザ型仮想化で作られた環境のことを、一般に仮想マシンと呼ぶ。

ハイパーバイザ型仮想化との違い

仮想マシンが重いのは、仮想マシン上での命令実行にハイパーバイザを介すためである。 コンテナ環境はカーネルを共有するので、ハイパーバイザを介す必要がない。 一方、コンテナ環境はカーネルを共有するという特性上、環境ごとにカーネルのカスタマイズできない。(※1)

  • ※1: といっても、多くのエンジニアにとってこれが障害となることは基本的にないはずだが。

LXC のアーキテクチャ

画像引用:LXC のアーキテクチャ

コンテナ技術は、Linux カーネル上の Namespaces と cgroups という機能を元にしたものである。 Namespaces によって、同一カーネル上で走るプロセス同士がコンテナ単位で分離される。 cgroups によって、各コンテナへのリソース割り当てが制御される。 ちなみに、Management Interface というのは、Docker のようなアプリ(上位レイヤ)を指している。

まとめ

  • LXC とは、一つのホスト上で複数の隔離された環境を走らせる技術のこと。
  • ハイパーバイザを介さない分、ハイパーバイザ型仮想化より遥かに軽量に動作する。
  • LXC は、カーネルの機能である Namespaces と cgroups によって実現されている。

LXC は関連技術も多く、掘り下げ甲斐のあるテーマなので、本エントリではほんの表層のみ扱った。 また改めて関連技術について、別のエントリでまとめたい。

参考