Windows コンテナを動かしてみる

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デバイスの初期化も成功したりしていることがわかりました。

今回コンテナの実行形態が、VM(仮想マシン)ではなくプロセス分離モードです。そのため、 RDP による画面接続はできません。

Hyper-V プログラミング
すらりんをフォローする
すらりん日記

コメント

タイトルとURLをコピーしました