Windows上でDockerコンテナを動かす! その歴史 #docker #windows #linux #lcow #wcow #wsl2
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
Windows上でDockerコンテナを動かす……一言で言うと簡単ですが、その経緯や仕組みについては多岐にわたり、全容を把握することがかなり難しくなっています。まず、
- Windows上で Windows用 のDockerコンテナを動かす
- Windows上で Linux用 のDockerコンテナを動かす
と大きく分けて2つあります。また Windows用コンテナ と Windows用Dockerコンテナ では意味が異なり、さらにWindows上でLinux用Dockerデーモンを動かす場合にも、
- VirtualBoxなどサードパーティの仮想化システムを使用
- WindowsネイティブのHyper-V仮想化システムを使用
- 一言で「Hyper-V」と言ってもいくつか意味があるのでややこしい
- WindowsネイティブのWindows Subsystem for Linuxを使用
- アーキテクチャが異なるバージョン1と2がある
と、さまざまな用語や要素が絡み合い、非常に理解が困難な世界となっています。
本稿では「Windows上でDockerコンテナを動作させる」ことについて、2015年8月から2019年7月までの歴史をかいつまんで見ていきます。
なお、筆者はあまりWindowsに詳しくなく、「Windows上で動いてるDockerコンテナって何だろう?」という疑問から「まず歴史をたどってみよう」と思い立って調べた内容となります。そのため、一般的でない用語や間違いが含まれている場合があります。ご指摘などは弊社公式ツイッターアカウントにお寄せください。可能な限り早く反映させていただきます。
2015年8月12日: Docker Toolbox
まず始めに登場したのが Docker Toolbox です。
これはWindowsに VirtualBox をインストールし、Linux仮想マシンを起動し、その中にLinux用Dockerデーモンをインストールし、そのDocker環境をWindows用Dockerクライアントで操作するというものです。
少々脱線しますが簡単に補足しておくと、Dockerはクライアント・サーバ型のアーキテクチャで動作しています。LinuxにDockerをインストールした場合、Linux用Dockerコマンド(クライアント)とLinux用Dockerデーモン(サーバ)の両方が同一マシン上にインストールされています。実はコマンドラインで動作する「dockerコマンド」は単に指令を出しているに過ぎず、その指令を受け取った「dockerデーモン」が実際にDockerコンテナを起動したり、Dockerイメージを作成したりしています。
すなわち、このDocker Toolboxでは、Windows用Dockerクライアントで、Linux仮想マシン上のLinux用Dockerサーバに「 Linux用Dockerコンテナ 」を動作させるものということになります。Docker Toolboxを使わなくても何らかの方法でWindows上にLinux仮想マシンを起動し、その中にLinux用Dockerをインストールして利用する場合と技術的な違いはありません。強いて言えばクライアントがWindows用かLinux用かという程度です。
一言ポイント: Docker ToolboxはLinux用Dockerコンテナを動作させるもので、Windows用Dockerコンテナは動作できない。
なお、Docker Toolboxは2021年6月現在ダウンロードが可能ですが、2020年7月にサポートと開発が終了しています
2015年8月19日: Windows Server Containers
次に登場したのは Windows Server 2016 Technical Preview 3 に搭載された「Windows Server Containers」です。
これは「プロセス分離モード」と呼ばれる手法を用いています。Linux用Dockerと同じく、ホストOSのカーネル機能によるプロセスやネームスペースなどの隔離技術によってアプリケーションの隔離、すなわち「Windows用コンテナ」を実現するものです。
そして、Microsoft社はDocker社とパートナー契約を結び、この「Windows用コンテナ」をDockerクライアントから管理できる仕組みを合わせて実装しました。
つまり、Windows用Dockerクライアントを使い、Windows用Dockerサーバに対して指令を出し、「Windows用コンテナ」を「 Windows用Dockerコンテナ 」として操作することができます。
一方、Windows Server Containersでは「Linux用Dockerコンテナ」を動作させることはできません。これは「Linux用Docker」で「Windows用コンテナ」を動作できないことと同じです。どちらのコンテナもホストOSのカーネル機能を利用しているためです。
一言ポイント: Windows Server ContainersはWindows用Dockerコンテナを動作させることは可能だが、Linux用Dockerコンテナを動作させることはできない。
参考:
2015年11月19日: Hyper-V Containers
前節のTechnical Preview 3から1つ進んだTechnical Preview 4では、Windows Server Containersの他に「Hyper-V Containers」が実装されました。これは「Hyper-V分離モード」や「Hyper-V Isolation」と呼ばれる隔離技術を利用しています。Windows組み込みの仮想化機能であるHyper-Vで軽量なWindows仮想マシンを作成し、その中でWindows用コンテナを動作させる仕組みです。
すなわち、仮想マシン上のゲストOS内でコンテナが動作するため、ホストOS上でプロセス分離によるコンテナであるWindows Server Containersに比べて隔離の度合いがより強固になっていると言えます。その代償として仮想マシンを利用しているため、メモリを多く必要とします。
なお、Windows用Dockerクライアントでコンテナを操作できることと、やはりWindows用Dockerコンテナのみが動作可能であることはWindows Server Containersと同様です。
両者をまとめて「Windows Container On Windows (WCOW)」とも呼ばれますが、コンテナを実現するための手法が異なるため、やや混乱を招く呼び方だと思います。
一言ポイント: Hyper-V ContainersはWindows用Dockerコンテナを動作させることは可能だが、Linux用Dockerコンテナを動作させることはできない(注:Hyper-V Containers登場当時)
2016年3月24日: Docker for Windows 1.12.0
Docker 3周年記念として発表されたDocker for Windows ベータ版ではDocker Toolboxと同様、 Linux仮想マシンを起動し、Linux用Dockerデーモンをインストールし、それをWindows用Dockerクライアントで操作するものです。Docker Toolboxと異なる点は、Windows組み込みの仮想化機能であるHyper-Vを用いてLinux仮想マシンを起動しているので、VirtualBoxが必要なくなっています。
およそ半年後の2016年7月28日に正式リリースとなりました。なお、ベータ版と変わらずLinux用Dockerコンテナ専用です。
一言ポイント: Docker for WindowsはLinux用Dockerコンテナを動作させるもので、Windows用Dockerコンテナを動作できない(注:Docker for Windows登場当時)
参考:
2016年8月2日: Windows Subsystem for Linux
Windows 10 バージョン1607に搭載されたWindows Subsystem for Linux (以下WSL 1と呼称)は、Linuxカーネル互換インターフェイスです。WSL 1はLinuxカーネルを含まず、Linux仮想マシンでもありません。Windowsカーネルで動作しており、必要に応じてLinuxカーネルの機能をエミュレーションし、一部とはいえLinuxバイナリをそのまま実行できるようになっています。
その一部の中にはLinux用Dockerも含まれており、WSL 1にLinux用Dockerをインストールすることで、完全な形ではありませんがWSL 1でLinux用Dockerコンテナを動作させることができます。なお、あくまでLinux用Dockerであるため、Windows用Dockerコンテナを動作させることはできません。
一言ポイント: WSL 1では不完全ながらLinux用Dockerコンテナを動作できる。一方でWindows用Dockerコンテナは動作不可。
2016年9月26日: Windows Server 2016
2016年9月26日に開催されたMicrosoft Ignite 2016で評価版の提供が開始され、2016年10月1日に一般提供が開始されたWindows Server 2016は、前述のWindows Server Containers(プロセス分離によるコンテナ)とHyper-V Containers(Hyper-V分離によるコンテナ)の両方のWindows用Dockerコンテナの実行をサポートし、さらに商用サポートつきのWindows用Dockerを追加料金なしで搭載しました。
一言ポイント: Windows Server 2016は商用サポートつきWindows用Dockerを同梱し、Windows Server ContainersとHyper-V Containersの両方の手法でWindows用Dockerコンテナを動作できる。ただし、Linux用Dockerコンテナの動作はできない。
2017年1月19日: Docker for Windows 1.13.0
ベータ版機能として提供されていたWindows用Dockerコンテナ対応が正式リリースとなりました。
これまではLinux仮想マシンとLinux用Dockerデーモンをセットアップし、Windows用Dockerクライアントから操作してLinux用Dockerコンテナを起動する仕組みでしたが、それに合わせてWindowsコンテナ環境とWindows用Dockerデーモンもセットアップするようになりました。Windows用Dockerクライアントの接続先デーモンをLinux用/Windows用と手動で切り替えることにより、それぞれのDockerコンテナを起動できるようになりました。
一言ポイント: Docker for WindowsはLinux用Dockerコンテナに加えて、Windows用Dockerコンテナを動作できるようになった。ただし、手動での切り替えが必要で、並存できない。
参考:
2017年11月22日 Docker for Windows 17.11
2017年10月17日にリリースされたWindows Server バージョン 1709では、LinuxKitというより軽量なLinux仮想マシンでLinux用Dockerコンテナを動作できるようになりました。この仕組みは Linux Container On Windows (LCOW)と呼ばれ、Docker Enterprise EditionプレビューリリースやDocker for Windows 17.11にいち早く取り入れられました。
参考:
2018年2月12日 Docker for Windows Desktop 18.02
Docker for Windows Desktop 18.02ではLCOW対応がさらに推し進められ、単一のDockerデーモンでWindows用DockerコンテナとLinux用Dockerコンテナの両方を扱えるようになりました。コンテナ起動時の --platform オプションで対応OSを切り替えるようになっており、排他ではなく並存できるようになっています。
一言ポイント: Docker for Windowsは、単一のDockerデーモンでLinux用DockerコンテナとWindows用Dockerコンテナの両方を同時に起動できるようになった。
2019年5月6日: Windows Subsystem for Linux 2 発表
2016年8月2日から約3年、Windows Subsystem for Linux 2 (WSL 2)が発表されました。必要に応じてLinuxカーネルの機能をエミュレーションしていたWSL 1と異なり、Linuxカーネルの機能すべてを利用可能とするために、LinuxカーネルそのものをWindows上の軽量な仮想マシンで動作させる仕組みです(参考:WSL 1 と WSL 2 の比較)。このアナウンスには「Linux版Dockerがそのまま動く」とわざわざ書かれているほどです。
翌月には、WindowsインサイダープログラムでWSL 2の提供が開始されました。
2019年7月18日: Docker Desktop for WSL 2 テクノロジープレビュー
Docker for WindowsはDocker Desktopと名前を変え、早速WSL 2 テクノロジープレビューをリリースしました。
後のDocker 20.10では、Docker 17.09テクノロジープレビュー以来、実験的機能として組み込まれていたLCOWが廃止予定となり、WSL 2の利用が推奨されるようになりました。
Docker Desktop for WSL 2の歴史に関してはCreating the best Linux Development experience on Windows & WSL 2をご覧ください。
まとめ
ここまでを文章でまとめると次のようになります。
- Windows上で Windows用 のDockerコンテナを動かすにはプロセス分離を利用した「Windows Server Containers」とHyper-V分離を利用した「Hyper-V Containers」の2種類がある。2021年6月現在、デフォルトは「Hyper-V Containers」である。
- Windows上で Linux用 のDockerコンテナを動かすにはLinux仮想マシンが必要で、Hyper-V仮想化機能などが利用されていたが、2021年6月現在ではWindows Subsystem for Linux 2が主流となりつつある。
さらに単純化すると、
- Windows用 Dockerコンテナ
- Hyper-V Containers (VM利用、デフォルト)
- Windows Server Containers (プロセス分離)
- Linux用 Dockerコンテナ
- WSL 2 (主流となりつつある)
- その他仮想化技術 (Hyper-V仮想化やVirtualBoxなど)
となります。
補足
参考までに、2021年6月現在の製品版Windows用Docker (MCR; Mirantis Container Runtimeおよび、MKE; Mirantis Kubernetes Engine)の商用サポートについてまとめておきます。
コンテナの単体利用
プロセス分離 | Hyper-V分離+MCR | WSL2+Docker Desktop | Hyper-V仮想マシン+Linux仮想マシン+MCR | |
---|---|---|---|---|
Windowsコンテナ | Microsoft社がサポート | サポートなし | 動作不可 | 動作不可 |
Linuxコンテナ | 動作不可 | サポートなし | サポートなし | Mirantis社がサポート |
MKE (Kubernetes)のワーカーノードとして利用
プロセス分離 | Hyper-V分離 | WSL2 | Hyper-V仮想マシン+Linux仮想マシン+MCR | |
---|---|---|---|---|
Windowsコンテナ | Mirantis社がサポート | サポートなし | 動作不可 | 動作不可 |
Linuxコンテナ | 動作不可 | サポートなし | サポートなし | Mirantis社がサポート |