Docker でやってみる Windows container
Windows container …?
ホシイです。
ふだんからひたすら container 技術についての情報を web で漁っていると、YouTube を開けば技術系の動画に混ざってコンテナ船舶 (実体) の動画もおすすめされるような状態であり、果てにはそれも視聴してしまいああこれはなるほどすごい技術だなあ。と感心したりなどする日々を過ごしております。
そんな日々の中であっても、なかなか気づかないことはあるものです。あるときふと Windows container という言葉に行き当たったときに、おやとなりました。WSL などはふだんから触れる機会はありますが、Docker で Windows container? さらには Kubernetes でも Windows container? はて? となり、これはひとつ調べて・やってみたくなりましたという次第です。
Windows container を Docker Desktop で実行するための条件
いくつかの条件をクリアすると、Windows container を Docker Desktop を使って実行できます。 (ここがこの記事のハイライトです)
- host が Windows であること
- host の Windows version に 互換性がある container image を選択する こと
- Docker Desktop で
WSL 2 backed engine
を有効に しない こと (後述) - Windows (host) で Hyper-V、Container 機能が有効になっていること (後述)
Windows 11 でも同様かなと思うのですが、確認できていません。今回の実験は Windows 10 で行っています。
やってみよう
Windows container の image はたとえば mcr.microsoft.com/windows/nanoserver:ltsc2019
などが公開されていますが、普段 Linux container のために使っている Docker Desktop を使ってこれを利用しようとすると以下のようにエラーになります。
$ docker pull mcr.microsoft.com/windows/nanoserver:ltsc2019
ltsc2019: Pulling from windows/nanoserver
no matching manifest for linux/amd64 in the manifest list entries
ふだんは Docker Desktop が Linux container モードで動作しているので、これを Windows container モードに切り替える必要があります。Windows の通知領域にある Docker Desktop icon の context menu から、Switch to Windows containers...
を実行します。
このとき以下のように、「既存 container の実行は継続されるしデータは失われないが、Linux container を管理するには戻してね」(意訳) という dialog が出ます。 お手元の実行状況に気をつけて切り替えを行ってください。
また、以下のように command line からも切り替えが行えます。
PS> & $Env:ProgramFiles\Docker\Docker\DockerCli.exe -SwitchDaemon
さて、ここまでやってもうまくいかないかもしれません。具体的には、実際に Windows の container image を使用しようとしたときに以下のようなエラーが発生したりします。
PS> docker pull mcr.microsoft.com/windows/nanoserver:ltsc2019
Error response from daemon: open \\.\pipe\docker_engine_windows: The system cannot find the file specified.
Docker Desktop や WSL の再起動を試すようにという情報もあったりしますが、その前に以下を確認してみてください。
PS> Enable-WindowsOptionalFeature -Online -FeatureName $("Microsoft-Hyper-V", "Containers") -All
“Microsoft-Hyper-V” と “Containers”、どちらも必ず必要です。片方が無効になっていると動作しません。変更後、Windows の再起動が必要です。(もともと有効になっていれば必要ないかも)
再起動しましたら、再び Docker Desktop の WSL 2 backed engine がオフになっていることを確認したうえで、上述の方法で Windows containers に切り替えます。
※ 切り替えにより、WSL から docker が使えなくなります (command 'docker' could not be found
になってしまう) ので、必要なときはまた Linux container に切り替えなおしてご利用ください。
さて、ようやく Windows container を実行してみましょう!
手元に Hello.txt
という file をつくり、その場所を container 内に mount し、file 内容を出力してみましょう。Windows 流で。
PS> docker run -v C:\temp:C:\work mcr.microsoft.com/windows/nanoserver:ltsc2019 cmd.exe /s /c type C:\work\Hello.txt
Hello, world!
できました。Windows なので、引数の file 名を hello.txt
のように大文字小文字を無視して指定してもちゃんと認識されたりします。
何に使う…?
さて、できることはわかりましたがこれ、何に使えるでしょうか? 🤔
たとえば Windows 版しか無いソフトウェアでも、テスト環境をつくるときに Docker Compose を利用できたり、build を CI で走らせたいといったことができるのは便利そうです。
また今回は試せていませんが、GKE などでも Windows node を用意すれば Windows container の利用はできる ようなので、複雑な構成の一部で API server などを Windows 上で動かすこともできそうです。
参考
以下、参考にさせていただきました。
今回のような、おなじ単語でよりメジャーなトピック (Docker Desktop for Windows 自体など) が存在する場合、Windows + Docker などの単語で検索すると、なかなか希望の情報にたどり着きにくいものです。context を持って調べ物ができる Chat AI サービスの利用はこういったときも便利そうですね。