ぷろじぇくと、みすじら。

Linux Containers on Windows (LCOW)を使う

Created at:

Windows 10 Fall Creators Update (Version 1709)やWindows Server 1709以降では、ExperimentalなステータスですがHyper-V Isolationを利用して、Windows向けDockerでLinuxコンテナーを動かせるようになりました。それがLinux Containers on Windows (LCOW)です。

何がうれしいのかというと、通常WindowsでDockerを使ってコンテナーを動かす場合にはWindowsを動かすのであればWindows Containersを使い、Linuxコンテナーを動かすのであればHyper-VのVMを起動する、というどちらかの切り替えることになります。一方でLCOWを使った場合はどちらも同列に扱われ、LinuxコンテナーはHyper-V Isolationで起動されるようになります。

というわけでこれを使ってみます。セットアップの仕方はLinuxKit based LCOW imagesにあるのでそれに従うと簡単に動きます。

Containers と Hyper-V を有効にする

Windows 10 Fall Creators Update (Version 1709)やWindows Server 1709以降でWindowsの機能の Containers と Hyper-V を有効にします。

Docker をダウンロードする

Dockerは開発版ブランチのビルドを使う必要があるので適当にダウンロードしてきます。逆を言うとこの時点でDocker for Windowsが入っていない環境でも大丈夫です。

Invoke-WebRequest -UseBasicParsing -OutFile dockerd.exe https://master.dockerproject.org/windows/x86_64/dockerd.exe
Invoke-WebRequest -UseBasicParsing -OutFile docker.exe https://master.dockerproject.org/windows/x86_64/docker.exe

Linux Kit をダウンロードして展開/配置する

Linux KitのReleaseページからの release.zip をダウンロードして、管理者権限のPowerShellで次のコマンドを実行してZipを展開して配置します。

Remove-Item "$env:ProgramFiles\Linux Containers" -Force -Recurse
Expand-Archive release.zip -DestinationPath "$Env:ProgramFiles\Linux Containers\."
rm release.zip

Docker デーモンを起動する

続いてDockerデーモンを起動します。管理者権限のPowerShellで次のコマンドを実行してください。

$env:LCOW_SUPPORTED=1
$env:LCOW_API_PLATFORM_IF_OMITTED="linux"
Remove-Item c:\lcow -Force -Recurse; mkdir c:\lcow
.\dockerd.exe -D --experimental --data-root c:\lcow

この dockerd を起動するときには --experimental オプションと LCOW_SUPPORTED 環境変数が重要なポイントです。

Linux コンテナーを起動してみる

あとはコンテナーを起動するだけです。Dockerデーモンを起動したコンソールはそのままになっていると思うので、別途管理者権限でPowerShell(かコマンドプロンプト)を開きます。

その前にバージョン情報を見てみましょう。

PS C:\Users\Tomoyo\Downloads> .\docker.exe version
Client:
 Version:       master-dockerproject-2017-12-23
 API version:   1.35
 Go version:    go1.9.2
 Git commit:    70db7cc0
 Built: Sat Dec 23 23:53:34 2017
 OS/Arch:       windows/amd64
 Experimental:  false

Server:
 Engine:
  Version:      master-dockerproject-2017-12-23
  API version:  1.36 (minimum version 1.24)
  Go version:   go1.9.2
  Git commit:   3e1df95
  Built:        Sat Dec 23 23:57:11 2017
  OS/Arch:      windows/amd64
  Experimental: true

注目すべきは Server の OS/Arch で、windows/amd64 となっているのでサーバーはWindowsであるということになります。リリースされているDocker for WindowsでLinuxモードにしている場合、DockerデーモンはLinuxのVMで動くため OS/Arch は linux/amd64 となります。

というわけで普通にUbuntuイメージを起動してみます。

PS C:\Users\Tomoyo\Downloads> .\docker run -it --rm ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
50aff78429b1: Pull complete
f6d82e297bce: Pull complete
275abb2c8a6f: Pull complete
9f15a39356d6: Pull complete
fc0342a94c89: Pull complete
Digest: sha256:ec0e4e8bf2c1178e025099eed57c566959bb408c6b478c284c1683bc4298b683
Status: Downloaded newer image for ubuntu:latest
root@a3e889d2ad0d:/# head -2 /etc/os-release
NAME="Ubuntu"
VERSION="16.04.3 LTS (Xenial Xerus)"

