Windows10 Home に Docker Toolbox を使って Docker をインストールするまでの戦いの記録

Windows10 Home は Hyper-V が使えないため、通常の Docker for Windows はインストールできない。Docker for Windows が対応しているのは Windows10 Pro なのだ。

そんな残念な Windows10 Home のために用意されているのが、VirtualBox を組み合わせて Docker を動かす、Docker Toolbox というツールだ。VirtualBox 上に、Docker が使用する基本 VM を立てて (docker-machine) 使用するという構成だ。

今回はこの Docker Toolbox を使って、Windows10 Home 上で最終的に docker コマンドが使えて Docker イメージを扱えるようにするところまで辿り着きたいのだが、なかなかに苦戦したので、その記録を紹介する。

目次

本来ならこの手順で何の問題もなく完了するはずだった

まず、公式のガイドラインが紹介している本来の手順で紹介する。公式のガイドなので、コレで何の問題もなく完了するように見えるはずなのだが、そうはいかなかった。

↑ コレがガイドライン。

  1. OS バージョンを確認しようね。Windows10 Home の 64bit であることを改めて確認。
  2. タスクマネージャの「パフォーマンス」タブを開き、CPU の「仮想化」が「有効」であることを確認する。
  3. 次のページから DockerToolbox-XX.exe インストーラをダウンロードする。
  4. インストーラを起動し、デフォルトの選択状態のまま進めていく。
  5. デスクトップなどにできる「Docker Quickstart Terminal」アイコンを開く。
  6. ターミナルが起動し、自動的に初期設定が始まる。最終的にクジラの AA が表示され、GitBash 的なプロンプトが表示されたら完了。
  7. 念のため確認。$ docker run hello-world と実行して上手くコンソール出力されれば OK。

…以上が手順の全て。大変シンプルなのだが、つまづきポイントが多々あった。

自分がつまづいたポイントをまとめると、こんな手順になる

自分の環境でつまづいたポイントについてはこのあと一つずつ紹介していくが、時系列順にまとめると、以下のように作業していけば、かなり成功率が上がるかと思う。

  1. 事前準備
    1. OS バージョン、CPU の仮想化が有効であることの確認は公式どおりに実施する
    2. VirtualBox をインストールしてあったらアンインストールする
    3. ユーザホームディレクトリ直下に .docker/.VirtualBox/ ディレクトリが存在する場合は削除しておく
    4. C:\Windows\System32\drivers 配下に以下のファイルがあったら削除する
      • VBoxDrv.sys
      • VBoxNetAdp.sys
      • VBoxNetFlt.sys
      • VBoxUSBMon.sys
    5. レジストリエディタで以下のキー配下を確認し、VBOX で始まるフォルダがあったら全て削除する
      • \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\
    6. 「Windows の機能の有効化または無効化」にて、「Windows サンドボックス」「Windows ハイパーバイザープラットフォーム」「Hyper-V」など、仮想化関連の機能を無効にする
    7. UAC は「確認しない」に下げておく
    8. マシンをシャットダウンし、再起動する : 単純な「再起動」ではなく、一度「シャットダウン」するのが確実以降「再起動」と表現した場合はシャットダウン → 起動、の手順を示す
    9. マシン起動後、ウイルスバスターなどのアンチウイルスソフトが起動していれば終了させる : 以降の再起動でも都度必須
    10. MacType をインストールして起動している場合は、終了しておく
  2. Docker Toolbox のインストーラをダウンロードする
  3. Docker Toolbox のインストーラを右クリックして「管理者権限で実行」する
  4. Select Components ではコンポーネントは全て選択する
  5. Select Additional TasksInstall VirtualBox with NDIS5 driver [default NDIS6] にチェックを入れない
    • 多くの文献ではこのチェックを入れるよう書かれているが、チェックしても、チェックしなくても成功した
    • インストールが失敗してやり直す時、他に失敗する要因が見つからなければココのチェック有無を変えてみる
  6. インストール後、すぐに「再起動」する。再起動後はアンチウイルスソフトと MacType を終了させる
  7. 「環境変数」画面を開き、以下のシステム環境変数が設定されているか確認する
    • DOCKER_MACHINE : C:\Program Files\Docker Toolbox\docker-machine.exe
    • DOCKER_TOOLBOX_INSTALL_PATH : C:\Program Files\Docker Toolbox
    • VBOX_MSI_INSTALL_PATH : C:\Program Files\Oracle\VirtualBox\ (末尾にバックスラッシュ記号が付いていること)
  8. C:\Program Files\Oracle\VirtualBox\ 配下にある以下のファイルについて、「互換性」→「互換モード」にチェックを入れ、「Windows 7」を選択する
    • VBoxManage.exe
    • VBoxHeadless.exe
    • VBoxNetDHCP.exe
    • VBoxSVC.exe
    • VirtualBox.exe
  9. 「Docker Quickstart Terminal」アイコンを右クリックして「管理者権限で実行」する
    • 初期設定の中で、一瞬ダイアログが表示されてすぐに消えるのは、Docker Toolbox が自動的に何かやっているだけなので、気にしなくて OK

