fbpx

Windows上でDockerコンテナを動かす! その歴史 #docker #windows #linux #lcow #wcow #wsl2

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

New call-to-action

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社がサポート

Author

Chef・Docker・Mirantis製品などの技術要素に加えて、会議の進め方・文章の書き方などの業務改善にも取り組んでいます。「Chef活用ガイド」共著のほか、Debian Official Developerもやっています。

Daisuke Higuchiの記事一覧

新規CTA