見出し画像

仮想化とコンテナ

はじめに

ハローワールド!マイクです。
 コンテナって聞いたことありますでしょうか?少し使ってみて便利な道具だと思いましたので、コンテナについて少しまとめてみました。何かの参考になれば嬉しいです。

仮想化・仮想化技術とは何でしょうか?コンテナとの関係はなんでしょうか?

 仮想化という言葉は計算機が非常に高価だった1960年代頃からある言葉らいしいです。効率的に資源(メモリ、CPU、外部記憶など)を使う事で多くの人達が使えるようにするための工夫だったのだと思います。コストを抑える事ができれば、より多くの人達が使えるようになりますよね。例えば、仮想メモリを使うことで物理メモリの容量を超えたメモリ空間を利用したり、メインフレームにワークステーションを接続することで複数の人が別々にメインフレームを利用したり。
 1970年代にパーソナルコンピュータの登場で低価格なコンピュータが登場しました。個人でも購入しやすくなりました。この時期からユーザの増加と多様化が徐々に始まったと思います。1980年代にはワードプロセッサや表計算ソフトウェアの登場、1990年代にはインターネットへの接続でコンピュータを使う人は、増加・多様化し今に至ります。Windows95を秋葉原で買い求める人の列をニュースで流していたのは今でも覚えています。
 では、コンテナと関係ありそうな仮想化はいつ頃に登場したのでしょうか。仮想化をサポートするハードウェアは2005年にインテル、2006年にAMDから登場しています。(参考1、参考2)そして一つのハードウェア上で別々のオペレーションシステム(OS)を動作させる技術(OSの仮想化)が登場します。2021年現在入手可能な例としてOracle VirtualBox(参考3)、VMware Workstation Player(参考4)、Parallels Desktop(参考5)、citrix XenServer(参考6)、Microsoft Hyper-V(参考7)などがあります。
 また、同じアプリケーションを汎用的に別なOSでも動作させる技術(アプリケーションの仮想化)が1990年半ばから2000年頃にかけて登場します。プログラミング言語のJavaを実行させるためのJavaVM、同じくプログライング言語のC#を実行させるための.NET Framework(ドットネットフレームワーク)が例としてあります。
 そして、コンテナは任意のアプリケーションを一つのOSで動作させる技術です。例としてDockerがあります。(他にもあるようですが未だ使ってみたことがありません。また別の機会にでも紹介できればと思っています。)
 コンテナの中でOSだけ仮想化できますが、コンテナで有名なDockerの公式ドキュメント(参考8)には以下の記述があります。

Docker is an open platform for developing, shipping, and running applications.

Docker overview :https://docs.docker.com/get-started/overview/ より引用

Docker provides the ability to package and run an application in a loosely isolated environment called a container. The isolation and security allow you to run many containers simultaneously on a given host.

Docker overview :https://docs.docker.com/get-started/overview/ より引用

この記述をザックリ翻訳すると、

Dockerはアプリケーションを開発、配布、実行するためのオープンなプラットフォームです。Dockerはアプリケーションをパッケージ化し依存関係の少ない独立したコンテナという環境に纏める事ができます。独立したセキュリティの高い複数のコンテナを任意のホスト上で継続して実行する事ができます。

OSをコンテナに入れることができますが、アプリケーションの実行が主な目的のようです。
 Windowsコンテナの中ではWindowsとそのアプリケーションを実行することは出来ますが、Linuxとそのアプリケーションは実行することはできません。LinuxコンテナではWindowsとそのアプリケーションを実行することはできませんが、Linuxとそのアプリケーションは実行することができます。
ん?なに?あまりメリットがなさそうに聞こえますかね?

Hypervisorとコンテナの違いは?

 仮想化技術を使ってアプリケーションを実行する方法として、大きく2つの種類があると思います。一つはHypervisorを使う方法と、コンテナを使う方法です。
 HypervisorはType1とType2に分けることができます。Type1の例としては、citrix XenServerやMicrosoft Hyper-Vなどがあります。Type2の例としては、Oracle VirtualBoxやVMware Workstation Playerなどがあります。Type1とType2の違いはOSと一体化しているか別々に動いているかです。図にするとこんな感じでしょうか。

Type1 Hypervisor
Type2 Hypervisor

 Type1、Type2どちらも独立したOSがHypervisorの上で動いていることがわかると思います。一つのハードウェアの上で2つ以上の独立したOSを動かすリソースが必要そうですね。一つのハードウェアの上で2つ以上のOSが動いている点がコンテナとの大きな違いだと思います。

 次にコンテナを使う方法を見てみましょう。図にするとこんな感じでしょうか。

コンテナ

ここで注目して頂きたいのは、ハードウェア上でOSが一つしか動いてない点です。では、アプリケーションはOS無しで動くのか?と疑問に思われるかもしれませんが、そうではなくコンテナエンジンとコンテナに秘密があります。実は、アプリケーションを実行するときにOS(ホスト)のカーネルを使っているんですね。(カーネルとはOSの基本機能のことです。)少し乱暴な言い方かもしれませんが、図にある3つのアプリケーションはOS(ホスト)の上で動いています。こういった理由から、Windowsコンテナ、Linuxコンテナの上ではそれぞれに対応するアプリケーションしか実行することができないのです。近い将来、こういった垣根もなるなると面白いと思います。コンテナエンジンがOS(ホスト)を効率よく使うので、Hyperviserよりも軽量だと言われています。tagというもので効率的に管理する事で軽量化しているみたいですが、この説明は次回にでも。

最後に

 Hyperviserもコンテナもどちらも長所と短所があると思います。私の場合ですがウェブ上で動くアプリケーションで柔軟な運用が必要な場合はコンテナを、設定にGUIを使いたい場合はHyperviserを選びます。この選び方で本当に良いのか、ちょっとわかりませんが。笑
 最後まで読んで頂きありがとうございました。

参考

  1. Intelがプロセッサに組み込む仮想化技術、その可能性は?(ITmediaエンタープライズ)

  2. 仮想化技術に見るインテルとAMDの個性(ITmediaPCUSER)

  3. OracleVMVirtualBox

  4. VMware Workstation Player

  5. ParallelsDesktop

  6. citrix XenServer

  7. Windows 10のHyper-Vの概要

  8. docker docs

この記事が気に入ったらサポートをしてみませんか?