Welcome to Part - 2 of the Windows Containers blog posts. In the previous post we saw how to:
- Download the base Windows 2016 OS image for Docker
- Run the base image
- How to commit changes by using a container to create a new image
What we did not cover and will cover in this post are:
- Dealing with data specifically writing application data
- Scripting creation of images
Dealing with data specifically writing application data
The recommended way to create custom images is by writing up a Docker file. A Docker file is something like a batch script which is interpreted by Docker. Like a batch script, a Docker file consists of a set of instructions which is executed on a base or source image, the modified image is then saved as a new image.
Let's create a Docker file for running the TimeWebServer service which we used in the last blog post. Follow the steps below:
- Refer to the previous post on how to make the TimeWebServer (tws.exe) available from the physical machine to the container presumably running in a Windows 2015 virtual machine.
- Create a new folder e.g. c:\My Folders\TimeWebServer
- Open a command prompt at c:\My Folders\TimeWebServer
Create a text file named DockerFile, it has to be named DockerFile so don't try to name it differently. E.g.
c:\My Folders\TimeWebServer>Notepad DockerFile
Enter the following text in the DockerFile using Notepad:
FROM microsoft/windowsservercore MAINTAINER Siddharth B (email@example.com) run mkdir c:\tws run mkdir c:\tws\bin run mkdir c:\tws\logs EXPOSE 8001 RUN PowerShell "(New-Object System.Net.WebClient).DownloadFile('http://192.168.1.106/software/TWS.exe', 'c:\tws\bin\tws.exe')" CMD c:\tws\bin\tws.exe -port 8001 -logfolder c:\tws\logs /S /CNote: Change the IP address 192.168.1.106 with the IP address of the machine hosting IIS where tws.exe is available.
At the command prompt enter:
docker build –t sids/twsNote: Change the name of the Docker image (sids/tws) to whatever name you like. Building the image might take a minute.
Check if the image is present in your system using the Docker command:
There you have it, you've now automated the task of creating the image using a Docker file. The image when run will automatically run the tws.exe. The following page has all the Docker file commands that you can use.
The main advantage of creating images this way is obvious - the process is repeatable. If you've missed a step, you can modify the Docker file script and not have to manually enter everything else. The next thing we are going to see if how to prepare a containerized application for storing persistent data.
Mounting a host machine's folder into the container
You must have noticed the ephemeral nature of containers by now, changes made to a running container are not persisted beyond the lifetime of the running container. This is way to we use Docker's 'commit' command to save the changes to a new image or use a DockerFile to record changes to a custom image.
However, most applications deal with data, e.g. a database or a service which stores and retrieves orders. Both these will want to write data which persists beyond the lifetime of a running container. There are a couple of ways to do this - one way is to mount a folder from the host machine's own file system into the container. For this we use the -v switch along with Docker's run command. Let's do this with the TimeWebServer service using the following steps:
- Create a folder on Windows 2016 machines or VM where we are running Docker which we want to mount into the container e.g. c:\Temp\TwsData
Run the tws custom image we created earlier in this post using the -v switch:
docker run -it –v c:\Temp\TwsData:c:\Logs sids/twsThe above container will start the container where you will access to the folder c:\Logs however the actual file system calls will work on the physical folder present on the host at c:\temp\TwsData. This way the host's folder will remain intact even if the container is stopped or the image deleted.
Finally, in the container's command prompt, start the TimeWebServer service:
cd c:\TimwWebService tws -port 8001 -logfolder c:\Logs
Access the URL printed by TWS. Check the c:\temp\TwsData folder on the container host; you'll see the log file created by TWS running inside the container here.