Apple SiliconのMac上でDockerを使ってWindowsを動かす
タイトルが悩ましかったんですが、要はDockerコンテナ上でGUI含むちゃんとした(?)Windows環境を使うにはどうするかってことで、お金かけていい人はParallels使えばいいし、自分でいろいろできちゃう人はUTM使えばいいじゃんってことなんだけど、そうじゃなくてたとえば授業とか講習とかで一律な環境を不特定多数に(不特定OS環境下で)使わせたいっていう場合の一助になる感じです。
私はセキュリティ関連の検証環境・演習環境等で、ずっとVirtualBoxの仮想マシンにお世話になることが多かったのですが、Apple Siliconの登場以降MacでVirtualBoxを使って・・・というのが非常にやりにくくなってしまった。というかできん。UTMを使った仮想マシンの構築が最近はかなりこなれてきたみたいで、UbnutuはもちろんWindowsのインストールも結構いけるようになってきたみたいだけど、ネットワークも含めいろいろdocker使って構築してきた身としては、コンテナ環境でWindowsも含めた複数のOSでデスクトップ環境まで動かせるようにしたいよねっていうのは一つの目標で、どんな環境でも(WindowsでもMacでも)同じアナウンスで演習環境を提供できるようにしたいというのもあって、いろいろ模索してる中でこんなの見つけました。
これはほんとにできたらなかなか面白そうだな、ということで試してみたので、noteにしたためようと思います。QEMUのコンテナとか絡めていろいろ裏でごにょごにょやってる感じなので、コンテナのメリットである軽快さや即時起動とかという形でなく、かなりVMライクに動いてるし決して快適にサクサク動く!とかじゃないけど、winの人にもmacの人にも(ubuntuとかLinux環境でも)統一した環境を提供するには一つの選択肢になり得るかもしれないです。
検証環境
本体:MacBook Pro 16インチ 2023
チップ:Apple M2 Max
メモリ:64GB
ストレージ:1TB
OS:MacOS Sonoma 14.0
準備
DockerおよびDocker composeが使えるようにしておく必要があります。このへんはDocker Desktopをつかうのが手っ取り早いかな?公式ドキュメント参照。なお、Windowsを動かすのでリソースは多めに使えるようにしておくと良いです。CPUとかメモリとか結構デフォルトで思ったより制限されてるので、Docker Desktopの設定で余裕持っておくと◎
そしたらgitからローカルに持ってきちゃいましょう。あ、gitが入ってない場合(gitコマンド使えない場合)はこれも必要か。ちなみにこれは別に任意です。docker composeの仕組みわかってるなら自分でymlファイル作ればいいだけなので、やらなくてもいい。あくまで簡単にするために。
% git clone https://github.com/dockur/windows.git
Cloning into 'windows'...
remote: Enumerating objects: 718, done.
remote: Counting objects: 100% (32/32), done.
remote: Compressing objects: 100% (22/22), done.
remote: Total 718 (delta 15), reused 25 (delta 10), pack-reused 686
Receiving objects: 100% (718/718), 481.45 KiB | 17.19 MiB/s, done.
Resolving deltas: 100% (464/464), done.
早速トライ!?
"windows"フォルダができあがるので、cd windowsで移動して、手っ取り早くdocker runでできるかやってみます。
% docker run -it --rm --name wincontainer -p 8006:8006 --device=/dev/kvm --cap-add NET_ADMIN --stop-timeout 120 dockurr/windows
docker: Error response from daemon: error gathering device information while adding custom device "/dev/kvm": no such file or directory.
はいエラーですね。まあよく読めばその通りなのですが、gitのIssueに同じことが書いてあったので、Docker composeのほうでできるように設定変更してみます。
インストール
windowsフォルダ内のdocker-compose.ymlを少しだけ変更して以下の様にしました。
version: "3"
services:
windows:
image: dockurr/windows
container_name: wincontainer
environment:
KVM: "N"
RAM_SIZE: "16G"
CPU_CORES: "8"
cap_add:
- NET_ADMIN
ports:
- 8006:8006
- 3389:3389/tcp
- 3389:3389/udp
stop_grace_period: 2m
restart: on-failure
KVM使わないよって感じですかね。RAMとCPUの値は、デフォルトだと心許ない数値になっているようなので引き上げられるように追加してみました。ここは任意の値でいいと思いますが、やっぱ最低でもメモリ8Gは欲しいところ。あ、container_nameのところも任意の名前にしてわかりやすくしておくと良いかもです。
これで動かしてみましょう。
% docker-compose up
[+] Running 1/0
✔ Container wincontainer Created 0.0s
Attaching to wincontainer
wincontainer | ❯ Starting Windows for Docker v2.04...
wincontainer | ❯ For support visit https://github.com/dockur/windows
wincontainer |
wincontainer | ❯ Downloading Windows 11...
wincontainer | [i] Downloading Windows media from official Microsoft servers...
wincontainer | [i] Downloading Windows 11...
wincontainer | [+] Got latest ISO download link (valid for 24 hours): https://software.download.prss.microsoft.com/dbazure/Win11_23H2_English_x64v2.iso?t=39af68c3-e281-424f-ab32-6dfc5458e0f3&P1=1709717522&P2=601&P3=2&P4=XHuMG0fx90gVa3cXYKEs7WpmWKYtak9%2bY16xMBXVtlFmduWWpM6I2PzCnBWuOCsAFcJes2axXxIsCmV1%2bdI4fae%2bOgUaF8N3sLzz252njvv5XPB3eQbjGw5spcfA6Xgr4PN23dUOtExItR6EBuLilkFjhD6Zl2%2fKTzQzsUl7uCuOoXeQLkFbXIZrcka%2bOu19nWAM8OjPuefsWSt7%2b3ABojIqtycAXBiKGcdb7cnIk%2fnvWG6do4FmTwRs26e639b9Aisa1n1JIo%2fHRL7xs6EHHuHGVPcchWsI%2bBlFRPt0rf7fBT1NoXvBuNtjN%2b4q6%2bZ0Y42Yp2wEHQo6KnjByaiq
wincontainer | curl: (22) The requested URL returned error: 403
wincontainer |
wincontainer | [!] Microsoft servers returned a failing HTTP status code!
wincontainer |
wincontainer | [!] 1 attempted download(s) failed! Please re-run Mido with these arguments to try downloading again (any partial downloads will be resumed): win11x64
wincontainer | [+] Finished! Please see the above errors with information
wincontainer | ❯ Failed to download Windows 11 using Mido, will try a different method now...
wincontainer | ❯ Downloading product information from Microsoft...
wincontainer | ❯ Downloading Windows 11...
wincontainer |
wincontainer | 0K ........ ........ ........ ........ 0% 45.3M 1m42s
wincontainer | 32768K ........ ........ ........ ........ 1% 54.9M 92s
wincontainer | 65536K ........ ........ ........ ........ 2% 48.0M 93s
wincontainer | 98304K ........ ........ ........ ........ 2% 55.4M 89s
wincontainer | 131072K ........ ........ ........ ........ 3% 55.8M 87s
wincontainer | 163840K ........ ........ ........ ........ 4% 55.7M 85s
wincontainer | 196608K ........ ........ ........ ........ 4% 54.7M 84s
wincontainer | 229376K ........ ........ ........ ........ 5% 48.1M 85s
wincontainer | 262144K ........ ........ ........ ........ 6% 54.7M 83s
wincontainer | 294912K ........ ........ ........ ........ 6% 47.9M 84s
wincontainer | 327680K ........ ........ ........ ........ 7% 52.5M 83s
wincontainer | 360448K ........ ........ ........ ........ 8% 55.4M 82s
wincontainer | 393216K ........ ........ ........ ........ 8% 47.4M 82s
wincontainer | 425984K ........ ........ ........ ........ 9% 55.8M 81s
wincontainer | 458752K ........ ........ ........ ........ 10% 55.7M 80s
wincontainer | 491520K ........ ........ ........ ........ 11% 48.4M 80s
wincontainer | 524288K ........ ........ ........ ........ 11% 39.2M 80s
こんな感じでなにやら動き始めて、windowsのイメージがダウンロードされてきます。ちなみにwindowsのバージョンもかなりバリエーション用意されてて、gitのページで選べるものが一覧になっているので、必要に応じて確認しておいてください。
しばらくするとダウンロードが終わって、セットアップに入ります。ここまできてるとブラウザから指定してたポートにアクセス(デフォルトで8006)すると、画面が確認できるはず。さらにしばらく待つとWindowsの自動インストールが走ってるのがわかります。これだけでも結構感動。
しばらく時間はかかりますが、インストールが済むと通常のマシン同様Windowsが起動してきます(すげー!)。自動インストールなので基本ほっとけばここまでくるはず。
ちなみにこの際、ターミナルはこんな状態になってます。
設定とか
このままnoVNCによるブラウザ経由の接続でもいいし、別途ソフトがいらないという意味だと一律な対応を求める場合は十分だと思いますが、githubのページでも画質は低めでクリップボードとか使えんからあくまでインストール中に使ってるだけやで、って言ってるので、↓を使ってRDPでも接続してみます。Macじゃない場合は適宜RDPで接続できる何かでやってもらえれば大丈夫。のはず。
接続先はlocalhostで設定すればOK。複数台立ち上げる場合はポート設定とかが被らないようにしてコンテナ立ち上げとくと行けるはず。
ちょっと一瞬待ったけど無事つながりました!しばらくいろいろさわってみたりしたけど、安定して動いてます。安定して動いてるってのが結構驚きで、今までもいろいろなパターンで試したりしましたが、なかなかに不安定なことが多くて使い物にならなかった。けどこれは今のところ安定性はすごいです。なおデフォルトは英語版ですが、言語設定追加&変更で日本語環境も問題なくいけます。
しっかり動いてくれてる。windows側でリソース見ると、平時でメモリを2GBぐらいしか使ってない。Mac側からDocker Desktopのリソースモニタ見てみると、しっかりメモリを16GB以上使ってました。Windowsへの割り当ては16GBで、コンテナでトータル32GBまでは使えるようにしてるのですが、動作はサクサクとはいかないです。
アプリ起動時とかのオーバーヘッドがかなり大きい感じなので、メモリの問題じゃなさそうですね。いろいろ裏で走ってる感じなので仕方ない。でも目的としてはとりあえずスタートラインに到達できた!って感じでしょうか。
いろいろ環境の違いはフォレンジック系のツールなど動かすと出てくるかもしれない。
また、ネットワーク組んで脆弱性検査とかしてもネイティブなWindows環境とは結構違った結果が見えてきたりする可能性あると思ってますが、ちょっとDocker Desktopのネットワーク周りはかなり使いにくくないかい?Windows/Macだとmacvlanも使えないみたいで、なかなか思い通りの構成になってくれない。そもそもdockerのネットワークは少々わかりにくいのにこれは不便だな・・・。
Ubuntuの環境でmacvlanネットワークを構成してあげると、そこそこわかりやすくネトワーク組めると思いますが、ちょっとこの辺も含めてある程度知識ないと難しいかもしれませんね。
試しにOpenVASコンテナからwindowsに簡易検査したらちゃんとできたのですが、これはUbuntuサーバ上でやってるので、通常使ってるであろうWindowsやMacを使って作るにはやっぱり仮想マシン上でUbuntu動かして・・・とかちょっと面倒なことにならざるを得ないのか結局。ちょっとメモリもそれなりに潤沢じゃないときつそうです。
が、まあ、できなくはないってことはわかったので、仮想マシン何台も起動して・・・とかよりはまだマシなんだろう。きっと。Windowsはいろいろサービス落として、最低限の必要なものだけで動かしてイメージ固めればもうちょっとマシになるかもしれないし。
いろいろ不十分な部分はあるけど、可能性は広がるということでもうちょっと遊んでみます。