連載の第27回第29回第30回では、Azureで利用可能なDockerベースのコンテナのデプロイ環境として「Web App for Containers」「Azure Container Instances(ACI)」「Azure Kubernetes Service(AKS)」の3つのサービスを紹介しました。これらのサービスでは、Linuxコンテナだけでなく、Windowsコンテナ(プレビューの場合あり)のイメージをデプロイして実行することができます。

Linuxコミュニティで発展してきたDockerの開発環境は、LinuxベースのDockerエンジンとDockerクライアントが主流です。

しかし、現在はマイクロソフトとDockerの協力により、Windowsコンテナへの対応が進められ、Windows Server 2016およびWindows 10バージョン1607(Pro以上、x64のみ)以降にコア技術である「Containers(コンテナ)」機能が搭載されました。また、DockerはWindowsコンテナのデプロイと実行に対応したWindows Server向けの「Docker Enterprise(Docker Enterprise Edition)」が提供されました。

LinuxとWindowsの両方のコンテナに対応、Docker Desktop for Windows

Windows 10向けの「Docker Desktop for Windows」(旧称、Docker for Windows、Docker Toolbox)は、LinuxベースのDockerエンジン用の仮想環境としてWindows 10 Hyper-Vに対応し(従来はVirtualBox)、さらにWindowsコンテナ(ただし、Hyper-V分離モードのHyper-Vコンテナのみ)のサポートも追加されました。

現在、Docker Desktop for Windowsは、Linux/Windowsコンテナの両方に対応している唯一のツールになります。つまり、Docker Desktop for Windowsのコンテナ環境を1つ準備すれば、LinuxとWindowsのコンテナベースのアプリを開発できるということになります。

  • Azure“超”入門 第31回

    Docker Desktop for Windowsは、Linux/Windowsの両方のコンテナに対応した唯一のツール。インストール直後の既定はLinuxのコンテナ環境

開発したアプリ(コンテナイメージ)は、Docker HubやAzure Container Registryを介してAzureの各種サービスにデプロイすることができます。もちろん、オンプレミスのLinuxまたはWindows Serverのコンテナホスト環境にデプロイする目的で利用することもできます。

なお、現在のDocker EnterpriseはWindowsコンテナ(プロセス分離モードおよびHyper-V分離モード)専用ですが、Windows Server 2019以降に対して、Linuxコンテナへの対応(後述するLCOW)が正式に追加される予定です(現在はプレビュー)。

Docker Desktop for WindowsのLinuxコンテナ環境

Docker Desktop for Windowsには、Linuxコンテナ環境、Windowsコンテナ環境、そしてLinuxとWindowsコンテナの両方に対応した、言うなればハイブリッド環境の3つがあり、Linuxコンテナ環境とWindowsコンテナ環境は環境を切り替えて使用します。インストール直後の既定はLinuxコンテナ環境です。

  • Azure“超”入門 第31回

    Docker Desktop for WindowsのLinuxコンテナ環境。Linuxコンテナのみを実行できる。Windowsコンテナのイメージには対応していない

Docker Desktop for WindowsのLinuxコンテナ環境では、Dockerエンジン(dockerd)はHyper-Vに準備されるLinux仮想マシン(MobyLinuxVM)で動作しており、ローカルのDockerクライアント(docker.exe)はLinux仮想マシンのエンジンにリモート接続することで、Linuxコンテナ環境があたかもローカルのLinuxコンテナホストにあるかのように見せています。

  • Azure“超”入門 第31回

    Docker Desktop for WindowsのLinuxコンテナ環境は、Hyper-V上のLinux仮想マシンがDockerエンジンを提供する。Windowsコンテナに対応させるには、切り替えが必要

Windowsコンテナのイメージには対応しておらず、docker pullでイメージを取得することもできません。この環境は、通知領域の[Docker Desktop]アイコンを右クリックすると表示される「Switch to Windows containers」をクリックすることでWindowsコンテナ環境に切り替えることができます。

Windowsコンテナ環境に切り替える際、Windowsの機能「Containers」が有効化されていない場合は有効化し、再起動されます。また、Windowsコンテナ環境に切り替え後は、切り替えメニューが「Switch to Linux containers」に変わるので、Linuxコンテナ環境にいつでも戻すことができます。

Docker Desktop for WindowsのWindowsコンテナ環境

