前回の続きとして、コンテナの仕組みについて説明します。前回の記事はこちら↓
コンテナにはLinuxの技術が使われています。コンテナとは何かを理解するために、コンテナで使われている技術について説明していきます。
■ プロセスとは
まずは、Linuxのプロセスについて理解しておきましょう。プロセスとは、実行中のプログラムのインスタンスです。
【図 プロセスとは】
例えば、NginxやPythonのアプリケーションなどを実行すると、そのたびにプロセスが1つ生成されます。Linuxでは、全ての処理がプロセス単位で管理されます。そして、全てのプロセスにプロセスID(PID)が割り当てられます。
また、プロセスはお互いのプロセスが見えています。そのため、権限があれば他のプロセスを終了させることもできます。そして、1つのプロセスがホストOSのリソースを占有してしまうこともあります。例えば、CPUを使いすぎるなど。
■ Namespaceとは
Namespace(名前空間)とは、プロセスに見えるシステムリソースの範囲を分ける仕組みです。
【図 Namespaceとは】
通常、全てのプロセスは互いに見えますが、Namespaceを使うと仮想的な隔離空間を作れます。例えば、通常はプロセスIDの重複はできません。ですが、隔離空間であれば同じプロセスIDを使用できます。上の図で言うと、Namespace1とNamespace2で同じプロセスID=1を使用しています。他にも、同じ名前のユーザーを作成することもできます。
ホストOSから見ると、Namespaceも1つのプロセスです。ですが、NamespaceからはホストOSや、他のNamespaceのリソースを見ることができません。これにより、Namespaceがまるで別のマシンのように振る舞うことができます。
■ cgroupとは
cgroup(Control Group)とは、プロセスに割り当てるリソースの上限や優先度を制御する仕組みです。
【図 cgroupとは】
cgroupでは、ホストOSのリソースを分割してNamespaceに割り当てることができます。Namespaceに、どのcgroupを使うかを設定することで、リソースを制御できます。このため、特定のNamespaceによるリソースの使い過ぎを防止しています。
■ コンテナとは
コンテナの正体は、Namespaceとcgroupです。これらを組み合わせて使用することで、隔離されたプロセス(アプリケーション)実行環境を作ることができます。
■ コンテナエンジンとは
Linux上でNamespaceとcgroupを管理することはかなり面倒です。それらを管理してくれるのがコンテナエンジンです。
コンテナエンジンはたくさんあるのですが、その中でもDockerが使われています。現在ではコンテナのデファクトスタンダードとなっています。
投稿のやる気につながるため、記事の内容が少しでも良いと思ったら、いいねやフォローしてくださいね。
なお、続きが気になる方は以下の書籍で全文を掲載しています。
[手を動かしながら学ぶDocker入門: たった1冊でDockerを完全マスター!]