Windowsコンテナについて調べてみた

このエントリは [赤帽エンジニア Advent Calendar 2019 - Qiita](https://qiita.com/advent-calendar/2019/rh_engineers)の2日目の投稿です。

Windowsのコンテナを中心とした技術の現在の状況について調べてみました。
技術自体は日々変わるので、2019年12月現在のスナップショットとして読み進めください。

----

# 用語
- Windowsコンテナ：
Windowsでコンテナを動かすことの概念、総称のようなもの。バズワード的な印象。
- Windows Serverコンテナ：
プロセス分離を用いてWindowsのベースイメージを実行すること。
- Hyper-vコンテナ：
正しくはHyper-V分離。Hyper-Vの機能で仮想マシンの内部でコンテナが実行される。Linuxコンテナを実行可能。
- プロセス分離（Process Isolation）：
Linuxのコンテナ実行方法とほぼ同じ。カーネルをホストと共有する。
- Hyper-V分離（Hyper-V Isolation）：
各コンテナーは仮想マシンの内部で実行され、独自のカーネルを利用する。
- WCOW：Windows containers on Windows.
- LCOW：Linux containers on Windows.

 
# Windows版Dockerの導入
### Windows 10Pro/Enterprise Edition
- Docker Desktop Community（Docker CE）を利用
- インストーラーをダウンロードしてインストール
 - [Docker Desktop for Mac and Windows | Docker](https://www.docker.com/products/docker-desktop)
- Hyper-V分離を使い、Linuxコンテナを実行可能
- Windows 10 ver.1809 + Docker Desktop 2.0.0.2（Docker Engine 18.09.1）以降では、プロセス分離でWindows Serverコンテナを実行可能

### Windows Server
- PowerShellでDocker Enterprise（Docker EE）インストール
 - [PowerShell Gallery | DockerMsftProvider 1.0.0.8]
(https://www.powershellgallery.com/packages/DockerMsftProvider/1.0.0.8)
- Hyper-V分離を使い、Linuxコンテナを実行可能
- プロセス分離でWindows Serverコンテナを実行可能

# コンテナベースイメージ
4種類ある

- Windows Server Core：Supports traditional .NET framework applications.
- Nano Server：Built for .NET Core applications.
- Windows：Provides the full Windows API set.
- Windows IoT Core：Purpose-built for IoT applications.

# 課題
- ベースイメージのサイズが大きい
- Windows Serverのリリースサイクル
 - 半期チャネル（SAC）のサービス期間が18ヶ月
- ベースイメージの前方互換サポート無し


# Kubernetes on Windows
- LinuxベースのK8sクラスターに、Windows Server（version 1809以降）をワーカーノードとして追加
- K8s 1.14で正式サポート。
 - Supported for Windows Server containers Builds 17763.* with Docker EE-basic 18.09
- プロセス分離のみサポート。Hyper-V分離は将来のリリースに計画。


# コンテナランタイム（調査中）
- CRIランタイム
 - docker EEのみ
- OCIランタイム
 - runhcs：runcのフォーク。Host Compute Serviceと通信。


# まとめ

Windowsコンテナと一言で言っても用語が統一されていなかったり、利用者の背景（Linuxコンテナなのか、Windows Serverなのか、K8sに関することなのか）によっても情報の意味することがバラバラだということが分かりました。
技術が枯れてくるまでは、相手が今何のことを指して言っているのか確認するのが良いと思います。

Red HatではOpenShift 4.xの今後のロードマップでWindowsワーカーノードのサポートが予定されています。リリースされるまでにもう少し情報を整理していきたいと思います。



# 参考リンク
- [Containers on Windows Documentation | Microsoft Docs](https://docs.microsoft.com/en-us/virtualization/windowscontainers/)
 マイクロソフト公式のドキュメント。ここに一番情報が集まってる。

- [About Windows containers | Microsoft Docs]
(https://docs.microsoft.com/en-us/virtualization/windowscontainers/about/index)
Windowsコンテナの概要

- [Isolation Modes | Microsoft Docs]
(https://docs.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/hyperv-container)
分離モードの解説

- [Windows container platform | Microsoft Docs]
(https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/containerd)
アーキテクチャー解説

- [Windows Server, version 1909が正式リリース――「プロセス分離モード」の制限が緩和：Microsoft Azure最新機能フォローアップ（94） - ＠IT]
(https://www.atmarkit.co.jp/ait/articles/1911/19/news004.html)
日本語の最近のニュース記事

- [Kubernetes on Windows | Microsoft Docs]
(https://docs.microsoft.com/en-us/virtualization/windowscontainers/kubernetes/getting-started-kubernetes-windows)
マイクロソフト公式のK8sに関するドキュメント

- [Intro to Windows support in Kubernetes - Kubernetes]
(https://kubernetes.io/docs/setup/production-environment/windows/intro-windows-in-kubernetes/)
K8s公式のWindowsサポートに関するドキュメント

- [Essentials of container]
(https://www.slideshare.net/ToruMakabe/essentials-of-container)
MS真壁さんのスライド。分かりやすくまとまっている。