Docker Desktop for WindowsのWindowsコンテナ環境は、Windowsコンテナ専用です。こちらは、DockerエンジンがWindowsのサービス(サービス名「docker」、表示名「Docker Engine」)し、DockerクライアントはローカルのDockerエンジンに接続します。

Windows ServerのDocker Enterpriseでは、コンテナホストとカーネルを共有する「プロセス分離モード」(--isolation=process)と、Hyper-Vの分離環境でコンテナ間およびコンテナとホスト間を分離する「Hyper-V分離モード」(--isolation=process)の両方に対応しており、プロセス分離モードを「Windows Serverコンテナ」、Hyper-V分離モードを「Hyper-Vコンテナ」と呼びます。Docker Desktop for Windowsは、Hyper-V分離モードによるWindowsコンテナの実行をサポートしています。

Hyper-V分離モードは、Hyper-Vの仮想環境でコンテナごとのカーネル環境を実行し、その上でWindowsコンテナのイメージを実行します。技術的にはHyper-V仮想マシンとしてカーネルを提供するWindowsインスタンスを実行しているのですが、Hyper-Vの仮想マシンとしてコンテナホストから見えるものではありません。

Windows 10バージョン1809ではWindows Server/Nano Serverバージョン1809のイメージを、Windows 10バージョン1903では同バージョン1903を、コンテナホストのカーネルを共有するプロセス分離モードで実行できるようになりました。ただし、マイクロソフトは現状、Hyper-V分離モードのみを正式にサポートしています。

  • Azure“超”入門 第31回

    Docker Desktop for WindowsのWindowsコンテナ環境は、DockerエンジンがWindowsのサービスとしてローカルで稼働する。Hyper-V分離モードでWindowsコンテナを実行可能。Linuxコンテナには対応していない

Docker Desktop for WindowsのLCOW環境

Docker Desktop for Windowsは、バージョン18.03-0-ce-win59からWindows 10バージョン1709以降において、Experimental(実験的)機能として「Linux Containers on Windows(LCOW)」に対応しました。

LCOWは、技術的にはHyper-V分離モードであり、Hyper-Vの仮想環境でLinuxカーネル(Moby LinuxKit)を動かし、Linuxコンテナの実行を可能にするものです。Docker Desktop for Windowsでは「Settings」ウィンドウの「Daemon」で「Experimental」をチェックし、Dockerエンジンを再起動することで利用可能になります。LCOWを利用できる環境では、WindowsコンテナとLinuxコンテナを同時に実行することができます。

  • Azure“超”入門 第31回

    Experimental機能を有効化すると、Windowsコンテナ環境でLinuxコンテナを実行できるようになる

Docker Desktop for Windowsの今後

Windows 10には、「Windows Subsystem for Linux(WSL)」と呼ばれるLinuxシェル環境が利用可能です。WSLはWindows 10バージョン1709で初めて搭載された機能ですが、現在の実装はLinuxバイナリをWindows上でネイティブに実行できるサブシステムですが、今後、Hyper-Vの分離環境を利用して完全なLinuxカーネルを実行するWSL2が提供され、ユーザーはWSL(WSL1)とWSL2のいずれかを選択できるようになる予定です。

Docker Desktop for Windowsの将来のバージョンでは、Linuxコンテナ環境(現在のLCOWを使用しない、Hyper-Vに依存する環境)がWSL2に対応し、DockerエンジンやKubernetesをWSL2内で直接実行できるようになる予定です。

これにより、Linuxコンテナのパフォーマンスの劇的な向上が期待されます。仮想マシン以下のアナウンスにある図を見る限り、現在のLCOWの方法のように、Windowsコンテナの環境とLinuxコンテナの環境を切り替えることなく利用できるようです。

著者プロフィール

山市良
Web媒体、IT系雑誌、書籍を中心に執筆活動を行っているテクニカルフリーライター。主にマイクロソフトの製品やサービスの情報、新しいテクノロジを分かりやすく、正確に読者に伝えるとともに、利用現場で役立つ管理テクニックやトラブルシューティングを得意とする。2008年10月よりMicrosoft MVP - Cloud and Datacenter Management(旧カテゴリ: Hyper-V)を連続受賞。ブログはこちら。

主な著書・訳書
「インサイドWindows 第7版 上」(訳書、日経BP社、2018年)、「Windows Sysinternals徹底解説 改定新版」(訳書、日経BP社、2017年)、「Windows Server 2016テクノロジ入門 完全版」(日経BP社、2016年)、「Windows Server 2012 R2テクノロジ入門」(日経BP社、2014年)などがある。