連載
» 2017年02月02日 05時00分 UPDATE

超入門Docker:最終回 Windowsプログラムを実行するWindowsコンテナ

Dockerの概要を知るための超入門連載の最終回。Windowsコンテナを使えば、Windowsプログラムもコンテナとして実行できるようになる。

[打越浩幸,デジタルアドバンテージ]
「超入門Docker」のインデックス

連載目次

本入門連載では、システム管理者やシステムエンジニアの方々を主な対象として、IT業界でよく使われる技術や概念、サービスなどの解説をコンパクトにまとめておく。



 Dockerは、もともとはLinuxのコンテナ(Linux向けのプログラム)を実行するための環境であった。それをベースにして、Windowsアプリケーション(Win32やWin64、.NET Frameworkプログラムなど)の実行用環境として実装されたコンテナ技術が「Windowsコンテナ」機能である。これはWindows Server 2016(およびWindows 10 Anniversary Update以降)で利用可能となっている。

Windowsコンテナの実行例 Windowsコンテナの実行例
Windows Server Coreのコンテナを実行しているところ(Docker for WindowsのKitematicツールでコンソールをモニタしている)。コンテナの管理にはdockerコマンドを使うが、コンテナ内で動作しているのはCUIのWindows Server CoreやNano Serverである。

Windowsコンテナとは?

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

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

Windows ServerコンテナとHyper-Vコンテナの2種類があるWindowsコンテナ

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

項目 Windows Serverコンテナ Hyper-Vコンテナ (参考)Linuxコンテナ
特長 軽量・高速 高い隔離性 軽量・高速
コンテナの実行形態 ホストOS上のプロセスとして実行される。技術的にはLinuxコンテナに近い Hyper-V上のゲストOS内のプロセスとして実行。通常のハイパーバイザ型の仮想マシンとほぼ同じ ホストOS上の1プロセスとして実行される
コンテナOS Windows Nano Server/Server Core Windows Nano Server/Server Core Linux
コンテナの起動 速い(プロセスの起動だけでよいため) 速くない(仮想マシンの起動とコンテナOSのブートに時間がかかる) 速い(プロセスの起動だけでよいため)
隔離性 ・Hyper-Vコンテナよりも低い
・同じホスト上のコンテナは、同じ1つのホストOS下で実行される
・悪意のあるコンテナが紛れ込んだりOSに脆弱(ぜいじゃく)性があったりすると、他のコンテナも影響を受ける可能性がある
・コンテナごとに仮想マシンとして隔離されるので、独立性は高い
・他のコンテナの影響を受けることはほぼない
・Windows Serverコンテナと同等
2種類のWindowsコンテナとその違い

 以下の記事も参照のこと。

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

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

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

Windows Serverコンテナのアーキテクチャ Windows Serverコンテナのアーキテクチャ
Windows Serverコンテナのプロセスは、ホストとなっているWindows OSから見ると、通常のユーザープロセスとほぼ同じで、ホストOSがその実行の制御やAPI呼び出しの処理などを担当する(そのためコンテナOSイメージのバージョンは、ホストOSのバージョンと同じにする必要がある)。コンテナの起動には仮想マシンの場合ほどコストは掛からない。コンテナがアクセスできるリソースや権限などには制限が掛けられている。

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

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

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

 Windowsコンテナを利用するには現在のところ、Windows Server 2016かWindows 10(Anniversary Update以降)が必要となる。インストール方法については以下の記事を参照していただきたい。

 Windows 10の場合は、第2回で紹介したDocker for Windowsをインストールしておくと、LinuxコンテナモードとWindowsコンテナモードを切り替えて利用できるようになる(両方同時には使えない)。

Windowsコンテナの実行

 Windowsコンテナであっても、コンテナの管理にはdocker.exeコマンドが利用できる。その機能や使い方はLinux版のdockerコマンドとほとんど同じだ。ただし、実行できるイメージはWindows OSベースのものだけに限られているし、ファイルシステムへのアクセスはWindows方式のパス名指定(例えばc:/usr/〜ではなく、C:\User〜など)を使う必要がある。また利用できるコマンドもPowerShellかコマンドプロンプトのものに限られる。

※Dockerのサーバとクライアントのバージョンを調べる
docker version
※Dockerのインストール状態などを調べる
docker info
※Windowsコンテナのイメージを検索する例
docker search microsoft
※Windowsコンテナのイメージをダウンロードする
docker pull microsoft/nanoserver
※イメージを確認する
docker images
※Nano ServerをWindowsコンテナで起動して、コマンドプロンプトを開く
docker run -it microsoft/nanoserver cmd
※デフォルトのWindowsコンテナではなく、Hyper-Vコンテナとして実行してみる
docker run --isolation hyperv -it microsoft/nanoserver cmd
※プロセスの状態を調べる
docker ps -a



 実行すると次のようになる。

C:\>docker version …Dockerバージョンの管理
Client:
 Version:      1.13.1-rc1
 API version:  1.25
 Go version:   go1.7.4
 Git commit:   2527cfc
 Built:        Sat Jan 28 00:43:00 2017
 OS/Arch:      windows/amd64 …クライアントアーキテクチャはWindows版

Server:
 Version:      1.13.1-rc1
 API version:  1.25 (minimum version 1.24)
 Go version:   go1.7.4
 Git commit:   2527cfc
 Built:        Sat Jan 28 00:43:00 2017
 OS/Arch:      windows/amd64 …コンテナアーキテクチャもWindows版
 Experimental: true

