2017/09/14

速報:Hyper-V コンテナーで Linux コンテナーが動いた!(追記あり)

現在は、Windows コンテナーしか動かせない、Windows Server 2016 と Windows 10 の Docker サポートですが、Windows Server vNext (ver 1709) および Windows 10 Fall Creators Update からは、Hyper-V コンテナーとして Linux コンテナーの実行がサポートされる予定です。

それには、仮想環境で動かす Linux ベースの Utility VM 環境が必要になると思うのですが、ようやく具体的な情報が出てきました。そして、試せました(→)。

Sneak peek #3: Windows Server, version 1709 for developers|Windows Server Blog
[URL] https://blogs.technet.microsoft.com/windowsserver/2017/09/13/sneak-peek-3-windows-server-version-1709-for-developers/


※注意:以降の記事は master-dockerproject-2017-09-14 の話です。より新しいバージョンが出ていますが、そちらは未確認。


まだプレビュー段階ですが、Docker for Windows (Windows 10 Insider) または Docker Enterprise Edition (Windows Server Insider) +Windows のコンテナーの機能のいずれかの環境で試せるそうです。これらいずれかの環境に、 LinuxKit と Linux コンテナーにプレビュー対応した dockerd.exe を入れます。

私は、以前、Windows 10 Insider の環境に Insider コンテナーを動かす環境を、Docker Community Edition (17.06.0-ce)  で作ったのですが、この環境で簡単に試すことができました(Windows 10 は Insider Preview 16288.1 に更新したばかり)。既に Windows コンテナーの環境があれば、10 分くらいでできると思います。

Windows Server Insider Preview のコンテナーを Windows 10 Insider Preview で試す(2017/07/26)


具体的な手順は、こちらに... PowerShell のコマンドを何個か実行するだけです。コピペすると、おかしな文字が(”)紛れ込んでいるので失敗しますよ。

Preview: Linux Containers on Windows
[URL] https://blog.docker.com/2017/09/preview-linux-containers-on-windows/

出来上がると、既にサービスとしてインストール済みの Docker デーモンではなく、コマンドラインで別パイプで動かしてあげます。その関係で、現状は Windows コンテナーとは別にイメージ管理する形になっちゃいます。将来的に 1 つのデーモンで、Windows コンテナーも Linux コンテナーも動かせますよってことになるんだと思います。

コマンドラインからインタラクティブ(デバッグ情報たくさん出ます)に開始した Docker デーモン (dockerd.exe) のバージョンは、master-dockerproject-2017-09-14 になっていました(9/19 追記:さらに新しいの出ています)。このデーモン、すべての docker コマンドが使えるわけではないようなのでご注意。普通に使うようなオプションでも文句を言われたり、期待通りに機能しなかったりするような、しないような。

busybox、ubuntu、microsoft/nanoserver-insider のコンテナー (Hyper-V コンテナー) を同時に動かしたところ。(nanoserver-insider だけ、17.06.0-ce エンジンのデーモンで管理しています)。

(↓注:Windows 10 Insider Preview 16288.1 Containers + LinuxKit + プレビュー版 Docker デーモンの環境。Windows Subsystem for Linux + Bash on Ubuntu on Windows ではありません)
(↑注:Windows 10 Insider Preview 16288.1 Containers + LinuxKit + プレビュー版 Docker デーモンの環境。Windows Subsystem for Linux + Bash on Ubuntu on Windows ではありません)

ちなみに、こちら(↓)は Docker for Windows の標準機能を使って、Linux コンテナーを動かしているところ。Windows コンテナーまたは Linux コンテナーのどちらかに切り替えて動かす形で、Linux コンテナーを動かすときは Windows コンテナーは動かせません。また、Hyper-V に MobyLinuxVM という仮想マシンが出現します。

(↓注:これは Hyper-V コンテナーではなく、Hyper-V 仮想マシンで動く Linux コンテナーホストの環境。今回のとは別のPC の Windows 10 1607+Docker for Windows の環境)
(↑注:これは Hyper-V コンテナーではなく、Hyper-V 仮想マシンで動く Linux コンテナーホストの環境。今回のとは別のPC の Windows 10 1607+Docker for Windows の環境)

簡単に言うと、この Linux 仮想マシン内で動く Docker デーモンに接続する仕組み。先ほどの Hyper-V コンテナーには、こんな仮想マシンはありませんね。Linux コンテナーの環境は純粋な Docker で、Windows コンテナーに切り替えると Hyper-V コンテナーの環境が使えるようになるということです。Windows コンテナーの環境では、Linux イメージを pull させてくれません。

Docker for Windows の環境で、Linux コンテナーを Hyper-V コンテナーとして動かそうとすると(MobyLinuxVM を使わないで)、このあたりがごちゃごちゃになって迷子になっちゃうかもしれません。

Hyper-V コンテナーの分離環境は、仮想マシンワーカープロセスとして見えます。これが、Hyper-V コンテナーで動いている証拠。
なお、Linux コンテナーのプレビューサポートが入った Docker デーモンで Windows コンテナーを pull しようとしたら、デーモンが落ちました。プレビューってことで。

(↑ 9/19 追記:master-dockerproject-2017-09-17 以降だとデーモン(-D)開始時に --experimental 指定が必要かも)

Windows 10 Insider Preview (ビルド 16278 以降?) で試したい場合は、

(1) Windows Server Insider Preview のコンテナーを Windows 10 Insider Preview で試す
(2) Preview: Linux Containers on Windows

