
Exciting new things for Docker with Windows Server 1709
Exciting new things for Docker with Windows Server 1709 êŽë š

What a difference a year makes⊠last September, Microsoft and Docker launched Docker Enterprise Edition (EE), a Containers-as-a-Service platform for IT that manages and secures diverse applications across disparate infrastructures, for Windows Server 2016. Since then weâve continued to work together and Windows Server 1709 contains several enhancements for Docker customers.
Docker Enterprise Edition Preview
To experiment with the new Docker and Windows features, a preview build of Docker is required. Hereâs how to install it on Windows Server 1709 (this will also work on Insider builds):
Install-Module DockerProvider
Install-Package Docker -ProviderName DockerProvider -RequiredVersion preview
To run Docker Windows containers in production on any Windows Server version, please stick to Docker EE 17.06. ### Docker Linux Containers on Windows
A key focus of Windows Server version 1709 is support for Linux containers on Windows. Weâve already blogged about how weâre supporting Linux containers on Windows with the LinuxKit project.
To try Linux Containers on Windows Server 1709, install the preview Docker package and enable the feature. The preview Docker EE package includes a full LinuxKit system (all 13MB of it) for use when running Docker Linux containers.
[Environment]::SetEnvironmentVariable("LCOW_SUPPORTED", "1", "Machine")
Restart-Service Docker
To disable, just remove the environment variable:
[Environment]::SetEnvironmentVariable("LCOW_SUPPORTED", $null, "Machine")
Restart-Service Docker
Docker Linux containers on Windows is in preview, with ongoing joint development by Microsoft and Docker. Linux Containers is also available on Windows 10 version 1709 (âCreators Update 2â).
Docker ingress mode service publishing on Windows
Parity with Linux service publishing options has been highly requested by Windows customers. Adding support for service publishing using ingress mode in Windows Server 1709 enables use of Dockerâs routing mesh, allowing external endpoints to access a service via any node in the swarm regardless of which nodes are running tasks for the service.
These networking improvements also unlock VIP-based service discovery when using overlay networks so that Windows users are not limited to DNS Round Robin.
Check out the corresponding post on the Microsoft Virtualization blog for details on the improvements.
Named pipes in Windows containers
A common and powerful Docker pattern is to run Docker containers that use the Docker API of the host that the container is running on, for example to start more Docker containers or to visualize the containers, networks and volumes on the Docker host. This pattern lets you ship, in a container, software that manages or visualizes whatâs going on with Docker. This is great for building software like Docker Universal Control Plane.
Running Docker on Linux, the Docker API is usually hosted on Unix domain socket, and since these are in the filesystem namespace, sockets can be bind-mounted easily into containers. On Windows, the Docker API is available on a named pipe. Previously, named pipes where not bind-mountable into Docker Windows containers, but starting with Windows 10 and Windows Server 1709, named pipes can now bind-mounted.
Jenkins CI is a neat way to demonstrate this. With Docker and Windows Server 1709, you can now:
- Run Jenkins in a Docker Windows containers (no more hand-installing and maintaining Java, Git and Jenkins on CI machines)
- Have that Jenkins container build Docker images and run Docker CI/CD jobs on the same host
Iâve built a Jenkins sample image (jenkinsci/docker
) (Windows Server 1709 required) that uses the new named-pipe mounting feature. To run it, simple start a container, grab the initial password and visit port 8080. You donât have to setup any Jenkins plugins or extra users:
docker run -d -p 8080:8080 -v \.\pipe\docker_engine:\.\pipe\docker_engine friism/jenkins
#
# 3c90fdf4ff3f5b371de451862e02f2b7e16be4311903649b3fc8ec9e566774ed
docker exec 3c cmd /c type c:.jenkins\secrets\initialAdminPassword
#
# <PASSWORD>
Now create a simple freestyle project and use the âWindows Batch Commandâ build step. Weâll build my fork of the Jenkins Docker project itself:
git clone --depth 1 --single-branch --branch add-windows-dockerfile https://github.com/friism/docker-3 %BUILD_NUMBER%
cd %BUILD_NUMBER%
docker build -f Dockerfile-windows -t jenkins-%BUILD_NUMBER% .
cd ..
rd /s /q %BUILD_NUMBER%
Hit âBuild Nowâ and see Jenkins (running in a container) start to build a CI job to build a container image on the very host itâs running on!
Smaller Windows base images
When Docker and Microsoft launched Windows containers last year, some people noticed that Windows container base images are not as small as typical Linux ones. Microsoft has worked very hard to winnow down the base images, and with 1709, the Nanoserver download is now about 70MB (200MB expanded on the filesystem).
One of the things thatâs gone from the Nanoserver Docker image is PowerShell. This can present some challenges when authoring Dockerfiles, but multi-stage builds make it fairly easy to do all the build and component assembly in a Windows Server Core image, and then move just the results into a nanoserver image. Hereâs an example showing how to build a minimal Docker image containing just the Docker CLI:
FROM microsoft/windowsservercore as builder
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
RUN Invoke-WebRequest -Uri https://download.docker.com/win/static/test/x86_64/docker-17.09.0-ce-rc1.zip -OutFile 'docker.zip'
RUN Expand-Archive -Path docker.zip -DestinationPath .
FROM microsoft/nanoserver
COPY ["docker\\docker.exe", "C:\\Program Files\\docker\\docker.exe"]
RUN setx PATH "%PATH%;C:\Program Files\docker"
ENTRYPOINT ["docker"]
You now get the best of both worlds: Easy-to-use, full-featured build environment and ultra-small and minimal runtime images that deploy and start quickly, and have minimal exploit surface area. Another good example of this pattern in action are the .NET Core base images maintained by the Microsoft .NET team.
Summary
Itâs hard to believe that Docker Windows containers GAâd on Windows Server 2016 and Windows 10 just one year ago. In those 12 months, weâve seen lots of adoption by the Docker community and lots of uptake with customers and partners. The latest release only adds more functionality to smooth the user experience and brings Windows overlay networking up to par with Linux, with smaller container images and with support for bind-mounting named pipes into containers.
