しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

Docker for Windows Server の Default Isolation を Hyper-V に変更する

Windows Server 2016 に Docker EE をインストールすると、デフォルトでは Windows Server Containers が使われるようになっています。

docker info を実行すると Default Isolation が process になっていることが分かりますね。

f:id:shiba-yan:20170821223123p:plain

Windows Server Containers は起動が高速なので扱いやすそうですが、現在の実装ではコンテナホストとコンテナの Windows バージョンを適切にそろえる必要があるので不便です。

この理由から個人的には Hyper-V Containers を使わない限り、Windows Containers を使った本番環境での運用は難しいというスタンスです。話が少しそれました。

docker を直接叩く場合には --isolation=hyperv を指定するだけですが手間なので、デフォルトで Hyper-V Containers を使うように出来ないか調べたところ、オプションがありました。

Also Windows Container makes use of --exec-opt for special purpose. Docker user can specify default container isolation technology with this, for example:

> dockerd --exec-opt isolation=hyperv

Will make hyperv the default isolation technology on Windows. If no isolation value is specified on daemon start, on Windows client, the default is hyperv, and on Windows server, the default is process.

dockerd | Docker Documentation

dockerd の起動時にパラメータとして --exec-opt を渡してあげればよいみたいです。

ちなみに Windows Server 上では dockerd は Windows サービスとして動いているので、設定を書き換える必要があります。そのあたりの設定方法については公式ドキュメントに記載がありました。

ドキュメント通りに sc config を使ってパラメータを追加します。変更後はサービスの再起動が必要です。

sc config docker binpath= "\"C:\Program Files\docker\dockerd.exe\" --run-service --exec-opt isolation=hyperv"

dockerd の再起動後に、もう一度 docker info を実行したところ、Default Isolation が hyperv になっていることが確認できました。今後作成されるコンテナは Hyper-V Containers が使われるようになります。

f:id:shiba-yan:20170821223154p:plain

同じように ACS Engine で作成した Dv3 ベースな Kubernetes の Windows Agent Pool に対して手動で処理を行いつつ、Hyper-V をインストールすることで Azure 上の Kubernetes でも Hyper-V Containers が使えるようになりました。

ARM Template で自動化出来そうな気がしますが、とりあえず動くかだけ確認しておきました。

普通に Kubernetes で Deployment を作成して Pod をいくつか起動すると、タスクマネージャーから vmmem や vmwp が立ち上がっていることが確認出来るので Hyper-V Containers で動作しています。

f:id:shiba-yan:20170822164113p:plain

Windows Server Containers を使っていた時よりもメモリの消費は大きい感じですが、普通に仮想マシンを立ち上げるよりは少ないはずです。コンテナホストに依存しないのが良いですね。

Kubernetes の Dashboard からは Hyper-V Containers を使っていても違いは判りません。

f:id:shiba-yan:20170822164012p:plain

Windows Server Core のイメージを pull 済みの場合は 2 分以内でヘルスチェック含め立ち上がってきました。コンテナホストに良いインスタンスを使えば、もっと素早く立ち上がる気がします。

時間があるときに ACS Engine を弄って、ARM の Custom Data で Agent 起動時に Hyper-V Containers への有効化を行えるようにしてみようかと思いました。