いがにんのぼやき

若手WEBエンジニアのブログ。IT、WEB、バンド、アニメ。

WindowsでDocker toolboxを使用してVisual Studioと連携しようとして失敗した

まず言っておこう。
Docker for Windowsを使おうな!!!

事の発端

最初は僕もDocker for Windowsを素直に使ってみようと思っていた。

Docker Store

上記からDocker Community Edition for Windowsを入手し、インストール。
インストールを進めていたところ、下記のようなエラーに遭遇した。

f:id:igatea:20171210043903p:plain

Hyper-Vがないために発生するエラーのようだ。
どれどれ、Hyper-Vをインストールしようじゃないか。
よしよし、このリンクにインストール方法が載っているぞ。

docs.microsoft.com

 

ん?

 

f:id:igatea:20171211161024p:plain

 

は?

 

f:id:igatea:20171211161258p:plain

 

 

はああああ~~~~~~~!!!???

 

PC購入当時、1万円をケチったことを後悔していく。
Docker for WindowsではHyper-Vが必要で、Windows Home Editionでは動作させる方法がない。
そんなとこからHome Editionでも使用可能なDocker toolboxを使用してみる。

ここからはただただ心を折っていく出来事に立ち向かい、心が折れていく様を記載するだけである。

失敗

一度、最終的なゴールに立ち返ってみる。
最終的にはVisual Studio 2017 CommunityでASP.NET CoreのDockerコンテナの実行を可能にしようというものだ。
新規でASP.NET Coreプロジェクトを作成し、デバッグ無しで実行を正常に行うことができるようにする。
それに向かっていきながら発生したエラーを叩き潰していくという作業を行っていった。
Docker toolbox自体のインストールは事前に済ましておいた。

Powershellにパスを通す

PowershellにはDockerのパスが通っていないので、パスを通す。

github.com

docker-machine env default | Invoke-Expression

Dockerが実行されていない

Visual Studioからサンプルアプリケーションを作成し、デバッグ無しで実行しようとしてみると下記のエラーが発生。

重大度レベル   コード   説明  プロジェクト  ファイル    行 抑制状態
エラー       Visual Studio コンテナー ツールでは、コンテナー化されたプロジェクトをビルド、デバッグ、実行する前に、Docker が実行されている必要があります。

詳細については、http://aka.ms/DockerToolsTroubleshooting をご覧ください  docker-compose  C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Sdks\Microsoft.Docker.Sdk\build\Microsoft.VisualStudio.Docker.Compose.targets 314 
1>------ ビルド開始: プロジェクト: docker-compose, 構成: Debug Any CPU ------
1>docker ps --filter "status=running" --filter "name=dockercompose16224944752208736737_dotnetcore02_" --format {{.ID}} -n 1
1>error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.33/containers/json?filters=%7B%22name%22%3A%7B%22dockercompose16224944752208736737_dotnetcore02_%22%3Atrue%7D%2C%22status%22%3A%7B%22running%22%3Atrue%7D%7D&limit=1: 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.
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Sdks\Microsoft.Docker.Sdk\build\Microsoft.VisualStudio.Docker.Compose.targets(314,5): error : Visual Studio コンテナー ツールでは、コンテナー化されたプロジェクトをビルド、デバッグ、実行する前に、Docker が実行されている必要があります。
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Sdks\Microsoft.Docker.Sdk\build\Microsoft.VisualStudio.Docker.Compose.targets(314,5): error : 
1>C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Sdks\Microsoft.Docker.Sdk\build\Microsoft.VisualStudio.Docker.Compose.targets(314,5): error : 詳細については、http://aka.ms/DockerToolsTroubleshooting をご覧ください
1>プロジェクト "docker-compose.dcproj" のビルドが終了しました -- 失敗。
========== ビルド: 正常終了または最新の状態 0、失敗 1、スキップ 0 ==========

Docker MachineはDocker toolboxのQuick Installを実行した時点でdefaultというものが作成されているので存在はしているし、開始されているはず。

docker-machine create box

上記コマンドで新規に作成しても変わらず。
最初にPowerShellでパスを通した通り、Visual Studioでも参照できるようパスを通さなければいけないのかもと思い、仮でユーザー環境変数を設定してみた。

f:id:igatea:20171210170200p:plain

これをするとエラーは出なくなり出力が変わった。

dotnet SDKが見つからない?ボリューム共有が無効?

========== 起動中 ==========
docker ps --filter "status=running" --filter "name=dockercompose16224944752208736737_dotnetcore02_" --format {{.ID}} -n 1
40cc4dbd74c0
docker exec -i 40cc4dbd74c0 dotnet  --additionalProbingPath /root/.nuget/packages --additionalProbingPath /root/.nuget/fallbackpackages --additionalProbingPath /root/.nuget/fallbackpackages2  bin/Debug/netcoreapp2.0/DotNetCore02.dll
docker inspect --format="{{json .NetworkSettings.Ports}}" 40cc4dbd74c0
{"80/tcp":[{"HostIp":"0.0.0.0","HostPort":"32768"}]}
Did you mean to run dotnet SDK commands? Please install dotnet SDK from: 
  http://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409
ボリューム共有が有効になっていません。Docker CE for Windows の設定で、ボリューム共有を有効にしてください。

詳細については、http://aka.ms/DockertoolsTroubleshooting をご覧ください。

dotnet SDKが入っていないとのことなので入れてみる(VIsual Studioのインストールで入ってるぽいけどなんでだろ?)

www.microsoft.com

入れようとしたらすでに入ってるよって出るので一度スルー。
ボリューム共有に取り掛かってみる。
VirtualBoxの共有フォルダーを設定するだけだとdocker-machineの再起動時に変更されるため駄目みたい。

f:id:igatea:20171210173706p:plain

下記にある通り、永続化と自動マウントを設定してあげればいいようだ。

docs.docker.com

f:id:igatea:20171210174056p:plain

設定後docker-machineを再起動

docker-machine restart default

そのままだとできなかったのでVisual Studioを再起動もしてみた。
残念ながらエラーは変わらずだった。
ここらへんで心が折れた。

github.com

このissueコメントを見ているとやっぱりtoolboxはダメみたいだ。
ここでWindows Pro Editionをインストールし、Hyper-Vを有効化、Docker for Windowsを入れて再度やってみたら今までのエラーが嘘かのようにすぐ実行できたのであった・・・。

失敗を糧に生きていくぞ!!!

おまけ

Hyper-V上にMobyLinuxVMが存在するのにdocker-machine lsで表示されなかった。

f:id:igatea:20171211160038p:plain

PS C:\Windows\system32> docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS

下記を見ると、docker-machineはリモートに使用するとき以外は使わないっぽい。

forums.docker.com