「Windows Serverコンテナ」「Hyper-Vコンテナ」「Linuxコンテナ」「Docker」の違いとは?Tech TIPS

軽量なアプリケーション実行環境であるコンテナ機能がWindows OSでも使えるようになった。Windowsコンテナには2種類あるが、その違いは? Linuxコンテナとは何が違う?

» 2016年11月04日 05時00分 公開
[打越浩幸デジタルアドバンテージ]
「Tech TIPS」のインデックス

連載目次

対象OS:Windows Server 2016/Windows 10


 Windows Server 2016(およびWindows 10 Anniversary Update以降)では、Dockerのコンテナ技術を使った「Windowsコンテナ」機能が利用できるようになった。これはLinux+Dockerという組み合わせで広く使われているコンテナ型仮想化技術(以下「Linuxコンテナ」と呼ぶ)をベースにして、Windows OS上でも同じようなコンテナ機能を利用できるようにしたものである。

Windows Server 2016上で動作しているWindowsコンテナの例 Windows Server 2016上で動作しているWindowsコンテナの例
Windows OSでもコンテナが使えるようになった。仮想マシンを使うよりも簡単にアプリケーション実行環境を構築・展開できる。

 本TIPSでは、Windowsコンテナの概要や2種類のWindowsコンテナ、Linuxコンテナとの違いなどについてまとめておく。

●Windowsコンテナとは?

 Dockerとは、もともとはLinux OSの持つコンテナ機能やリソースの管理機能などをベースに作られた、コンテナ型の仮想化技術である。PC全体を仮想化する仮想マシン技術と比べると、軽量・高速で、実行に必要なリソースも少なくて済み、システムの構成変更や展開の容易さなどから、開発段階から実運用環境まで、幅広く利用されている。コンテナ上で動作するプログラムは、基本的にはLinuxのバイナリである 。

 Dockerの概要については、次の記事を参照していただきたい。

 Windowsコンテナは、このDockerのコンテナ技術をWindows Server 2016やWindows 10、Azure上などでも利用できるようにしたものである。ただしWindowsコンテナ中で動作するのはLinuxのプログラムではなく、Windows向けのプログラムである。.NET FrameworkやIIS、PowerShellなどの実行環境として利用することが想定されている。

 だがコンテナの管理ツール(Dockerのクライアントツール)はほぼ同じであり、LinuxコンテナでもWindowsコンテナでも同じように管理・展開できる。

 Windows Server 2016にWindowsコンテナの実行環境をインストールする方法については、次の記事を参照していただきたい。

●Windowsコンテナで利用できる2種類のコンテナ

 一言でWindowsコンテナといっても、実際には「Windows Serverコンテナ」と「Hyper-Vコンテナ」の2種類がある。主な違いは次の通りである。

項目 Windows Serverコンテナ Hyper-Vコンテナ
特長 軽量・高速 高い隔離性
コンテナの起動 速い(プロセスの起動だけでよいため) 遅い(仮想マシンの起動とコンテナOSのブートに時間がかかる)
コンテナの実行 ホストOS上のプロセスとして実行 Hyper-V上のゲストOS内のプロセスとして実行
隔離性 ・Hyper-Vコンテナよりも低い
・同じホスト上のコンテナは、同じ1つのホストOS下で実行される
・悪意のあるコンテナやOSに脆弱性があると、他のコンテナも影響を受ける可能性がある
・コンテナごとに仮想マシンとして隔離されるので、独立性は高い
・他のコンテナの影響を受けることはほぼない
ホストOSとコンテナOSの関係 同じバージョンにする必要がある。一致しない場合はコンテナを実行できない 異なるOSや異なるバージョン/パッチレベルでも構わない
■ホストOS
 Windows Server 2016
(フル/Server Core)
 Nano Server ○(コンテナ内のベースOSイメージもNano Serverベースのものにすること。Server Coreは不可)
 Windows 10 ×
2種類のWindowsコンテナ

 コンテナの詳細については、以下のページも参照していただきたい。

●ホストOS上のプロセスとして動作する「Windows Serverコンテナ」

 Windows Serverコンテナは、Linux上のDockerコンテナ(Linuxコンテナ)と同じような仕組みで動作するコンテナである。

 Windows Serverコンテナを起動すると、その中で動作しているプロセスは、実際にはホストのWindows OS上のプロセスとして実行されている(実行中のプロセスは、ホストOS上のタスクマネージャなどでも確認できる)。この方法では、Linuxコンテナと同様に、軽量・高速なコンテナの起動や展開、管理が期待できる。

Windows Serverコンテナのアーキテクチャ Windows Serverコンテナのアーキテクチャ
Windows Serverコンテナのプロセスは、ホストとなっているWindows OSから見ると、通常のユーザープロセスとほぼ同じで、ホストOSがその実行の制御やAPI呼び出しの処理などを担当する(そのためLinuxコンテナは実行できない)。コンテナの起動には仮想マシンの場合ほどコストはかからない。コンテナがアクセスできるリソースや権限などには制限がかけられているため、可能な操作には制約があるが、その分汎用性は高く、どのシステム上でも同じ処理を実現できる。DockerエンジンとDockerクライアントは、標準的なDocker APIで通信する。そのため、DockerクライアントはDockerのサーバアーキテクチャを問わず、同じように利用できる。

●仮想マシン上でコンテナを動作させる「Hyper-Vコンテナ」

 これに対してHyper-Vコンテナは、仮想マシン技術(Hyper-V)を使ったコンテナ技術である。Hyper-Vコンテナを起動するとHyper-Vのハイパーバイザ上に(コンテナ実行用の)新しい仮想マシンが作成され、その中で軽量なコンテナ用OS(Server CoreやNano Server)が起動して、さらにその上でコンテナが実行される。

