Notes on Windows containers¶
See: Windows containers overview.
There are two types of Windows containers:
Windows Server containers - uses host kernel, similar to Linux docker container. These containers can only run on a host with matching kernel.
Hyper-V containers - has own kernel, more like an optimized virtual machine.
Windows containers use Windows API calls, so a Windows host can only support Windows containers.
One way of using these containers is via a Windows implementation of Docker.
See this blog post for more detailed background on Windows containers.
Set up for using containers¶
To use either type of container on Windows, you will need container host support in your OS. This started with Windows 2016 technical preview 3. You will need:
A real or virtual machine with an OS that can support containers, and
Container support installed on the OS;
See installing a container host for instructions on setting up a virtual machine with container support, and inplace setup for instructions on installing the container host services into a real or virtual machine running Windows server 2016 tech preview.
I followed the inplace setup instructions on a real machine running server 2016.
Container images¶
Containers run from OS “images”. If the container corresponds to a running operating system, then the image corresponds to the hard disk of the OS. See Windows container images for instructions on downloading images for use in Windows containers.
Using Windows containers¶
There are two standard ways to use Windows containers:
using powershell. See also managing containers;
using Docker.
Using Windows containers with Docker¶
Docker gives a nice interface to starting and using Windows containers.
Installing the container host features does not install docker, so, to use Docker, you will need to install Docker.
Then see:
In what follows I’m running in a powershell with admin privileges.
To see a list of images that you have installed:
docker images
On my system, after installing the Container images, I had:
PS C:\WINDOWS\system32> docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
windowsservercore 10.0.10586.0 6801d964fda5 5 months ago 0 B
nanoserver 10.0.10586.0 8572198a60f1 5 months ago 0 B
windowsservercore
is an image containing a minimal Windows Server core
instance. nanoserver
contains a nanoserver instance.
For convenience, you might like to tag the windowsservercore
and
nanoserver
images as being the latest
. latest
is the default tag
that docker uses when selecting a version of the image, so when you ask for
windowsservercore
, it implies (image name:tag)
windowsservercore:latest
. If you don’t add these tags, you will need to
give the tag explicitly, as in windowservercore:10.0.10586.0
. Add the
latest
tags with:
docker tag windowsservercore:10.0.10586.0 windowsservercore:latest
docker tag nanoserver:10.0.10586.0 nanoserver:latest
You might then get something like this:
PS C:\WINDOWS\system32> docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
windowsservercore 10.0.10586.0 6801d964fda5 5 months ago 0 B
windowsservercore latest 6801d964fda5 5 months ago 0 B
nanoserver 10.0.10586.0 8572198a60f1 5 months ago 0 B
nanoserver latest 8572198a60f1 5 months ago 0 B
To play with a Docker container, you might do something like this:
docker run -ti --rm windowsservercore powershell
This will open a new powershell session inside the container. Exit the session to exit the container.
Notice that, if we had not done the docker tag
commands above, we would
have to give the tag in the docker command, as in docker run -ti --rm
windowsservercore:10.0.10586.0 powershell
.
If you are on Windows server, and you want to use the nanoserver images, you will need to force docker to use these via Hyper-V containers. This is because nanoserver and Windows server 2016 do not have the same kernel, and Windows server containers need to share a kernel with the host.
To force the creation of Hyper-V containers instead of Windows server
containers, use the --isolation=hyperv
flag to Docker, as in:
docker run -ti --rm --isolation=hyperv nanoserver cmd
See Docker containers for more detail.
Example of installing into a container¶
Here I am installing three versions of Python and the MSVC command line tools for Python 2.7 into a container:
docker run -ti --rm -v c:\Users\mb312\Downloads:c:\downloads windowsservercore powershell
Then (in the container):
cd c:/downloads
.\build_container.ps1
Where build_container.ps1
is:
# Set environment variable for correct code page on Python 2
# http://stackoverflow.com/questions/35176270/python-2-7-lookuperror-unknown-encoding-cp65001#35177906
[Environment]::SetEnvironmentVariable("PYTHONIOENCODING", "UTF-8", "Machine")
$env:PYTHONIOENCODING="UTF-8"
cd c:/downloads
# See:
# https://www.python.org/download/releases/2.5/msi/
# https://msdn.microsoft.com/en-us/library/windows/desktop/aa367988(v=vs.85).aspx
cmd /c msiexec /qn /i VCForPython27.msi ALLUSERS=1
cmd /c msiexec /qn /i python-2.7.11.amd64.msi TARGETDIR=c:\Python27-x64
cmd /c msiexec /qn /i python-2.7.11.msi
cmd /c msiexec /qn /i python-3.4.4.amd64.msi TARGETDIR=c:\Python34-x64
cmd /c msiexec /qn /i python-3.4.4.msi TARGETDIR=c:\Python34
# See:
# https://docs.python.org/3.5/using/windows.html#installing-without-ui
cmd /c python-3.5.1-amd64.exe /quiet InstallAllUsers=1 TargetDir=c:\Python35-x64
cmd /c python-3.5.1.exe /quiet InstallAllUsers=1 TargetDir=c:\Python35