Windows10 で Docker コンテナ(Windowsコンテナ) で GPU が使えるようになったという話をみて、試してみようと思いつつなかなか実行できていなかったのですが、今回動作させるまでやれたので、その記録です。
使用している環境は Windows10 2004 バージョン、 WDDM 2.7 対応のグラフィックスドライバです。また以前の記事でも紹介したように VMware Workstation と Docker とを有効化できるように設定しています。なお WSL2 Backend は現在使用していません。
Docker for Windows で Windows Container へ切り替える
docker pull で Windows 用のコンテナを pull できなかった点でしばらく悩んだ後、モードを切り替えていないからだというのが判明しました。 タスクトレイに常駐している Docker アイコンを右クリックして、モードを切り替えます。
切り替え時にエラーが発生したら
自分が長時間陥っていたのがこの問題です。 Hyper-V を有効化しなさいとメッセージが出るのですが、 Hyper-V 自体は有効化しているのにエラーメッセージが表示されるので、非常に悩んでいました。
解決方法が見つかったので紹介します。
Windows の機能で、以下の画像に示すように Hyper-V と コンテナにチェックを入れます。
特に重要だったのが、 Hyper-V 管理ツールをいれた状態だったようです。
Windows コンテナを起動する
切り替えに成功したら、 Windows コンテナを起動してみます。
まずは pull でイメージを取得します。ここで失敗する場合には切り替えがうまくできていないものと思われます。
C:> docker pull mcr.microsoft.com/windows:2004 2004: Pulling from windows 830e00eda3f1: Pull complete e340f8e3301d: Extracting [=====================================>] 2.06GB/2.06GB
起動は以下のコマンドで実行しました。コンテナの中を見てみるために、オプションを少し変更しています。
docker run --isolation process --device class/5B45201D-F2F2-4F3B-85BB-30FF1F953599 -it mcr.microsoft.com/windows:2004
これで実行するとコンテナ内のコマンドプロンプトが表示されます。このときの様子が以下の画像となりますが、とてもシンプルな C ドライブが見えています。
この状態で GPU が見えているのか調べてみるため、以下のコマンドを実行してみました。一応実デバイスが見えているような結果となりました。
以下は Docker Desktop と上記のコマンドコンソールの図です。
DirectX API についての確認
簡単にですが、Windows コンテナの中から DirectX の初期化ができるのかを調べてみました。
用意したサンプルコードには
- DirectX11 デバイスの初期化
- DirectX12 デバイスの初期化 (コマンドキュー用意は無し)
- スワップチェインの生成テスト
- DirectX11 デバイスと接続して確認
といった内容にしています。スワップチェインの生成にはウィンドウハンドルが必要となるので、非表示ウィンドウも用意しています。
結果は以下のようになりました。サンプルコードを用意したフォルダをコンテナ側と共有するためにマウントして、生成したプログラムを実行したものです。
この結果を見るとデバイスの初期化はできており、スワップチェインの生成にも成功しています。
Windowsコンテナは表示系を現在の画面に出力できないだけで、ウィンドウが作れたりDirectXデバイスの初期化も成功したりしていることがわかりました。