🔥

WindowsServer + DockerでLinuxコンテナで実行する際の注意事項

3 min read

はじめに

「WindowsServerでDockerを使ってLinuxコンテナを動かしたい」
というどうして…と言いたくなるような使い方をしてハマったポイントの共有が目的です。

手元のWindows10に対してDocker入れてLinuxコンテナ動かして…という情報はたくさんあるのですが、わざわざWindowsServer立ててLinuxコンテナを動かすというケースは意外と少なかったため、私のようにニッチな用途で困っている方の一助になれば幸いです。

結論

Azure, AWS, GCPに関してはAzure VMの一部インスタンスタイプおよびAWS EC2のベアメタル(物理サーバー独占するやつ)を除いて、WindowsServerでのLinuxコンテナ実行はできない。
オンプレなどでNested Viarualizationが利用できるなら、WindowsServer1709(SAC)以降(LTSCだとWindowsServer2019)においてはLinuxKitを使った方法でLinuxコンテナの実行が可能。
という認識です。間違ってたらご指摘ください。

そもそも

LinuxコンテナをDockerで動かしたいなら素直にLinuxサーバーを立ててDockerをインストールして使いましょう。それならコンテナ実行そのものについて困ることは何もありません。安定しているしネット上の情報も豊富です。
ただ、社内ルールなど何かしらのやむを得ない事情によりWindowsServerでやる場合、記事作成時点(2021年7月)では以下の制約および対応方法があります。

クラウドサービスのNested Viarualization制限

クラウドサービス上のサーバーではNested Virtualization(多重の仮想化)に制限がかかっていることが多いです。これはクラウドサービスでWindowsServerを使っている方には常識なのかもしれませんが…
Nested Viarualizationが利用できない場合、Windowsだと各種VMやHyper-Vが利用できません。Hyper-Vが使えないということはWSL2が使えません。。

主要クラウドのNested Viarualization対応についてはこちらのブログにまとめられていました。
Nested Virtualizationをサポートするクラウドについて - kkamegawa's weblog
AWS, GCP, AzureのWindows OSでのNested Viarualization対応としてはAzureの一部インスタンスタイプとAWSのベアメタルインスタンス(物理サーバー独占するやつ)のみが対応しているようです。

参考

Windows(Server)のDocker対応の変遷

ここ数年のWindowsのDocker対応の変化は非常に激しく陳腐化してしまった情報も多いため、結局2021年時点でどの条件でどの方法をとるべきか、という情報に意外とたどり着きにくかったです。
WindowsとDockerの変遷についてはこちらで非常に丁寧に解説されていました。
Windows上でDockerコンテナを動かす! その歴史- クリエーションライン株式会社

WindowsServer2016(LTSC)以前

基本的にLinuxコンテナの実行はできません。
WSL1を使う、LinuxをVMで立ててその中で使う、など無理すればできるのかもしれませんが詳しく調べられていません。少なくとも推奨できる方法ではありません。

WindowsServer1709(SAC)以降

上で書いたNested Viarualizationの制限がないのであれば、LinuxKitを用いた方法でLinuxコンテナの実行が可能です。

参考

ちなみにWindows10だとDocker Desktop+WSL2が利用可能ですが、2021年7月時点でWindowsServerではまだWSL2が利用できません。
次のLTSCである2022?に入るんでしょうか…?

まとめ

結論は最初に書いたとおりですが、
Azure, AWS, GCPに関してはAzure VMの一部インスタンスタイプおよびAWS EC2のベアメタル(物理サーバー独占するやつ)を除いて、WindowsServerでのLinuxコンテナ実行はできない。
オンプレなどでNested Viarualizationが利用できるなら、WindowsServer1709(SAC)以降(LTSCだとWindowsServer2019)においてはLinuxKitを使った方法でLinuxコンテナの実行が可能。
という認識です。

私の場合、EC2の非ベアメタルインスタンス+WindowsServer2016という組み合わせでひたすら格闘してしまいました…
同じ轍を踏む方が少しでも減れば幸いです。