Windows上でMoby/LinuxKitを使ってみる

最近、流行りつつある(?)、Moby/LinuxKitをWindows10上で起動してみたので手順メモ。LinuxKitを起動するところまで確認しました。

Dockerは普段使ってますが、Go言語は全く使ったことがないし、Moby/LinuxKitの情報にもあまり詳しくないので、とりあえず動くところまで、という感じでまとめました。

# 動作環境

- Windows 10 Pro(1703) 64bit
    - Hyper-Vを使うためHome不可。Pro以上が必要。
- Docker 17.06.0-ce
- Go 1.8.3 windows/amd64

# インストール
## Go言語のインストール
Moby/LinuxKitをGo言語を使ってインストールするので、まずはGo言語のインストールを行う。Go言語の[ダウンロードページ](https://golang.org/dl/)からパッケージをダウンロードしてインストールすればよい(2017-07-19現在では1.8.3だった)。

## Gitのインストール
Moby/LinuxKitビルド時にGitを使用するので[Git for Windows](https://git-for-windows.github.io/)のインストールを行う。

## MobyおよびLinuxKitをビルド
Goコマンドを使えば簡単にインストールできる。

- 参考: [Mobyを使ってLinuxKitをビルドして起動してみる](http://qiita.com/reoring/items/9f4c3e33a298c7a52a0a)

### Moby
```shell-session
C:\> go get -u github.com/moby/tool/cmd/moby
```

### LinuxKit
```shell-session
C:\> go get -u github.com/linuxkit/linuxkit/src/cmd/linuxkit
```

## Docker for Windowsのインストール
MobyでLinuxKit用のイメージをビルドする際にはDockerが必要になるので、Docker for Windowsをインストールする。[公式のインストールページ](https://docs.docker.com/docker-for-windows/)からパッケージをダウンロードしてインストールすればよい。

インストールしたら起動しておく。

以上で準備は整った。

# 使ってみる
とりあえず最小限のイメージをビルドし、起動を試す。昔の人なので、DOS窓を使って作業した。linuxkitを起動する際に、`Must be run from an elevated prompt or user must be in the Hyper-V Administrator role`と怒られるので、管理者権限でコマンドラインプロンプトを開く(PowerShellでも同じ)。

## minimalイメージのビルド
GitHubのlinuxkitリポジトリからminimal.ymlを適当なディレクトリにダウンロードする。ここではC:\mobyディレクトリで作業したとする。

- https://raw.githubusercontent.com/linuxkit/linuxkit/master/examples/minimal.yml

mobyの実体であるmoby.exeは%USERPROFILE%\go\binにあるのでパスを通す。

```shell-session
C:\moby> PATH=%USERPROFILE%\go\bin;%PATH%
```

mobyでビルドする。WindowsではHyper-Vに仮想PCを作成して起動するようだが、そのときEFI-ISOファイルを使うようなので、mobyのオプションで`-output iso-efi`を指定する。以前は`moby build`で-efi.isoファイルも作成していたようだが、最近変わったのかな？

ビルドするときにDockerが必要である。

```shell-session
C:\moby> moby build -output iso-efi minimal.yml
Extract kernel image: linuxkit/kernel:4.9.38
Add init containers:
Process init image: linuxkit/init:d049e7b2074da5cd699a27defb47eb101142455d
Process init image: linuxkit/runc:d5cbeb95bdafedb82ad2cf11cff1a5da7fcae630
Process init image: linuxkit/containerd:b6ffbb669248e3369081a6c4427026aa968a2385
Add onboot containers:
  Create OCI config for linuxkit/dhcpcd:4b7b8bb024cebb1bbb9c8026d44d7cbc8e202c41
Add service containers:
  Create OCI config for linuxkit/getty:0a2955f3d7a10a0e71972791c3ba6400118f327e
Create outputs:
  minimal-efi.iso
```

これで`minimal-efi.iso`が作成された。このイメージを使い起動する。起動する際にはDockerは不要。おそらくlinuxkit.exeだけで動作する(のかな？)。

```shell-session
C:\moby> linuxkit run minimal-efi.iso
FATA[0001] Could not find an external switch
```

…外部スイッチがない、と怒られる(環境によると思う)。これを回避するために、Hyper-Vマネージャーの仮想スイッチマネージャーを使い、適当に内部用仮想スイッチを作成する。ここでは`LinuxKitNAT`という名前で仮想スイッチを作成した。

```shell-session
C:\moby> linuxkit run -switch LinuxKitNAT minimal-efi.iso
Creating VM: minimal
Configure VM: minimal
Setting up boot from ISO
Set up COM port
Start the VM
Connected
         [    0.000000] Linux version 4.9.38-linuxkit (root@e1ede117fb1e) (gcc version 6.3.0 (Alpine 6.3.0) ) #1 SMP Tue Jul 18 09:12:54 UTC 2017
[    0.000000] Command line: console=tty0 console=ttyS0 rootdelay=300 noautodetect
[    0.000000]
...(略)...
[    4.584461] Freeing unused kernel memory: 152K (ffff8a842e7da000 - ffff8a842e800000)
[    4.612413] Freeing unused kernel memory: 1400K (ffff8a842eaa2000 - ffff8a842ec00000)

Welcome to LinuxKit

                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
          {                       /  ===-
           \______ O           __/
             \    \         __/
              \____\_______/

eth0: waiting for carrier
```

という感じで起動できた(^^)。

# 参考サイト

- [Mobyを使ってLinuxKitをビルドして起動してみる](http://qiita.com/reoring/items/9f4c3e33a298c7a52a0a)
- [Moby で LinuxKit を起動してみる](http://qiita.com/pottava/items/3e64cf0476d4cfa93169)
- [はじめてのGo言語(on Windows)](http://qiita.com/spiegel-im-spiegel/items/dca0df389df1470bdbfa)
- [LinuxKit with Hyper-V](https://github.com/linuxkit/linuxkit/blob/master/docs/platform-hyperv.md)