ちゃんと起動できました。

Windows コンテナーを起動してみる

続いて同じ環境でWindowsコンテナーも起動できることを確認します。

先ほどDockerデーモンを起動する際に $env:LCOW_API_PLATFORM_IF_OMITTED="linux" を指定したので、起動するプラットフォームを指定しない場合にはLinuxコンテナーを起動することになっています。そんなわけで起動時にプラットフォームを指定するのを忘れないようにします。

今回は折角なのでWindows Server 1709のnanoserverを起動してみます。ちなみに nanoserver は latest タグを取ってくるとWindows Server 2016 (Semi-Annual Channel)のイメージが降ってくるので 1709 タグを明示的に指定する必要があります。(なおHyper-V Isolationならばホスト側とバージョンが異なっても動きます)

PS C:\Users\Tomoyo\Downloads> .\docker run -it --rm --platform windows microsoft/nanoserver:1709
Unable to find image 'microsoft/nanoserver:1709' locally
1709: Pulling from microsoft/nanoserver
407ada6e90de: Pull complete
9c9e16cbf19f: Pull complete
Digest: sha256:e6b719a2b4939c9bac0b16a970ef01f2a3b31d0b9d20079eb0163e15d815e46f
Status: Downloaded newer image for microsoft/nanoserver:1709
Microsoft Windows [Version 10.0.16299.125]
(c) 2017 Microsoft Corporation. All rights reserved.

C:\>

Windowsもちゃんと起動できました。

うれしいこととは

現状Experimentalなステータスであることを考えると実運用はちょっと…という感じですが、手元で開発するときなどLinuxもWindowsもコンテナーを起動したいという場合にどちらも深く考えず動かせるのは便利です。

起動はそれぞれのコンテナーが独立したVMになる分、若干遅いです(起動まで3秒ぐらい)。Docker for WindowsのLinuxコンテナーはMobyLinux VMの中でコンテナーが起動するのでその分速いのでしょう。

ちなみにDocker for WindowsのLinuxコンテナーのMobyLinux VMの中で動作するという仕組みからわかる通り、単一VHDXの中にイメージが降ってきて展開/起動するのですが、一方のLCOWはコンテナごとにVMなのでVHDXが裏で作られて捨てられる形になっています。

ボリュームマウントに関してはSMBのShare Driveではない仕組みで動いているのでShare Driveの設定が不要です。逆を言えば違う仕組みゆえにまだサポートされていないファイルシステムオペレーションがあるようなので一長一短ですが。

/ # mount
overlay on / type overlay (rw,relatime,lowerdir=/tmp/base/:/tmp/gcs/e82074d74d807cb0905916bd4fd5c2240bac5a1d24d7e8f61e3c080426c43a82/layer0,upperdir=/tmp/gcs/e82074d74d807cb0905916bd4fd5c2240bac5a1d24d7e8f61e3c080426c43a82/scratch/upper,workdir=/tmp/gcs/e82074d74d807cb0905916bd4fd5c2240bac5a1d24d7e8f61e3c080426c43a82/scratch/work)
(略)
/tmp/gcs/e82074d74d807cb0905916bd4fd5c2240bac5a1d24d7e8f61e3c080426c43a82/binds/mnt on /mnt type 9p (rw,sync,dirsync,relatime,trans=fd,rfdno=7,wfdno=7)
(略)

ともあれExperimentalなステータスを抜けたらだいぶ便利そうです。

FAQ: Not enough memory resources are available to complete this operation. (0xe)とか言われる

Windows 10 Insider Preview 17063だとLCOWで起動できない模様。

FAQ: -pEXPOSE でバインドしたポートに localhost でアクセスできない

Available to Windows 10 Insiders Today: Access to published container ports via “localhost”/127.0.0.1 によれば Windows 10 Insider Preview では対応されたようなので、Insider Previewを使うか次のアップデートリリースをお待ちくださいという感じです。