Windows Server 2016 presents a new feature that already exists in the Linux world – Windows Containers. You can read about them here – Windows Containers on Windows Server
Suppose I want to deploy a Windows Server container with the SQL Server 2014 Express – what steps should one take to do it?
Firstly, we should find the corresponding container (which is a ~fully ready for deployment application with all required OS links, files and e.t.c) so we go to https://hub.docker.com/u/microsoft/
The command for downloading and registering the container is the “Docker Pull Command” (docker pull microsoft/mssql-server-2014-express-windows) and the command for installing container is docker run.
If this is the first container to be deployed on the server we need to install the docker server and docker client – here’s how:
1) Install Containers Windows feature:
2) Restart the computer
3) Install Docker server (daemon) and client
3a) Create a folder in the C:\Program Files\ for docker files – either in the Explorer or by
New-Item -Type Directory -Path ‘C:\Program Files\docker\
3b) Download Docker server (daemon)
Invoke-WebRequest https://aka.ms/tp5/b/dockerd -OutFile $env:ProgramFiles\docker\dockerd.exe -UseBasicParsing
3c) Download Docker client
Invoke-WebRequest https://aka.ms/tp5/b/docker -OutFile $env:ProgramFiles\docker\docker.exe -UseBasicParsing
3d) Add the Docker directory to the system path – again either in the GUI or by running
[Environment]::SetEnvironmentVariable(“Path”, $env:Path + “;C:\Program Files\Docker”, [EnvironmentVariableTarget]::Machine)
3f) Register Docker daemon as a service:
3e) Start the docker service – NOT dockerD !
Before deploying a container a base container image should be installed first: a base container image (or template) is the OS image upon which the additional application layer – the container itself – will be deployed. Currently MS offers only the two base container images – Windows Core and Windows Nano.
Since in the SQL Server Express container Short Description field we see
“Microsoft SQL Server 2014 Express installed in Windows Server Core based containers.”
the next step will be installing Windows Server 2016 Core base Container image.
4a) Install container image package provider (~the app that rules the container images)
Install-PackageProvider ContainerImage -Force
4c) Restart the docker service after the base image instakkation – either in the Services or by running
4f) Make sure the newly-downloaded image is listed in the docker images‘s output:
4e) Add this image the tag “Latest”:
docker tag windowsservercore:10.0.14300.1000 windowsservercore:latest
5) At this stage we can proceed to installing the microsoft/mssql-server-2014-express-windows Windows Server container by running the command specified on the container’s page:
docker pull microsoft/mssql-server-2014-express-windows
The result: downloading has completed successfully but the container has failed to register in the OS. In this case we can try to install the lates updates for Windows Server 2016 TP5 (as was suggested on the technet forum) and try again:
6) The final step – running the container and testing SQl Server 2014 Express.
Again, the command for running the container is displayed on the container’s page:
“You can run the container with the following command:”
docker run -p 1433:1433 –env sa_password=<YOUR SA PASSWORD> microsoft/mssql-server-2014-express-windows
I will use the following command:
docker run -p 1433:1433 –env sa_password=P@ssw0rd microsoft/mssql-server-2014-express-windows
-p 1433:1433 means the container host‘s port 1433 will be redirected to the container’s port 1433.
Nevertheless, there’s one strangeness you may have noticed on the Pic.6.1 – after pressing the Enter the OS command prompt has not appeard – as if the command is still running. Yes, the switch -d (run as a background service) had not been used but I was expecting to see the command to complete – either successfully or not. I don’t know if it by design or not, but after closing this Power Shell window SQL Server 2014 Express is stll working. We can also make sure the container is working by running the following command: