GIG

赴くままに技術を。

Windows コンテナ

Windows コンテナとは

Windows Server 2016よりサポートされたWindowsコンテナ、Linuxコンテナはまずまず不自由なく使うぐらいは触っているけど、 いまいち利用用途など見いだせず、敬遠し続けていた。

ということで、入門してみます。

2つの分離モード

Linuxと異なる点として、「プロセス分離」、「Hyper-V分離」の2つがある点が挙げられます。 前者は、Linuxコンテナと同様に、ホストのカーネルは共有する形態で、後者はホスト上に軽量の仮想マシンを挟み、その上でコンテナを動かす形態。

後者のメリットは、動作するWindowsコンテナのバージョンがホストOSのバージョンに制約されないことと、 Linuxコンテナ(いわゆる Linux Container on Windows, LCOW)もこれにより実現。

デフォルトは、プロセス分離

PS> docker info
 ...
 Default Isolation: process
 ...

環境構築

IIS をデプロイして確認してみる

使う Dockerfileはこちら。

gist41fe3ca2d129c29074aa68d939bb94e6

ポイントは、 * エスケープ文字がデフォルトではバッククォートであるため、 escape で変更 (Windowsの場合、バッククォートでディレクトリを分けるため) * LogMonitorにより、ETW形式のログを標準出力に出すように設定 * ServiceMonitorを用いて、IISをサービスとして管理

PS>docker build -t iis:v1 https://gist.githubusercontent.com/yuriwoof/41fe3ca2d129c29074aa68d939bb94e6/raw/3db06040b7acc9ad940a3d60c9ea3b4d062befb0/Dockerfile.iis
PS>docker run -d -p 8000:80 --name iis iis:v1

f:id:hermesian:20201103223157p:plain
iis

IISアクセスログも見れる

PS> docker logs -f iis
<Source>EtwEvent</Source><Time>2020-11-03T13:31:33.000Z</Time><Provider idGuid="{7E8AD27F-B271-4EA2-A783-A47BDE29143B}"/><DecodingSource>DecodingSourceXMLFile</DecodingSource><Execution ProcessID="8480" ThreadID="9152" /><Level>Information</Level><Keyword>0x8000000000000000</Keyword><EventID Qualifiers="6200">6200</EventID><EventData><EnabledFieldsFlags>2478079</EnabledFieldsFlags><date>2020-11-03</date><time>13:31:30</time><c-ip>172.16.3.4</c-ip><cs-username>-</cs-username><s-sitename>W3SVC1</s-sitename><s-computername>34c7189aaf3d</s-computername><s-ip>172.18.242.44</s-ip><cs-method>GET</cs-method><cs-uri-stem>/iisstart.png</cs-uri-stem><cs-uri-query>-</cs-uri-query><sc-status>304</sc-status><sc-win32-status>0</sc-win32-status><sc-bytes>143</sc-bytes><cs-bytes>530</cs-bytes><time-taken>2</time-taken><s-port>80</s-port><csUser-Agent>Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/86.0.4240.183+Safari/537.36</csUser-Agent><csCookie>-</csCookie><csReferer>http://localhost:8000/</csReferer><cs-version>-</cs-version><cs-host>-</cs-host><sc-substatus>0</sc-substatus><CustomFields></CustomFields></EventData>