の手順ですんなりできると思います。これが一番簡単な方法だと思います。Windows Server vNext の Server Core で試す場合もおんなじ感じのはず。Running Ubuntu Containers with Hyper-V Isolation on Windows 10 and Windows Server をにある "a funtastic tutorial at https://ubu.one/UhyperV"の手順は、なんだかややこしい。こちらは、Ubuntu Xenial ベースのコンテナー用軽量 Linux イメージ (ベース OS イメージの ubuntu ではない、Step 6 の xenial-container-hyper-v.vhdx.xz を Step 7 で C:\Program Files\Linux Containers\uvm.vhdx に準備したやつ) を使うみたいです。

Windows 10 バージョン 1607 や 1703 の環境では、Windows 側が対応していないので正常に動きません(↓)。Linux コンテナー対応機能は、Docker デーモンでの対応だけでなく、Windows の「コンテナー」の機能の新しい対応でもあるからです(たぶん)。


・・・(9/15 追記)・・・

昨日は取り急ぎ動かしただけでしたが、もう少し内部を見てみました。ここからはプレビュー情報を含むため、話半分で聞き流してください。

Windows コンテナーのための Hyper-V コンテナーの場合、分離実行されるベース OS イメージやコンテナーごとのファイルは、次のような場所にあります。

  • C:\ProgramData\Microsoft\Windows\Hyper-V\Container Utility VM\GUID.vhdx(Hyper-Vコンテナーの入れ物的な?)
  • C:\ProgramData\docker\windowsfilter\<images>\blank.vhdxやsandbox.vhdx(コンテナー用のサンドボックス環境?)
  • C:\ProgramData\docker\windowsfilter\<images>\UtilityVM\Files下のフラットなディレクトリ構造(ベースOSイメージのファイルシステム?)
  • C:\ProgramData\docker\windowsfilter\<images>\UtilityVM\Hives下のレジストリハイブ(ベースOSイメージのレジストリ?)

ちなみに、Windows Server コンテナー (Hyper-V コンテナーでないほう)は、Server Silo としてホスト上で動くコンテナーのプロセスが、C:\ProgramData\docker\windowsfilter\<images>\Files と Hives のフラットなファイルだけを I/O します。

Linux コンテナーのための Hyper-V コンテナーの場合、次の場所のファイルが使われていました。C:\lcow\winfilter というディレクトリもあったので、将来的には C:\ProgramData\docker\lcow に統合されるのかなぁと想像。(lcow は Linux Containers on Windows の略?)
  • C:\Program Files\Linux Containers\bootx64.efi と initrd.img (LinuxKit の Linux のブート環境と起動イメージ? LinuxKit ではなく Ubuntu Xenial ベースの場合は uvm.vhdx らしい
  • C:\lcow\lcow\<images>\layer.vhd (busybox とか ubuntu とかのベース OS イメージ?)
  • C:\lcow\lcow\<images>\sandbox.vhdx (コンテナーごとのサンドボックス環境?)
(↑Ubuntu ベースの xenial イメージ uvm.vhdx を先に探していて、次に LinuxKit の bootx64.efi と initrd.img を調べてる)

(↑Linux のコンテナー環境と共通の Linux コンテナー イメージだけど、サンドボックス環境はlayer.vhd と sandbox.vhdx が提供?)

Windows Sysinternals の Process Monitor(Procmon) で vmwp.exe や dockerd.exe のプロセスの動きをみると、こんな感じです。

Procmonについては... (PR) 電子書籍版のお知らせ『Windows Sysinternals 徹底解説 改訂新版』 

違いが分かり難い、周辺技術のまとめ。
  • Bash on Ubuntu on Windows (Beta) ・・・ ベースとなるWindows Subsytem for Linux(WSL)は、Microsoft Research の Drawbridge Project の成果。Drawbridge (picoprocess) もコンテナーという表現をしますが、下の 3 つのコンテナーとは別モノ(ライブラリOS的な?)。下の画面(↓)の一番上のやつ。
  • Windows Containers on Windows Server Container ・・・ Server Siloというジョブ(プロセス、スレッド、ジョブのジョブ)を拡張した技術であるところの Windows (v1607~) の Containers 機能(Linux でいうところの cgroups 的な?)+Docker EE(Docker エンジン+Dockerクライアント)。docker run -it microsoft/nanoserver cmd とか (Windows Server では暗黙的に--isolation=process)。
  • Windows Containers on Hyper-V Container ・・・ Windows (v1607~) の Containers 機能+Hyper-V Isolation+Docker EE または CE (Windows 10) の組み合わせ。docker run --isolation=hyperv -it microsoft/nanoserver cmd とか (Windows 10 では暗黙的に--isolation=hyperv)。
  • Linux Containers on WindowsPreview) ・・・ Hyper-V Container における Linux Contaners のサポート。Windows の Containers (v1709 Insider Preview ~)機能+Hyper-V Isolation+ランタイム実行用の軽量LinuxであるLinuxKit (LinuxKit を使う場合)+Docker Master Branch (master-dockerproject-2017-09-14 の dockerd.exe)。下の画面(↓)の真ん中のやつ。
ちなみに、SQL Server 2016 から SQL Server on Linux というのがありますが、これは Linux ネイティブな SQL Server ではなく、Linux 上で Drawbridgeを使って SQL Server の Windows バイナリ を動かしている(んだと思う)。microsoft/mssql-server-linux っていう Linux コンテナー イメージをマイクロソフトが公開していて、さらにややこしいことに(下の画面(↓)の一番下のやつ。メモリの問題で実行できなかったけど)

(↑Windows 10 Insider Preview 上のカオスな世界)

9/19 追記) Windows 10 の Hyper-V コンテナーの RAM サイズは 1GB が既定らしい。通常は --memory or -m で変更できるけど、プレビュー版の dockerd.exe では無視されるようです。なので、現状、SQL Server on Linux コンテナーを Hyper-V コンテナーでは動かせないようです。

 

0 件のコメント: