前書き
最近はDocker動かすのにあまり環境を選ばなくなって、便利になってきました。
しかし、Macでは比較的安定してるDockerさん、Windowsでは未だかなり不安定です。
この度GPD WIN 2にDocker for Windowsをセットアップしてみたのですが、落ちる落ちる、というか一度たりともまともに起動できない、、😰
今回こちらを動かせるようにできましたので、レポートをまとめます。
皆さん参考にしていただければ幸いです。
tl;dr
-
C:\Program Files\Docker\Docker\resources
配下のPowerShellスクリプトから、-ComputerName localhost
というキーワードを全て削除する - 同フォルダで
MobyLinux.ps1 -destroy && MobyLinux.ps1 -create
を実行する - Windowsを再起動する
まずは普通にインストールしてみる
64bit版 の Windows 10 Proか、それ以上のエディション 前提です。Homeな方はマイクロソフトにお布施して、Proへ昇格してください。
32bit版や8.1以前な方、、アップグレードするか、Docker Toolboxで幸せになりましょう。
PS Admin> choco install -y docker-desktop
私のPCではChocolateyをインストールしてるので、管理者権限のPowerShellでサクッとインストールしてしまいます。
結果
赤面すれば許してくれるとでも思ったのでしょうか、このポンコツクジラめ、、😌
少なくとも私のGPD WIN 2では一度も起動してくれませんでした。
Docker for WindowsとHyper-Vの再インストール
まず手始めに基本から、ということでDocker for WindowsとHyper-Vを再インストールします。順番は必ず次の順序で行います。
手順
- Docker for Windowsのアンインストール
- Hyper-Vのアンインストール
- Hyper-Vのインストール
- Docker for Windowsのインストール
Docker for WindowsはHyper-Vに依存しているためです。この順番を間違える、、例えばHyper-Vから先にアンインストールすると、こうなります。
Hyper-Vの再インストール
コマンドごとに再起動が必要なので注意。
<# アンインストール(無効化) #>
PS Admin> Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
<# インストール(有効化) #>
PS Admin> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
結果: 変化なし。
ついでなので、Docker for Windowsのリセットも試しましたが駄目です。
Docker ErrorActionPreference
辺りのワードでググってると、いくつか記事が出てきたので試してみます。
Hyper-Vにおける制御フローガードが悪さしている可能性
まず一つ目はHyper-Vのvmcompute.exeに制御フローガードがかかって死ぬ可能性。
“Windowsセキュリティ アプリ” を起動し、次の通りに遷移します。
- アプリとブラウザー コントロール
- Exploit protection の設定 (かなり下のほうにあります)
- プログラム設定 タブ
- C:\WINDOWS\System32\vmcompute.exe > 編集
すると、“制御フローガード (CFG)” の設定がありますので、“☑ システムの上書き” のチェックを外して、適用ボタンを押します。
管理者権限が必要な操作のため、UACが出る場合があるので、必要に応じて昇格してからWindowsを再起動します。
それからDocker for Windowsを動かしてみた結果がこちらです!
、、よろしい、ならば戦争ですね😌
コマンドで強制的に起動させる
次にググって見つけたのが、コマンドで強制的にDocker for Windowsを立ち上げている記事。
コマンド
PS Admin> cd "C:\Program Files\Docker\Docker\resources"
<# Docker for Windows用Dockerサーバーを破棄 #>
PS Admin> .\MobyLinux.ps1 -destroy
<# Docker for Windows用Dockerサーバーを作成 #>
PS Admin> .\MobyLinux.ps1 -create
結果
.\MobyLinux.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Program Files\Docker\Docker\resources\MobyLinux.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」
(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
ですよねー💦
PowerShellスクリプトは、デフォでは実行禁止です。
そこで、少しコマンドに細工を加えます。
PS Admin> cd "C:\Program Files\Docker\Docker\resources"
<# Docker for Windows用Dockerサーバーを破棄 #>
PS Admin> powershell -NoProfile -ExecutionPolicy Unrestricted .\MobyLinux.ps1 -destroy
<# Docker for Windows用Dockerサーバーを作成 #>
PS Admin> powershell -NoProfile -ExecutionPolicy Unrestricted .\MobyLinux.ps1 -create
これでPowerShellスクリプトが動きました。
ただこれでも一筋縄ではいきません。
Hyper-V\Get-VMHost : Hyper-V で、コンピューター 'localhost' 上のオブジェクトにアクセスしようとしましたが、オブジェクトが見つからずエラーが発生しました。オブジェクトは削除された可能性があります。仮想マシン管理サービスがコンピューター上で実行されていることを確認してください。
一体何なのでしょう。。
VHDXのあるフォルダのアクセス権限を取得する
記事では続きがあって、
C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\
上記フォルダを開くとあります。
エクスプローラーで開いてみる
試しにURLをエクスプローラーに貼ってみましたが、そのままでは開けないようなので、“パブリックのドキュメント”から辿ってみます。
すると怪しげなダイアログが、、
アクセス周りでしょうか。権限を取得した状態でもう一度コマンドを実行します。
Hyper-V\Get-VMHost : Hyper-V で、コンピューター 'localhost' 上のオブジェクトにアクセスしようとしましたが、オブジェクトが見つからずエラーが発生しました。オブジェクトは削除された可能性があります。仮想マシン管理サービスがコンピューター上で実行されていることを確認してください。
だめですか。。😌
下記コマンドを実行してから再起動する、という策もググっていたら出てきましたが、こちらも特に効果なしのようです。
PS Admin> mofcomp %SYSTEMROOT%\System32\WindowsVirtualization.V2.mof
localhost
につながらない?
ここでちょっと思い当たることがありまして、下記コマンドを叩いてみました。
PS Admin> Hyper-V\Get-VMHost -ComputerName localhost
Hyper-Vの仮想マシンホスト一覧を取得する関数です。結果は下記の通りでした。
Hyper-V\Get-VMHost : Hyper-V で、コンピューター 'localhost' 上のオブジェクトにアクセスしようとしました
が、オブジェクトが見つからずエラーが発生しました。オブジェクトは削除された可能性があります。仮想マシン管理サービスがコンピューター上で実行されていることを確認してください。
やはり先程と同じエラーメッセージです。
PC名の指定を外してみる
PS Admin> Hyper-V\Get-VMHost
Name LogicalProcessorCount MemoryCapacity(M) VirtualMachineMigrationEnabled
---- --------------------- ----------------- ------------------------------
DESKTOP-xxxxxxx 4 8110.25390625 False
正しい値が取れるようになりました!
ということで、この辺をヒントに再度ググってみたところ、Docker for WindowsのIssueを発見。
I solved it by removing the "-ComputerName" for all commands listed in the file MobyLinux.ps1 in the "function New-MobyLinuxVM { }" and it worked.
ほう。
Docker for WindowsのPowerShellスクリプトを編集する
ということで、不本意ですが、配下フォルダにあるPowerShellスクリプトのうち、Hyper-V\Get-VMHost -ComputerName localhost
を含むコードを探して、Hyper-V\Get-VMHost
へ置き換えてみました。
編集したスクリプトで破棄してみる
PS Admin> powershell -NoProfile -ExecutionPolicy Unrestricted .\MobyLinux.ps1 -destroy
Delete VHD C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\MobyLinuxVM.vhdx
破棄は無事できました!
では生成はどうでしょう、、??
PS Admin> powershell -NoProfile -ExecutionPolicy Unrestricted .\MobyLinux.ps1 -create
Hyper-V\Get-VMHost : Hyper-V で、コンピューター 'localhost' 上のオブジェクトにアクセスしようとしました
が、オブジェクトが見つからずエラーが発生しました。オブジェクトは削除された可能性があります。仮想マシン管理サービスがコンピューター上で実行されていることを確認してください。
🐳さん、、あなたも粘りますね😌
では Get-VMHost
関係なしに、-ComputerName localhost
という記述をすべて削除してみましょうか。
それからまたリトライしてみます。
PS Admin> powershell -NoProfile -ExecutionPolicy Unrestricted .\MobyLinux.ps1 -create
VM created.
、、おおお!?!?
🎉🎉🎉🎉🎉🎉
やりました✨
早速動いているか確認すべく、docker ps
コマンドを叩いてみましょう。
error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.39/containers/json: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.
あれれ、、困ったときはひとまずWindowsを再起動してからリトライしてみましょう。。
無事成功です❗️やったね。
ご視聴ありがとうございました。
それにしても、まさかWindowsでDockerを動かすのがここまで大変とは。。
Mac版くらいに安定して動かせる日が来ることを期待したいです。