Windows Server 1709上でLinuxコンテナを動かす(lcow)

Windows ServerのHyper-Vと最新のDocker、LinuxKitを組み合わせて、Windows Server上でLinuxコンテナを動かす「Linux Container on Windows」(略してLCOW)を使う方法について解説します。2017年10月14日に私が発表した資料から、バージョンやドキュメントの場所が変わっているので、当時の登壇資料とはURLのリンク先が異なっています。

スポンサーリンク

1. Hyper-VコンテナーとLinuxKitについて

1-1. Hyper-Vコンテナーとは

Hyper-VコンテナーはWindowsのコンテナ機能の一つで、1つのコンテナごとに1つのOSがあり、Docker APIによる簡単操作とHyper-VによるOS丸ごとの分離によるセキュリティを両立しています。コンテナ上のプロセスの分離のされ方のイメージは次の図のようになります。

Hyper-Vコンテナーのプロセス分離イメージ

1-2. LinuxKitとは

LinuxKitはコンテナを起動するために最低限必要なLinux機能のみを実装した小さなLinuxイメージです。Hyper-Vで利用するLinuxKitの実体は、Hyper-V仮想マシン構成に必要なEFIイメージとRAMディスクイメージの2つのファイルです。Hyper-Vコンテナー上でLinuxKitを利用する場合のコンテナ内プロセスの分離イメージは次の図のようになります。

Hyper-Vコンテナ上でLinuxKitを使う場合のプロセス分離イメージ

2. Linux Container on Windows (LCOW)のセットアップ

Linux Container on Windowsを利用するにはWindows Server version 1709もしくはWindows10 Version 1709以上(Pro)とHyper-Vの機能が必要になります。ここでは、Windows Server version 1709を利用した場合のセットアップ手順を紹介します。手順の流れはgithub上の「LinuxKit based LCOW images」のREADMEをもとに行います。

2-1. Windows Server version 1709上での機能の有効化

Windows Server version 1709ではGUIが廃止されたServer Core版(とコンテナ専用のNano Server)のみが提供されています。このあたりの詳細はマイクロソフトのドキュメントサイトなどにも解説があります

まず、Windows Server 1709をISOからインストールし、インストール後はsconfigコマンドを使ってホスト名、IP(固定IPに設定)、Remote Desktopの有効化を行います。

sconfigコマンドによる初期設定画面

初期設定を実施後、Hyper-Vとコンテナー機能を有効にするため、Powershellを起動して以下のコマンドを実行します。その後、OS再起動をします。

2-2. LinuxKitの準備

LCOW対応LinuxKitイメージをgithubのLCOWリリースページに記載のリンクからダウンロードします。本記事執筆時点では、「v4.12.14-2a3a94cc」がPre-Releaseとして公開されており、ページの下のほうにrelease.zipというリンクがあります。このrelease.zipのURLを控えておきます。このファイルをWindows Server version 1709に展開するために、以下のコマンドを実行します。

2-3. LCOW対応のDocker環境のセットアップ

LCOW対応のDockerデーモンおよびDockerクライアントは、Docker本家からダウンロードします。下記はDocker本件のNightly Buildからダウンロードしているため、毎日更新されます。また、コンテナイメージを保存するフォルダもこのタイミングで作成します。

ここまででLCOW対応Dockerの準備ができたので、デーモンを起動します。本手順では実行していませんが、もし通常のWindows Serverコンテナー用にPowerShell経由でDockerクライアントをインストールしていた場合、普通に起動するとポート番号がかぶってしまうため、名前付きパイプとしてデーモンを公開するようにします。また、Dockerデーモンをコンソールで起動すると大量の出力が出るため、別Windowを立ち上げてから行います。

以前は環境変数としてLCOW対応を許可する「LCOW_SUPPORTED」という変数を定義していましたが、master-dockerproject-2018-01-20, build 44a1168a以降のビルドでは不要となりました。

3. コンテナを起動してみる

以上でLCOWの準備ができましたので、Linux、Windowsそれぞれのコンテナを起動してみます。

3-1. Linuxベースのコンテナの起動

LinuxベースかWindowsベースかを指定する--platform引数を指定します。Linuxベースのコンテナの場合は以下の通りです。

3-2. Windowsベースのコンテナの起動

続けてWindowsベースとしてnanoserverを起動してみます。引数に--platform windowsを指定します。

以上の2つのコンテナを起動した後、コンテナイメージとしてLinux、Windowsの両方が一つの画面に並んでいることを確認します。

以上で、Linux Container on Windowsのセットアップと動作確認ができました。