This means I will be running a Linux VM (Docker Host) inside a Windows 10 VM inside a Windows 10 Host. And it works, but it’s slightly slower than running it straight on the host. The payoff is that I just need to copy the Windows 10 Guest VM to another computer if I want to develop somewhere else, and it is excellent to test stuff instead of bloating my Host.
There are a few requirements to get started:
- Windows 10 Host must be updated to the Anniversary version, or newer. Check your version here: link
- Windows 10 Guest must also be equal to the Host, or newer.
- Enable Hyper-V on the Windows 10 Host. https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v
- You might need to change a few things in the Bios as well depending on your setup. Usually it’s about enabling the VTx
The steps of the day are:
- Get Windows 10 image
- Create new Hyper-V VM => “Win10 Guest”
- Enable Nested Virtualization on “Win10 Guest”
- Enable Hyper-V on “Win10 Guest”
- Install “Docker for Windows” on “Win10 Guest”
- Install Visual Studio 2017 on “Win10 Guest”
- Create a Dockerized .net Core Web API solution
- Debug the webservice running in the Container
Ok. Let’s get started.
Download the latest Window 10 image from MSDN downloads (or somewhere else if you do not have access).
In the Windows 10 Host, open the Hyper-V manager and add a new VM. I recommend at least these settings:
- Generation 1. It comes in handy if you want to convert the to a VMware image later.
- Do not use “Dynamic Memory”. It’s currently not supported with nested virtualization.
I find that setting the network in Hyper-V is always a bit tricky. My solution is to use “Virtual Switch Manager” to create an “internal only” network and share my Windows Host internet connection with this one.
Enable Hyper-V on “Win10 Guest”
Open a PowerShell console as Administrator on the Windows 10 Host, and run:
Enable-WindowsOptionalFeature -Online -FeatureName:Microsoft-Hyper-V -All
Enable Nested Virtualization on “Win10 Guest”
Set-VMProcessor -VMName "Win10 Guest" -ExposeVirtualizationExtensions $true
Install “Docker for Windows” on “Win10 Guest”
Right. After some hours or minutes later, depending on your setup, we can install “Docker For Windows”. https://www.docker.com/docker-windows
The install usually works, but sometimes you just need to restart a few times, including the Windows host. Finally, the new Windows 10 Guest looks something like this:
Hopefully, there is a white and not a red whale running in your taskbar.
Right-click on the white whale and alter these settings:
- Shared Drives: Tick true for the drives and click Apply. This enables debugging in VS2017 later.
Install Visual Studio 2017 on “Win10 Guest”
Get the free community version and install Visual Studio from here https://www.microsoft.com/net/core#dockervs. Install the .NET Core workload.
The install differs from earlier installments of Visual Studio in that it is possible to choose much more defined in what to install. That’s cool, I think. And faster.
Create a Dockerized .net Core Web API solution
Visual Studio 2017 comes preinstalled with .net core project templates.
Find “.NET Core” and create an ASP.NET Core project.
Enable Docker Support. This will add a new ‘docker compose’ project to the solution.
Visual Studio 2017 have done a lot more to the Docker tooling. Most of it is ok, but really, it’s just a giant wrapper around the docker cli and docker-compose cli. And it is too bad Microsoft didn’t opensource this tooling instead of hardwiring it into VS2017. If you want to know what is going on inside this tooling, it is possible to look into the ‘source files’ => C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.0\Docker
Ok, last step. Pushing F5.
And it failed with this error:
2>docker ps --filter "status=running" –filter "name=dockercompose2673636242_testcore_" --format {{.ID}} -n 1 1>CSC : error CS2012: Cannot open 'C:\Utvikling\TestCore\TestCore\obj\Debug\netcoreapp1.1\TestCore.dll' for writing -- 'The process cannot access the file 'C:\Utvikling \TestCore\TestCore\obj\Debug\netcoreapp1.1\TestCore.dll' because it is being used by another process.'
Hmm, ok. I restart Visual Studio and try again.
Hurray, great success. Visual Studio is now debugging my webservice running inside the Container.
Resources:
http://www.thomasmaurer.ch/2015/11/nested-virtualization-in-windows-server-2016-and-windows-10/