コレですんなりとクジラの AA が表示されれば成功。

自分はこの結論にたどり着くまでなかなか時間がかかった。以下は自分が遭遇したトラブルと、解消に至るまで試行錯誤した情報を載せておく。

VirtualBox の Host Only Adapter が追加されない問題

Docker Quickstart Terminal を実行すると、以下のようなエラーが発生して、コレに数時間つまづいた。

Creating CA: C:\Users\Neo\.docker\machine\certs\ca.pem
Creating client certificate: C:\Users\Neo\.docker\machine\certs\cert.pem
Running pre-create checks...
(default) Image cache directory does not exist, creating it at C:\Users\Neo\.docker\machine\cache...
(default) No default Boot2Docker ISO found locally, downloading the latest release...
(default) Latest release for github.com/boot2docker/boot2docker is v19.03.4
(default) Downloading C:\Users\Neo\.docker\machine\cache\boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v19.03.4/boot2docker.iso...
(default) 0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100%
Creating machine...
(default) Copying C:\Users\Neo\.docker\machine\cache\boot2docker.iso to C:\Users\Neo\.docker\machine\machines\default\boot2docker.iso...
(default) Creating VirtualBox VM...
(default) Creating SSH key...
(default) Starting the VM...
(default) Check network to re-create if needed...
(default) Windows might ask for the permission to create a network adapter. Sometimes, such confirmation window is minimized in the taskbar.
(default) Creating a new host-only adapter produced an error: C:\Program Files\Oracle\VirtualBox\VBoxManage.exe hostonlyif create failed:
(default) 0%...
(default) Progress state: E_FAIL
(default) VBoxManage.exe: error: Failed to create the host-only adapter
(default) VBoxManage.exe: error: Querying NetCfgInstanceId failed (0x00000002)
(default) VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component HostNetworkInterfaceWrap, interface IHostNetworkInterface
(default) VBoxManage.exe: error: Context: "enum RTEXITCODE __cdecl handleCreate(struct HandlerArg *)" at line 94 of file VBoxManageHostonly.cpp
(default)
(default) This is a known VirtualBox bug. Let's try to recover anyway...
Error creating machine: Error in driver during machine creation: Error setting up host only network on machine start: The host-only adapter we just created is not visible. This is a well known VirtualBox bug. You might want to uninstall it and reinstall at least version 5.0.12 that is is supposed to fix this issue
Looks like something went wrong in step ´Checking if machine default exists´... Press any key to continue...

Failed to create the host-only adapter とか言ってる。

他に再インストール等を繰り返した時は、以下のようなエラーのバリエーションも出た。

Starting "default"...
(default) Check network to re-create if needed...
Error setting up host only network on machine start: C:\Program Files\Oracle\VirtualBox\VBoxManage.exe list hostonlyifs failed:
VBoxManage.exe: error: Code E_ACCESSDENIED (0x80070005) - General access denied error (extended info not available)
VBoxManage.exe: error: Context: "FindHostNetworkInterfacesOfType(HostNetworkInterfaceType_HostOnly, ComSafeArrayAsOutParam(hostNetworkInterfaces))" at line 138 of file VBoxManageList.cpp
Looks like something went wrong in step ´Checking status on default´... Press any key to continue...
Running pre-create checks...
Error with pre-create check: "C:\\Program Files\\Oracle\\VirtualBox\\VBoxManage.exe list hostonlyifs failed:\nVBoxManage.exe: error: Code E_ACCESSDENIED (0x80070005) - General access denied error (extended info not available)\r\nVBoxManage.exe: error: Context: \"FindHostNetworkInterfacesOfType(HostNetworkInterfaceType_HostOnly, ComSafeArrayAsOutParam(hostNetworkInterfaces))\" at line 138 of file VBoxManageList.cpp\r\n"
Looks like something went wrong in step ´Checking if machine default exists´... Press any key to continue...

