最終回 Windowsプログラムを実行するWindowsコンテナ:超入門Docker
Dockerの概要を知るための超入門連載の最終回。Windowsコンテナを使えば、Windowsプログラムもコンテナとして実行できるようになる。
本入門連載では、システム管理者やシステムエンジニアの方々を主な対象として、IT業界でよく使われる技術や概念、サービスなどの解説をコンパクトにまとめておく。
- 第1回「Dockerとは」
- 第2回「Dockerを使ってみる」
- 第3回「Dockerコマンドの使い方」
- 第4回「Windowsプログラムを実行するWindowsコンテナ」(最終回)
Dockerは、もともとはLinuxのコンテナ(Linux向けのプログラム)を実行するための環境であった。それをベースにして、Windowsアプリケーション(Win32やWin64、.NET Frameworkプログラムなど)の実行用環境として実装されたコンテナ技術が「Windowsコンテナ」機能である。これはWindows Server 2016(およびWindows 10 Anniversary Update以降)で利用可能となっている。
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 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上の仮想マシン内で実行される。これは通常の仮想マシンと同じような仕組みであるが、コンテナイメージ内にあるコンテナ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ベースのシステムでも普及が見込まれる。
Copyright© Digital Advantage Corp. All Rights Reserved.