🐳

Kubernetesを知る ~1.kubernetesの立ち位置~

2022/12/04に公開

概要

kubernetesはDockerなどツールで作成されたコンテナを管理するためのOSSです。
ですので、コンテナの意味やうまみを知らなければ、kubernetesを理解するのは難しいです。
ここではコンテナ・コンテナ化について記載します。

QUESTION

以下の質問や語句がわからない方向けの記事になります。

  1. Dockerって?コンテナって?違いは何?
  2. 仮想化じゃなくてコンテナ化のほうがいいの?
  3. 実際にコンテナ化って何するの?

APPROVED

コンテナとは

コンテナはコンテナエンジンの上で動作している、プロセスだったりアプリケーションだったりを指します。
広義ではコンテナ型仮想化のことを指している場合もあり、これは自分のPCのOS(これをホストOSと言います)上に、隔離された実行環境作成することを指します。

コンテナはこの隔離された実行環境であるコンテナエンジンの上で動作しています。

実行環境作成を行うソフトウェアはいくつか種類がありますが、本記事では基本的にDockerコンテナについて記載していきます。

ゲストOSを立てるハイパーバイザ型の仮想化とどう違うのかは、次の[コンテナエンジンとは]で記載していきます。

コンテナエンジンとは

仮想マシンでいうハイパーバイザのようなものです。

仮想マシンとコンテナエンジンとで、それぞれの仮想化の仕方について以下に記載してみます。

  1. 仮想マシンによる仮想化
    ハイパーバイザという仮想マシン作成ソフトウェアを用意し、そのハイパーバイザでOSを起動(これをゲストOSと言います)する

  2. コンテナエンジンによる仮想化
    DockerやLXCなど、コンテナエンジンを起動するためのソフトウェアを用意し、そのソフトウェアから起動したコンテナエンジン上でコンテナを起動する

簡潔に言うと、

  1. ホストOSで起動したハイパーバイザで起動したOSの上が仮想空間(仮想マシン)
  2. ホストOSで起動したコンテナエンジンの上が仮想空間(コンテナ)

という風な違いが言えます。

上記よりコンテナエンジンの場合、ゲストOSを利用せずホストOSを利用し仮想化を提供しています。
ですので、ハイパーバイザ型の仮想化と比べるとゲストOSの起動や、ゲストOSを動かすためのリソースがいらないため軽量で高速という特徴があります。

コンテナはホストosからはプロセスとして見えるらしいです。(気になる)

(余談)LXCについて

LXCはLinux Containerの略で、OSレベルのコンテナ化を実現するコンテナ化になります。
コンテナ化の利点を受けつつLinux OSを作成できるという利点を持ったソフトウェアになります。
あまり詳しく調べてないのですが、Linux OSの仮想マシンを複数台建てる場合は、このLXCを利用するのがよさそうです。

コンテナランタイムについて

実行環境を作成しているのがコンテナエンジンといことがわかりました。では実際のコンテナを作成しているのは誰でしょうか。それはコンテナランタイムになります。

コンテナランタイムとはコンテナを作成する窓口のようなもので、後述するDockerであればコンテナを作成してという命令があった場合、コンテナランタイムがDockerイメージをもとにその通りのコンテナを作成します。

下図はDockerの場合です。

実際の動作では上図の通りコンテナランタイムは高レベルコンテナランタイムと低レベルコンテナランタイムという役割が別れています。
簡単に以下にまとめました。

  • dockerd : コンテナー管理を行う常駐プロセス。コンテナランタイムとやりとりする
  • containerd : daemonとして常駐しているプロセス。dockerとやりとりし、低レベルコンテナランタイムにコンテナ作ってねとかの命令を出す
  • runc : 実際にコンテナを作るバイナリ

詳しくはまたどこかで。

Dockerについて

長くなりましたが、今回の主役であるDockerコンテナについて記載していきます。

Dockerとは

コンテナ型仮想化を提供するソフトウェアです。

すでにコンテナエンジンの説明の中に、

DockerやLXCなど、コンテナエンジンを起動するためのソフトウェア

と記載しました。
Dockerとはコンテナエンジンを起動する、つまりコンテナ型仮想化を提供するソフトウェアということがわかりました。

Dockerコンテナとは

Dockerにより作成されたコンテナエンジン上で動作しているプロセスのことを指しています。
このコンテナはDockerメージから作成され実行されます。

ここでいうプロセスはタスクマネージャーやアクティビティモニタなどで表示される"プロセス"です。
もっと具体的にいうとnginxやubuntu serverなどのOS、ミドルウェアだったりになります。
また単にOSやミドルウェアの定義がされているわけではなく、Dockerイメージの定義や中身のコードに従い起動オプションや開放するポートなど、カスタマイズすることができます。

Dockerイメージとは

作成するコンテナを定義したテキストファイルのこと、またそのイメージのことを指します。

このイメージはDockerHubというDockerイメージに特化したGit Hubのようなものにアップロードされているので、色々なDockerイメージを使うことができます。

従来のハイパーバイザ型の仮想化では、仮想マシンを立ち上げそこに様々ソフトウェアやミドルウェアをインストールしていましたが、DockerコンテナであればDockerイメージ一つで済みます。
これの何が良いのかというと、Dockerイメージはテキストファイルである点です。

  • GitHubなどでバージョン管理をしたり
  • 先ほど述べたDocuker Hubでユーザに共有したり
  • Docker HubからDockerイメージをpullして、複数台のPCに同じ条件で展開
    できたりするわけです。(この概念をInfrastructure as Codeと言います。)

Dockerイメージの記法についてはまた別途取り上げたいと思います。

ハイパーバイザ型・コンテナの比較

コンテナエンジンは、仮想化のハイパーバイザに相当します。
上で述べた通り違いはありますがどちらがいいのか、相対評価でまとめてみました。

  • コンテナ化(Docker)
    • メリット
      • Infrastructure as Codeである
      • ゲストOSがない分、軽量で高速
    • デメリット
      • コンテナのプロセスはホストOSに依存する
  • ハイパーバイザ型仮想化
    • メリット
      • あくまで普通のOSなのでカスタマイズ性が高い
      • ホストOSに依存しない(ゲストOSとして別のOSを選べるため)
    • デメリット
      • ゲストOS分のリソース消費が存在する
      • ゲストOSのOS起動が必要

今後こちらも業務・勉強を通してアップデートしていけたらと思います。

まとめ

コンテナとはコンテナ型仮想化で使われる隔離空間の単位、または起動しているコンテナの内容だったりを指しています。
その中でDockerはコンテナ型仮想化を実現する機能を提供するソフトウェアで、Dockerで作ったコンテナはDockerコンテナといいます。DockerコンテナはDockerイメージというコンテナの中身を定義したファイルをもとに作成されます。

コンテナ型仮想化とハイパーバイザ型仮想化の違いは、簡単に言うとホストOSを使っているかどうかで、コンテナ型仮想化はホストOS上で仮想化を実現するため、軽量になります。。

(VMとコンテナを合わせた考えもあるらしいが、、)

参考

https://aws.amazon.com/jp/builders-flash/202108/create-container-image/?awsf.filter-name=*all
https://www.publickey1.jp/blog/20/firecrackergvisorunikernel_container_runtime_meetup_2.html
https://www.designet.co.jp/faq/term/?id=Y29udGFpbmVyZA
https://knowledge.sakura.ad.jp/2108/

Discussion