With the introduction of Windows Containers on  Window Server 2016 and the ability to run containers in Service Fabric I thought it was time to investigate Windows Containers and I wanted to know how to build one that will run a web site using IIS.
 As I’m new to containers, although I’ve done a very similar exercise with Docker on Linux, I decided to follow the Windows Quick Start Guide. I hit a few problems early on so I’ve put the steps I followed here:
 After opening a PowerShell window as administrator I ran the following commands:
Install-Module -Name DockerMsftProvider -Repository PSGallery –Force – Ran OK
Install-Package -Name docker -ProviderName DockerMsftProvider – Had an error 
WARNING: Cannot verify the file SHA256. Deleting the file. 
WARNING: C:\Users\ADMINI~1.DEV\AppData\Local\Temp\DockerMsftProvider\Docker-1-12-2-cs2-ws-beta.zip does not exist 
Install-Package : Cannot find path 'C:\Users\ADMINI~1.DEV\AppData\Local\Temp\DockerMsftProvider\Docker-1-12-2-cs2-ws-beta.zip' because it does not exist. 
   
Not sure what was causing this to fail but I followed the instructions to manually install (from https://github.com/OneGet/MicrosoftDockerProvider/issues/15)  
Start-BitsTransfer -Source https://dockermsft.blob.core.windows.net/dockercontainer/docker-1-12-2-cs2-ws-beta.zip -Destination /docker.zip 
Get-FileHash -Path /docker.zip -Algorithm SHA256 
mkdir C:\Users\Administrator\AppData\Local\Temp\DockerMsftProvider\ 
cp .\docker.zip C:\Users\Administrator\AppData\Local\Temp\DockerMsftProvider\ 
cd C:\Users\Administrator\AppData\Local\Temp\DockerMsftProvider\ 
cp .\docker.zip Docker-1-12-2-cs2-ws-beta.zip 
Install-Package -Name docker -ProviderName DockerMsftProvider -Verbose Restart-Computer –Force
 After Rebooting I tried to download and run a sample container
 docker run microsoft/dotnet-samples:dotnetapp-nanoserver
 but I got the following error
 docker : C:\Program Files\Docker\docker.exe: error during connect: Post http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.25/containers/create: open //./pipe/docker_engine: The  
system cannot find the file specified..  
At line:1 char:1  
+ docker run microsoft/dotnet-samples:dotnetapp-nanoserver  
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
+ CategoryInfo : NotSpecified: (C:\Program File...ile specified..:String) [], RemoteException  
+ FullyQualifiedErrorId : NativeCommandError  
It turns out that the docker service wasn’t running after the reboot, so open services.msc and find the docker service to start it.  
Running the same command again will download the image from docker hub, create a container from it and then run it. As this is a visual container it runs once and then stops.  
 
  
Every time I do docker run microsoft/dotnet-samples:dotnetapp-nanoserver it creates a new container. What I want to do is to run one that is stopped and view the output on the screen.
 For this I needed to start the container I had already created. If you run 
 docker –ls –a
 This will list all the containers that are both running and stopped and you can see from the image below that I had run docker run a number of time. Each time it tried to download the image (which was already downloaded) and then create a new container from it.
 ![clip_image001[6] clip_image001[6]](http://blogs.recneps.org/image.axd?picture=clip_image001%5B6%5D_thumb.png)
 docker container start -a 12d382ae0bd6 (-a attached STDOUT so you can see the output)
 ![clip_image001[8] clip_image001[8]](http://blogs.recneps.org/image.axd?picture=clip_image001%5B8%5D_thumb.png)
 Now I know how to create and start containers I wanted to build one of my own. This is easier than I first though as there a lots of base templates stored on docker hub and git hub. 
 https://docs.microsoft.com/en-us/virtualization/windowscontainers/samples#Application-Frameworks
https://hub.docker.com/r/microsoft/ I picked one on docker hub that has IIS and ASP.Net installed already, so all I needed to do after was to add my own website and configure IIS correctly. Using docker pull,
 docker pull microsoft/aspnet (see https://hub.docker.com/r/microsoft/aspnet/) 
This retrieves the template from Docker Hub and I want to use that template to install my ASP.Net MVC site and configure IIS to serve the pages on port 8000. Following the instructions here (https://docs.microsoft.com/en-us/dotnet/articles/framework/docker/aspnetmvc). I published my MVC site and copied the publish folder to my docker machine. Then I needed to create a Dockerfile recipe to instruct docker what to install in my image. So I created a folder that contained the Dockerfile and also the published website as below  
![clip_image001[10] clip_image001[10]](http://blogs.recneps.org/image.axd?picture=clip_image001%5B10%5D_thumb.png) 
 
 The contents of the Dockerfile are: 
 # The FROM instruction specifies the base image. You are
# extending the microsoft/aspnet image.
FROM microsoft/aspnet
# Next, this Dockerfile creates a directory for your application
RUN mkdir C:\sdsweb
# configure the new site in IIS.
RUN powershell -NoProfile -Command \
Import-module IISAdministration; \
New-IISSite -Name "sdsweb" -PhysicalPath C:\sdsweb -BindingInformation "*:8000:"
# This instruction tells the container to listen on port 8000. 
EXPOSE 8000
# The final instruction copies the site you published earlier into the container.
ADD sdswebsource/ /sdsweb
 Now I need to run this to create the image  
In PowerShell, I changed directory to the folder containing my Dockerfile, then ran  
docker build -t sdsweb .  
This has created an image and we need to now get this running as a container  
![clip_image001[12] clip_image001[12]](http://blogs.recneps.org/image.axd?picture=clip_image001%5B12%5D_thumb.png) 
  
using docker run again  
docker run -d -p 8000:8000 --name sdsweb sdsweb  
![clip_image001[14] clip_image001[14]](http://blogs.recneps.org/image.axd?picture=clip_image001%5B14%5D_thumb.png) 
  
My container is now running and I should be able to view the web pages in my browser on port 8000, but I need to know the IP address first  
docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" sdsweb  
![clip_image001[16] clip_image001[16]](http://blogs.recneps.org/image.axd?picture=clip_image001%5B16%5D_thumb.png) 
  
Now I can browser to http://172.17.97.235:8000 
 ![clip_image001[18] clip_image001[18]](http://blogs.recneps.org/image.axd?picture=clip_image001%5B18%5D_thumb.png)
 I changed the default web page to show the machine name serving the pages under Getting Started. Listing the containers will show the container ID and this matches the machine name displayed on the web page
 
 That’s it running in a container. There are a couple more things I’d like to do before I’ve finished. The first is to make sure that when my Windows Server restarts, then my sdsweb container also starts. At the moment it will not start as I didn’t add a restart parameter when I called docker run. Adding –restart always will cause the container to restart when windows restarts.
 docker run -d -p 8000:8000 --name sdsweb --restart always sdsweb
 The final thing I want to do is to be able to share this image so I’d like to push it up to docker hub
 docker login - enter username and password  
docker push recneps/sdsweb  
![clip_image001[20] clip_image001[20]](http://blogs.recneps.org/image.axd?picture=clip_image001%5B20%5D_thumb.png) 
  
Then to use it on another machine  
docker pull recneps/sdsweb  
 
  
In my next post I am going to look at how I can create a container that can be hosted in Service Fabric