前置き
この記事は、これからLinuxコンテナやDockerを使い始める人向けに書いた記事です。
触ったことがないととっつきにくいコンテナを理解するためにざっくり概要をまとめました。
長いのでLinuxコンテナ・Docker入門(後編)と2つに分けて書きました。
Linuxコンテナ(LXC)
コンテナの考え方
コンテナとは、端的に言えばアプリケーションをホストOSから隔離する技術のことである。
LinuxOSの中に隔離された空間を作り、他のコンテナ内のプロセスやホストOS上のプロセスに一切干渉せずに動作できる環境を作る。
同時に、既存のホストOSから分離した環境を作ることで、クリーンな環境を提供することができる。
Linuxカーネルとディストリビューションについて
コンテナの詳細に移る前に、まずはLinuxについて説明する。
Linuxという言葉には2つの意味があり、狭義には「Linuxカーネル」、広義では「Linuxディストリビューション」をそれぞれ指す。
狭義のLinux: Linuxカーネル
カーネルは、OSのコア部分にあたり、基本的なプロセス管理やメモリ管理等を行う。
カーネルは全Linux系OSにおいて共通である。
広義のLinux: Linuxディストリビューション(Linux系OS)
LinuxカーネルだけではそのままPCやサーバーにインストールすることはできない。
HWとやり取りするために必要な各種のドライバーやライブラリ、アプリケーションをまとめてパッケージ化したものを「Linuxディストリビューション」と呼ぶ。
例:
- RedHat Enterprise Linux
- Debian GNU Linux
- Android
- SUSE Linux
- CentOS
- Ubuntu
- etc...(無数にある)
⇒見た目は違うものの、Linux系OSはすべて同じLinuxカーネルを使っている。(当然、バージョンは異なるが)
コンテナの概要と、LXCの役割
LXCとは、Linuxカーネルの機能を利用してコンテナ環境を作るためのツールである。
主に以下のようなカーネルの機能を利用する。
- Namespace … プロセスやNWリソース(仮想NICなど)を分割し、互いに干渉できないようにする。
- CGroup … プロセルをグループ化し、それぞれが使用できるCPU,メモリ等のリソースを制限する。
従来の場合
- OS上にあるライブラリ(この場合はJDK)を複数のソフトで共有していることが多い。
- デフォルトで入っているライブラリやパッケージの中には、使っていないものもある
- ある環境で動くソフトが、別の環境では動かなかったりする(環境差分)
コンテナを使うと
- 依存するパッケージはすべてコンテナ内に入れ、逆に必要のないものは入れない。
- 同じカーネルを使っているLinux系OSであればどのディストリビューションでも同じように動く。
- コンテナ内のプロセスはNamespaceによって隔離されており、コンテナ外には干渉できない。
コンテナは「コンパクトなVM」と考えるよりも「隔離されたプロセス」と考える方が理解はしやすい(と思っている)
VMとコンテナの違い
分け方の違い
VM ... ハードウェアをエミュレートして、その上でOSを立ち上げる
コンテナ ... 同じOS上にあるプロセスやディレクトリを、見かけ上隔離する
VMとコンテナは似て非なるもの。アプローチは真逆。
オーバーヘッド
VM ... ハードウェアをエミュレートしたり、OSを稼働させるためのオーバーヘッドが発生する
コンテナ ... 実体はホストOS上で稼働するただのプロセスに過ぎないので、オーバーヘッドはほぼない。(※)
※マイクロサービス的に多数のコンテナを動かす場合は当然ネットワークのオーバヘッドが発生する
入れるソフト
※これは、LinuxコンテナというよりかはDockerの特徴かもしれない。
VM ... 物理サーバーと同じように、多数のソフトをインストールして使う
コンテナ ... 基本的に1コンテナ1ソフト。不要なライブラリやコマンドは入れない(※)
※最大限まで軽量化されたコンテナではlsやyumといった基本的なコマンドすら入ってなかったりする。これは少し使いづらいこともある。
コンテナ内でpsコマンドを使うとこのことがよくわかる。
通常LinuxはPID1のinitプロセスから子プロセスが大量に派生するが、コンテナ内ではPID1がいきなりApacheになっているのがわかる。
コンテナを利用することによるメリット
大きく、以下のメリットがある。(LXCの公式サイトから引用)
-
セキュリティの向上
アプリケーションが他のアプリケーションに干渉できなくなることで、システムに侵入された時の被害を軽減することができる。 -
疎結合性の向上
一つのホストOSの中に互いに干渉しない形でアプリケーションを動かすことができるため、1つのソフトに対する変更が他のソフトに影響を及ぼすことがない。 -
システムの抽象化
コンテナはホストOSやハードウェアを隠蔽し、どのような環境でも安定して動作する環境を作ることができる。
まとめ
コンテナ
-
コンテナでは、アプリとその実行に必要なライブラリなど一式をひとまとめにして、簡単に作成、破棄できる。
-
コンテナの実体は、Namespaceで区切られたホストOS上のディレクトリやプロセスである。
-
基本的にコンテナ内には動作に必要な最低限のファイルのみを入れるが、
ディストリビューション全体をコンテナ化するような使い方もできなくはない。
後編
Linuxコンテナ・Docker入門(後編)に続きます。