Docker Quickstart Terminal の実体は、Docker Toolbox インストールディレクトリの直下にある start.sh だ。

この start.sh 内で、最終的に

# -d は --driver の略
$ docker-machine create -d virtualbox default

というコマンドを実行している。コレは、Docker が使用する VirtualBox イメージを作成するためのコマンドだ。

そしてこのコマンドの内部では、VirtualBox の以下のようなコマンドが実行されている。

$ VBoxManage.exe hostonlyif create

コレは、VirtualBox の画面上でも作れる、ホストオンリーアダプターというモノを作成するコマンドなのだが、コレが上手く作成できない事象に物凄く苦戦した。

ホストオンリーアダプタが正常に作成されると、「ネットワークと共有センター」から「アダプターの接続を変更」を選択したところにある「ネットワーク接続」画面に、

というネットワークが作成されるはずなのだが、コレが作成されない。

start.sh を叩いて失敗する場合は、docker-machine createVBoxManage hostonlyif create も同様に失敗するはずで、結局は Docker Toolbox の問題というよりは VirualBox が上手く動いていないのが問題だと分かる。

ホストオンリーアダプターを作成させようとしているプロンプトのところで、「デバイスマネージャー」の「ネットワークアダプター」 を開いてみると、

というネットワークアダプタが一時作成されるが、ビックリマーク ! アイコンが付いていて、不正なデバイスになっているようである。詳細を見ると、署名がどうこうというエラーが出ていると思う。コレを解消する方法がなかなか分からないでいた。

VirtualBox の最新版を入れてみる

そこで、試しに VirtualBox の最新版を上書きインストールしてみることにした。

  1. ゴミデータの削除
    1. VirtualBox を開き、「default」という VM が作成されていたら削除する
    2. VirtualBox に「ホストオンリーアダプター」が作成されていたら削除する
    3. ユーザホームディレクトリ直下に .docker/.VirtualBox/ ディレクトリが存在したら削除する
    4. C:\Windows\System32\drivers 配下に以下のファイルがあったら削除する
      • VBoxDrv.sys
      • VBoxNetAdp.sys
      • VBoxNetFlt.sys
      • VBoxUSBMon.sys
    5. レジストリエディタで以下のキー配下を確認し、VBOX で始まるフォルダがあったら全て削除する
      • \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\
    6. 「再起動」し、再起動後はアンチウイルスソフトと MacType を切る
  2. VirtualBox の最新版のインストーラをダウンロードする
  3. PowerShell を管理者権限で起動する
    • Win + XA と押下して「PowerShell (管理者)」を開くのが手っ取り早い
  4. ダウンロードした VirutalBox インストーラのディレクトリに移動し、次のように実行する
    • PS1> .\VirtualBox-6.0.14-133895-Win.exe -msiparams NETWORKTYPE=NDIS5
  5. インストーラが起動するので、デフォルトの設定のまま進めていく
  6. インストール後、すぐに「再起動」し、再起動後はアンチウイルスソフトを切る
  7. 「Docker Quickstart Terminal」を管理者権限で実行する

コレで上手く行った場合もあったのだが、何が悪かったのかを検証するため、全部アンインストールしてから再度試してみたところ、コレでも上手くいかなくなってしまった。

Docker Toolbox というより、VirtualBox をインストールする際の注意点

前述の自分が成功させるために工夫した手順の中にも書いてはいるが、VirtualBox のインストールを成功させるために注意した点を書き出してみる。

以下に参考文献をまとめて書いておくが、特に参考になったのは以下の記事だった。

自分はココまで色々注意して何とか成功に辿り着いた。

Docker Toolbox インストールに関するその他参考文献

Docker Toolbox の起動は成功するが unexpected token とかいうエラーが出る件