Hyper-Vコンテナのアーキテクチャ Hyper-Vコンテナのアーキテクチャ
Hyper-Vコンテナは、Hyper-V上の仮想マシン内で実行される。これは通常の仮想マシンと同じような仕組みであるが、コンテナイメージ内にあるコンテナOSを実行させなければいけない分、オーバーヘッドがある。起動が遅くなるし、必要なリソースも多くなる。だが独立した仮想マシン上で隔離して実行されるため、他のコンテナの影響(脆弱性や悪意のあるアクセスなど)を受けず、安全性が高い。コンテナプロセスの発行するAPIは、仮想マシン内のコンテナOSによって処理されるため(各コンテナごとに独立したコンテナOSがある)、ホストOSのバージョンと合わせる必要はない。

 Hyper-V+仮想マシンという構成のため、起動には時間がかかるし、リソースも多く必要になる一方で、コンテナ(仮想マシン)ごとにリソースの割り当てや制御方法、セキュリティ設定などをある程度自由にカスタマイズできる。

 Hyper-Vコンテナの特長は、その高い独立性にある。例えばコンテナアプリに脆弱性があったとしても、他のコンテナが影響を受ける危険性は低くなる。またそれぞれのコンテナごとに異なるOSインスタンスを持つことができるので、機能をカスタマイズしたOSを利用したり、ホストOSとは異なるバージョンやエディションのOSを組み合わせたりすることも自由である。

 このHyper-Vコンテナは、特にクラウド上でコンテナを利用するようなケースで有用だ。たとえ「悪意のあるコンテナ」が同じシステム上に収容されていたとしても、その影響を受けにくくなるだろう。また顧客ごとに要求するコンテナOSのバージョンやパッチ適用レベルなどが異なることもあるだろうが、その場合でも利用できる。

●Windowsコンテナのイメージは共通

 Windows ServerコンテナもHyper-Vコンテナも、実行するコンテナイメージ自体は同じで、その起動方法が異なっているだけである。どちらのモードでコンテナを実行するのかは、「docker run」コマンドのオプションなどで変更できる。「docker run --isolation process」とするとWindows Serverコンテナとして、「docker run --isolation hyperv」とするとHyper-Vコンテナとして実行される(デフォルトはWindowsサーバーコンテナタイプ)。

●Windows ServerコンテナではホストOSとコンテナOSのバージョン違いに注意

 Windows Serverコンテナのイメージには、ベースとなるServer CoreやNano ServerのOSイメージが含まれている。Windows Serverコンテナを実行する場合、このイメージをホストOSのカーネルで実行するため、ベースとなっているOSイメージのバージョンと、WindowsコンテナホストのWindows OSのバージョン(正確にはビルド番号。例えば「10.0.14393.351」なら「14393」の部分)を一致させておく必要がある。以下のページの「コンテナー ホストのバージョンとコンテナー イメージのバージョンを一致させる」の項を参照のこと。

 Hyper-Vコンテナの場合は、Hyper-V仮想マシン内で独自にコンテナOSが実行されているため、ホストOSとバージョン(ビルド番号)を一致させる必要はない。

ホストOS Windows Serverコンテナ Hyper-Vコンテナ(ゲストOS)
Windows Server 2016 Server Core/Nano Server Server Core/Nano Server
Windows Server 2016 Core Server Core/Nano Server Server Core/Nano Server
Nano Server Nano Server Server Core/Nano Server
Windows 10 Pro/Enterprise ×(利用不可) Server Core/Nano Server
WindowsコンテナにおけるホストOSとコンテナOSの関係
Windows Serverコンテナを使う場合は、ベースOSがNano ServerならコンテナもNano Serverベースのコンテナが必要。そうでない場合は、もしくはHyper-Vコンテナの場合は、コンテナのベースとなるOSはServer CoreとNano ServerOSのどちらでもよい。

●Windowsのコンテナ機能ではLinuxコンテナは実行できない

 なおWindows OSのコンテナ機能を使って、Linuxコンテナを直接実行することはできない。WindowsコンテナはWindowsのプログラムしか実行できないからだ。逆も同じで、LinuxのDockerでWindowsコンテナを実行することはできない。

※アーキテクチャの違いによるエラーの例
C:\>docker pull hello-world  ……Linuxコンテナをダウンロードさせてみる
Using default tag: latest
latest: Pulling from library/hello-world

image operating system "linux" cannot be used on this platform  ……Linux向けのコンテナはエラーになる


C:\>



●Windows OS上でLinuxコンテナを実行するには?

 LinuxコンテナをWindows OS上で実行したければ、何らかの仮想マシン環境を用意してLinuxを動作させ、その上にDockerをインストールすればよい。

 例えばDocker社が提供している「Docker for Windows」を使えば、Windows 10のHyper-V上にLinuxコンテナ実行用の軽量OSとDocker環境がインストールされる。これでLinuxコンテナを実行できる。

Docker for WindowsによるLinuxコンテナ実行の仕組み Docker for WindowsによるLinuxコンテナ実行の仕組み
Windows 10上にDocker for Windowsをインストールすると、Linuxコンテナ実行用の軽量なLinux OSがHyper-V仮想マシンとして作成される。その上でLinuxコンテナが実行される。
現在のDocker for Windows(Beta 26以降のベータ版)では、前述のHyper-Vコンテナの実行機能と、このLinuxコンテナの実行機能を切り替えて利用できるようになっている。

 Docker for Windowsのインストールや利用方法については以下の記事を参照していただきたい。

「Tech TIPS」のインデックス

Tech TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。