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 イメージを扱えるようにするところまで辿り着きたいのだが、なかなかに苦戦したので、その記録を紹介する。
目次
- 本来ならこの手順で何の問題もなく完了するはずだった
- 自分がつまづいたポイントをまとめると、こんな手順になる
- VirtualBox の Host Only Adapter が追加されない問題
- VirtualBox の最新版を入れてみる
- Docker Toolbox というより、VirtualBox をインストールする際の注意点
- Docker Toolbox インストールに関するその他参考文献
- Docker Toolbox の起動は成功するが
unexpected token
とかいうエラーが出る件 - Docker Toolbox の癖がスゴイ
- 以上
本来ならこの手順で何の問題もなく完了するはずだった
まず、公式のガイドラインが紹介している本来の手順で紹介する。公式のガイドなので、コレで何の問題もなく完了するように見えるはずなのだが、そうはいかなかった。
↑ コレがガイドライン。
- OS バージョンを確認しようね。Windows10 Home の 64bit であることを改めて確認。
- タスクマネージャの「パフォーマンス」タブを開き、CPU の「仮想化」が「有効」であることを確認する。
- 次のページから
DockerToolbox-XX.exe
インストーラをダウンロードする。- Releases · docker/toolbox · GitHub
- 本稿執筆時点では v19.03.1 だったので
DockerToolbox-19.03.1.exe
を落とす。
- インストーラを起動し、デフォルトの選択状態のまま進めていく。
- デスクトップなどにできる「Docker Quickstart Terminal」アイコンを開く。
- ターミナルが起動し、自動的に初期設定が始まる。最終的にクジラの AA が表示され、GitBash 的なプロンプトが表示されたら完了。
- 念のため確認。
$ docker run hello-world
と実行して上手くコンソール出力されれば OK。
…以上が手順の全て。大変シンプルなのだが、つまづきポイントが多々あった。
自分がつまづいたポイントをまとめると、こんな手順になる
自分の環境でつまづいたポイントについてはこのあと一つずつ紹介していくが、時系列順にまとめると、以下のように作業していけば、かなり成功率が上がるかと思う。
- 事前準備
- OS バージョン、CPU の仮想化が有効であることの確認は公式どおりに実施する
- VirtualBox をインストールしてあったらアンインストールする
- ユーザホームディレクトリ直下に
.docker/
や.VirtualBox/
ディレクトリが存在する場合は削除しておく C:\Windows\System32\drivers
配下に以下のファイルがあったら削除するVBoxDrv.sys
VBoxNetAdp.sys
VBoxNetFlt.sys
VBoxUSBMon.sys
- レジストリエディタで以下のキー配下を確認し、
VBOX
で始まるフォルダがあったら全て削除する\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\
- 「Windows の機能の有効化または無効化」にて、「Windows サンドボックス」「Windows ハイパーバイザープラットフォーム」「Hyper-V」など、仮想化関連の機能を無効にする
- UAC は「確認しない」に下げておく
- マシンをシャットダウンし、再起動する : 単純な「再起動」ではなく、一度「シャットダウン」するのが確実。以降「再起動」と表現した場合はシャットダウン → 起動、の手順を示す
- マシン起動後、ウイルスバスターなどのアンチウイルスソフトが起動していれば終了させる : 以降の再起動でも都度必須
- MacType をインストールして起動している場合は、終了しておく
- Docker Toolbox のインストーラをダウンロードする
- Docker Toolbox のインストーラを右クリックして「管理者権限で実行」する
Select Components
ではコンポーネントは全て選択するSelect Additional Tasks
でInstall VirtualBox with NDIS5 driver [default NDIS6]
にチェックを入れない- 多くの文献ではこのチェックを入れるよう書かれているが、チェックしても、チェックしなくても成功した
- インストールが失敗してやり直す時、他に失敗する要因が見つからなければココのチェック有無を変えてみる
- インストール後、すぐに「再起動」する。再起動後はアンチウイルスソフトと MacType を終了させる
- 「環境変数」画面を開き、以下のシステム環境変数が設定されているか確認する
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\
(末尾にバックスラッシュ記号が付いていること)
C:\Program Files\Oracle\VirtualBox\
配下にある以下のファイルについて、「互換性」→「互換モード」にチェックを入れ、「Windows 7」を選択するVBoxManage.exe
VBoxHeadless.exe
VBoxNetDHCP.exe
VBoxSVC.exe
VirtualBox.exe
- 「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 の画面上でも作れる、ホストオンリーアダプターというモノを作成するコマンドなのだが、コレが上手く作成できない事象に物凄く苦戦した。
ホストオンリーアダプタが正常に作成されると、「ネットワークと共有センター」から「アダプターの接続を変更」を選択したところにある「ネットワーク接続」画面に、
- VirtualBox Host-Only Network
というネットワークが作成されるはずなのだが、コレが作成されない。
start.sh
を叩いて失敗する場合は、docker-machine create
も VBoxManage hostonlyif create
も同様に失敗するはずで、結局は Docker Toolbox の問題というよりは VirualBox が上手く動いていないのが問題だと分かる。
ホストオンリーアダプターを作成させようとしているプロンプトのところで、「デバイスマネージャー」の「ネットワークアダプター」 を開いてみると、
- VirtualBox Host-Only Ethernet Adapter
というネットワークアダプタが一時作成されるが、ビックリマーク !
アイコンが付いていて、不正なデバイスになっているようである。詳細を見ると、署名がどうこうというエラーが出ていると思う。コレを解消する方法がなかなか分からないでいた。
VirtualBox の最新版を入れてみる
そこで、試しに VirtualBox の最新版を上書きインストールしてみることにした。
- ゴミデータの削除
- VirtualBox を開き、「default」という VM が作成されていたら削除する
- VirtualBox に「ホストオンリーアダプター」が作成されていたら削除する
- ユーザホームディレクトリ直下に
.docker/
や.VirtualBox/
ディレクトリが存在したら削除する C:\Windows\System32\drivers
配下に以下のファイルがあったら削除するVBoxDrv.sys
VBoxNetAdp.sys
VBoxNetFlt.sys
VBoxUSBMon.sys
- レジストリエディタで以下のキー配下を確認し、
VBOX
で始まるフォルダがあったら全て削除する\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\
- 「再起動」し、再起動後はアンチウイルスソフトと MacType を切る
- VirtualBox の最新版のインストーラをダウンロードする
- Downloads – Oracle VM VirtualBox
- 本稿執筆時点では v6.0.14 だったので
VirtualBox-6.0.14-133895-Win.exe
を落とした
- PowerShell を管理者権限で起動する
Win + X
→A
と押下して「PowerShell (管理者)」を開くのが手っ取り早い
- ダウンロードした VirutalBox インストーラのディレクトリに移動し、次のように実行する
PS1> .\VirtualBox-6.0.14-133895-Win.exe -msiparams NETWORKTYPE=NDIS5
- インストーラが起動するので、デフォルトの設定のまま進めていく
- インストール後、すぐに「再起動」し、再起動後はアンチウイルスソフトを切る
- 「Docker Quickstart Terminal」を管理者権限で実行する
コレで上手く行った場合もあったのだが、何が悪かったのかを検証するため、全部アンインストールしてから再度試してみたところ、コレでも上手くいかなくなってしまった。
Docker Toolbox というより、VirtualBox をインストールする際の注意点
前述の自分が成功させるために工夫した手順の中にも書いてはいるが、VirtualBox のインストールを成功させるために注意した点を書き出してみる。
- インストーラや実行ファイルは管理者権限で実行する
- ウイルスバスターなどのアンチウイルスソフトは終了させた状態でインストール・アンインストール作業を行う
- ネットワーク周りの設定を変更するため、ウイルスバスターなどが誤検知するようだ
- MacType を使っている場合は終了させておく
VBox
から始まるプロセスの邪魔をしてしまうので、インストールが完了するまで MacType は切っておく- 全てのインストールが終わって Docker Toolbox が起動しているところで、MacType を起動し、
VBox
で始まるプロセスを全て除外設定することで、以降は MacType が邪魔しなくなる
- インストールやアンインストール作業を行ったら再起動する
- シャットダウンしてから起動、とした方が確実っぽい。少なくとも通常の再起動のオペレーションは必須みたいだ
- 既に VirtualBox がインストールされている環境はアンインストールしておくと成功しやすい
- インストールに失敗してやり直す時は、ホームディレクトリや
drivers
ディレクトリ、レジストリなどに残るゴミファイルを消してから再トライする - VirtualBox の実行ファイル系に互換設定を行うと良い
以下に参考文献をまとめて書いておくが、特に参考になったのは以下の記事だった。
- windows10でDocker Toolboxのエラーとインストール【ざっくり手順あり】 - This is a Pen
- windows10でなぜDockerがVirtualBoxで繋がらないのか - This is a Pen
自分はココまで色々注意して何とか成功に辿り着いた。
Docker Toolbox インストールに関するその他参考文献
- windows 10 home で docker を導入するメモ - Qiita
- Windows10マシンにDocker Toolbox を入れて個人用の開発環境を作る - Qiita
- Docker Toolbox の最も簡単なインストール手順、すんなり行ってる例
- Windows10 Home 64bit でDockerするならWindows10 ProかBizspark! – AMAZON AWS/Microsoft Azure/WordPress | ニシインターナショナル
- Docker Toolbox つらみ
- Docker Toolboxインストールでエラーを解決 - lisz-works
- 「Windows の機能の有効化または無効化」で「Hyper-V」をオフにする
- 開発環境の準備 - Dockerでの開発環境構築 - Ryunosuke HAMADA
- Docker を使ってみるの巻 – 8GtestSite
- Dockerによるアプリケーション開発環境構築ガイド - 櫻井洋一郎, 村崎大輔 - Google ブックス
Install VirtualBox with NDIS5 driver [default NDIS6]
にチェックを入れよ、という記事
- arm-lab: DockerをWindows10で使ってみる
Install VirtualBox with NDIS5 driver [default NDIS6]
にチェックは要らないかも、という記事
- How to install VirtualBox 5 so it will use the old NDIS5 network driver, instead of the not-working version 6. · GitHub
- VirtualBox インストール時に
-msiparams NETWORKTYPE=NDIS5
オプションを指定する
- VirtualBox インストール時に
- virtualbox - Docker: Looks something went wrong in step Looking for vboxmanage.exe - Stack Overflow
- 環境変数
VBOX_MSI_INSTALL_PATH
に指定するフォルダパスの末尾にはバックスラッシュが必要。start.sh
の中で、VBOXMANAGE="${VBOX_MSI_INSTALL_PATH}VBoxManage.exe"
というようにスクリプトを書いており、バックスラッシュがないとうまくパスが解釈されない。 - 参考 : toolbox/start.sh at d8907fbc3f7e69f2ad1afe04fc63f3bdc9d87708 · docker/toolbox · GitHub
- 環境変数
- How to Fix USB Error Digital Signature (Code 52) Error - Appuals.com
- VirtualBox インストール時はウイルスバスターを停止しておく必要がある
- Docker Quickstart Terminalのエラー発生(Looks like something went wrong)について - Qiita
start.sh
のclear
コマンドが邪魔している場合はコメントアウトする- 参考 : toolbox/start.sh at d8907fbc3f7e69f2ad1afe04fc63f3bdc9d87708 · docker/toolbox · GitHub
- 古いネットワークアダプタ情報が削除出来ない - マイクロソフト コミュニティ
- ネットワークアダプタは「ネットワーク接続」画面ではなく「デバイスマネージャ」から削除できる
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
コマンドが動作するようにはなったのだが、キモいので原因を調べてみた。
問題は
C:\Program Files\Docker Toolbox\start.sh
このファイルの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 ps
や docker run hello-world
などは大丈夫だったのだが、
$ docker run -it centos:7 bash
のように対話プロンプトに移るコマンドを実行した時に、結果が出力されなくて困った。
GitBash を使っている場合、対話プロンプトを正常に動かすには winpty
をかませるのはよくあることで、Docker コマンドもそうだろうと思って設定したのだが、winpty
をかませてもダメだった。winpty
との相性悪し。
- 参考 : Git for Windowsでdocker execをwinptyなしで実行する - Qiita
- この辺は効果なし。
VSCode 上のターミナルペインで、同じ Git SDK を使って動かしてみると、winpty
なしで正常に動いた。なんだこりゃ。しかし VSCode は、ターミナルからデタッチする時の Ctrl + P
→ Ctrl + 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つの原因が分かった。
- ディレクトリパスの先頭にもう一つスラッシュ
/
を書かないといけない$ docker run -v /$(pwd):/data -it centos:7 bash
(pwd の手前に/
がついてる)$ docker run -v //c/Users/Neo/data:/data -it centos:7 bash
(フルパスをベタ書きした場合だと、こういう風に書かないといけない)
- ユーザホームディレクトリ配下でないとマウントできない
- 当初自分は
-v //c/Neos21/docker-example/data:/data
のように、C ドライブ直下のNeos21/
フォルダ配下をマウントしようとしていた - しかし、ユーザホームディレクトリ配下、つまり
//c/Users/Neo/
配下でないとマウントできないようだ。
- 当初自分は
というワケで、
$ docker run -v //c/Users/Neo/data:/data -it centos:7 bash
という書き方・マウントパスであれば、正常にマウントできた。
- 参考 : docker: windowsホストディレクトリがマウント出来ない件 | yuipro
-
"docker tool box"の場合,
//c/Users/
以下ディレクトリでないとマウントできない.
-
- 参考 : Docker for Windowsを試してみた - 初老のボケ防止日記
-
実はこれはGit bashのせい。スラッシュで始まるパス文字列の先頭にスラッシュをつけると回避できる。
- 参考 : How do I pass an absolute path to the adb command via git bash for windows? - Stack Overflow
-
以上
かなり苦戦したが、とりあえずコレで Windows10 Home でも Docker を使えるようになった。
自分は MacBook と Windows10 Pro マシン (ZenBook) も持っていて、MacOS はホントにストレスなく Docker for Mac が正常に動くし、Windows10 Pro における Docker for Windows も全然問題なし。Win10 Home はホントにしんどかった…。