さて、何とか VirtualBox の問題は解消して、クジラの AA は出たのだが、そのすぐ後に以下のようなエラーメッセージが出力されてしまった。

bash: C:\Program Files\Docker Toolbox\start.sh: line 104: syntax error near unexpected token `('
Looks like something went wrong in step ´Finalize´... Press any key to continue...

このあとキーを入力してプロンプトを閉じたあと、別のターミナルで docker コマンドが動作するようにはなったのだが、キモいので原因を調べてみた。

問題は

このファイルの104行目にある以下のコード。

docker () {
  MSYS_NO_PATHCONV=1 docker.exe "$@"
}
export -f docker

ココの docker () 部分の手前に function を付け足し、以下のようにするとエラーが解消された。

function docker () {
  MSYS_NO_PATHCONV=1 docker.exe "$@"
}
export -f docker

コレでエラーを解消すると、Docker Quickstart Terminal はクジラの AA の後に GitBash を表示してくれる。

Docker Toolbox の癖がスゴイ

やっとインストールが完了したので、少し動作確認してみた。

Docker と winpty の相性が悪い

Docker Quickstart Terminal を起動し、バックグラウンドで VirtualBox と Docker Toolbox を起動させておいたら、Docker Quickstart Terminal は閉じて、いつも使っている Git SDK を開いてみた。

そこで docker コマンドを使うと、docker psdocker run hello-world などは大丈夫だったのだが、

$ docker run -it centos:7 bash

のように対話プロンプトに移るコマンドを実行した時に、結果が出力されなくて困った。

GitBash を使っている場合、対話プロンプトを正常に動かすには winpty をかませるのはよくあることで、Docker コマンドもそうだろうと思って設定したのだが、winpty をかませてもダメだった。winpty との相性悪し。

VSCode 上のターミナルペインで、同じ Git SDK を使って動かしてみると、winpty なしで正常に動いた。なんだこりゃ。しかし VSCode は、ターミナルからデタッチする時の Ctrl + PCtrl + Q キー入力が、コマンドパレットを開くショートカットと衝突し、少々操作がやりづらい。

また、Docker Quickstart Terminal を使う分には winpty は不要で正常に動いた。どうもこの Docker Quickstart Terminal は、コマンドプロンプト上で GitBash を起動する、いわゆる「Git CMD」に近いモノのようだ。

というワケで、docker コマンドを使う際は、自前の Git SDK なんかは使わず、素直に Docker Quickstart Terminal を使っておくのが安定するだろう。

-v オプションで Windows ホストディレクトリをマウントするには

ひとまず、Docker Quickstart Terminal で $ docker run -it centos:7 bash などは動作したので、続いて

$ docker run -v $(pwd):/data -it centos:7 bash

のようにして、-v (--volume) オプションで現在のディレクトリをマウントしてみた。

すると、コンテナは起動するのだが、/data ディレクトリ配下が空になっていた。マウントに失敗しているようだ。

調べたところ、2つの原因が分かった。

  1. ディレクトリパスの先頭にもう一つスラッシュ / を書かないといけない
    • $ docker run -v /$(pwd):/data -it centos:7 bash (pwd の手前に / がついてる)
    • $ docker run -v //c/Users/Neo/data:/data -it centos:7 bash (フルパスをベタ書きした場合だと、こういう風に書かないといけない)
  2. ユーザホームディレクトリ配下でないとマウントできない
    • 当初自分は -v //c/Neos21/docker-example/data:/data のように、C ドライブ直下の Neos21/ フォルダ配下をマウントしようとしていた
    • しかし、ユーザホームディレクトリ配下、つまり //c/Users/Neo/ 配下でないとマウントできないようだ。

というワケで、

$ docker run -v //c/Users/Neo/data:/data -it centos:7 bash

という書き方・マウントパスであれば、正常にマウントできた。

以上

かなり苦戦したが、とりあえずコレで Windows10 Home でも Docker を使えるようになった。

自分は MacBook と Windows10 Pro マシン (ZenBook) も持っていて、MacOS はホントにストレスなく Docker for Mac が正常に動くし、Windows10 Pro における Docker for Windows も全然問題なし。Win10 Home はホントにしんどかった…。