C:\>docker search microsoft …「microsoft」関連のコンテナを検索してみる
NAME                         DESCRIPTION                                    STARS  OFFICIAL  AUTOMATED
microsoft/aspnet             ASP.NET is an open source server-side Web ...  549              [OK]
microsoft/dotnet             Official images for .NET Core for Linux an...  426              [OK]
mono                         Mono is an open source implementation of M...  216    [OK]
microsoft/mssql-server-linux Official images for Microsoft SQL Server o...  146
microsoft/nanoserver         Windows Server 2016 Nano Server base OS im...  118 …Nano Serverコンテナ
microsoft/windowsservercore  Windows Server 2016 Server Core base OS im...  113 …Windows Server Coreコンテナ
microsoft/aspnetcore         Official images for running compiled ASP.N...  85               [OK]
microsoft/iis                Internet Information Services (IIS) instal...  82
…(中略)…

C:\>docker pull microsoft/nanoserver
Using default tag: latest
latest: Pulling from microsoft/nanoserver
Digest: sha256:03fac8366a7d5b2b2e596a3c86401e55796ce705ed5d472ae8d794c6ecf2e9ca
Status: Image is up to date for microsoft/nanoserver:latest

C:\>docker pull microsoft/windowsservercore …Windows Server Coreコンテナをロードする
Using default tag: latest
latest: Pulling from microsoft/windowsservercore …Nano Serverコンテナをロードする
Digest: sha256:34a0199e1f8c4c978d08e5a4e67af961752e41212b7bde9c1ea570ee29dcff2c
Status: Image is up to date for microsoft/windowsservercore:latest

C:\>docker images …コンテナイメージのサイズを確認してみる
REPOSITORY                   TAG     IMAGE ID      CREATED      SIZE
microsoft/windowsservercore  latest  4d83c32ad497  3 weeks ago  9.56 GB …Server Coreはなんと9.6GBものサイズがある。コンテナだからといって、Windowsコンテナはあまり軽くない
microsoft/nanoserver         latest  d9bccb9d4cac  3 weeks ago  925 MB …Nano Serverコンテナでも1GB近いサイズになっている

C:\>
C:\>docker run -it microsoft/nanoserver cmd …Nano Serverコンテナ(Nano Serverの基本イメージのみが入っているコンテナ)を起動してみる
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.

C:\>ver …コンテナOSバージョンの確認

Microsoft Windows [Version 10.0.14393]

C:\>dir …コンテナ内のOSイメージのファイルの確認
 Volume in drive C has no label. …コンテナOSは基本的には英語版Windowsになっている
 Volume Serial Number is 7ED1-177D

 Directory of C:\ …含まれているファイルは必要最小限のみ

11/20/2016  08:32 PM           1,894 License.txt
07/16/2016  09:20 PM    <DIR>        Program Files
07/16/2016  09:09 PM    <DIR>        Program Files (x86)
01/09/2017  05:48 AM    <DIR>        Users
02/01/2017  06:00 PM    <DIR>        Windows
            1 File(s)        1,894 bytes
            4 Dir(s)  21,205,856,256 bytes free

C:\>powershell get-process …Windowsコンテナ内のプロセス一覧を確認してみる

Handles NPM(K)  PM(K)   WS(K)   CPU(s)    Id  SI ProcessName
------- ------  -----   -----   ------    --  -- -----------
      0      5   1048    4452     0.03  1388   1 CExecSvc …Linuxコンテナと違って、Windowsコンテナ内ではこんなにも多くのプロセスが動作している。そのため、必要なメモリやディスク、CPUなどのリソースはLinuxコンテナよりも多めである
      0      4   4696    2888     0.00  1552   1 cmd
      0      6    688    1892     0.30   876   1 csrss
      0      0      0       4              0   0 Idle
      0     19   3888   11160     0.41   964   1 lsass
      0     36  42352   65588     3.31  1660   1 powershell
      0      9   2000    5412     0.16   944   1 services
      0      3    340    1148     0.09   856   0 smss
      0      9   2148    6044     0.13   292   1 svchost
      0      6   1672    5924     0.08   436   1 svchost
      0     13   1676    6108     0.06   516   1 svchost
      0      8   1496    5864     0.06  1048   1 svchost
      0     14   5936    10256    0.13  1120   1 svchost
      0     11   2716    9208     0.17  1164   1 svchost
      0      9   2088    6532     0.03  1200   1 svchost
      0     29   5496   14152     0.63  1240   1 svchost
      0     17   4116   12656     0.41  1368   1 svchost
      0      0    128     100     1.36     4   0 System
      0      8   1204    4016     0.06   920   1 wininit  …wininitはWindows OSの初期化用プロセス。コンテナ内では、Windows OSにおけるユーザーセッション(を構成するプロセス群)がほぼそのまま動作している

C:\>exit

C:\>docker pull bash …Linuxコンテナをダウンロードしようとすると、……
Using default tag: latest
latest: Pulling from library/bash
image operating system "linux" cannot be used on this platform …アーキテクチャが違うので失敗する。Windows向けコンテナしか実行できない

C:\>




 今回はWindowsコンテナの概要について見てきた。コンテナ技術を使ったアプリケーションの開発やテスト、さらには実運用環境での利用などはLinuxベースのシステムではすでに広く普及している。今後はWindowsベースのシステムでも普及が見込まれる。

「超入門Docker」のインデックス

超入門Docker

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

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

メールマガジン登録

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