swirl
Home Software Blog Wallpapers Webtools
Windows 2016 Containers Part-2
Friday 30, December 2016   |   Post link

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:

  1. 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.
  2. Create a new folder e.g. c:\My Folders\TimeWebServer
  3. Open a command prompt at c:\My Folders\TimeWebServer
  4. 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
  5. Enter the following text in the DockerFile using Notepad:
    FROM microsoft/windowsservercore
    MAINTAINER Siddharth B (siddharth_b@email.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 /C
    		
    Note: Change the IP address 192.168.1.106 with the IP address of the machine hosting IIS where tws.exe is available.
  6. At the command prompt enter:
    docker build –t sids/tws
    Note: Change the name of the Docker image (sids/tws) to whatever name you like. Building the image might take a minute.
  7. Check if the image is present in your system using the Docker command:
    docker images
    List Docker Images

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:

  1. 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
  2. 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/tws
    The 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.
  3. Finally, in the container's command prompt, start the TimeWebServer service:
    cd c:\TimwWebService
    tws -port 8001 -logfolder c:\Logs
    		
    TWS running
    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.



Comments

Posts By Year

2024 (4)
2023 (5)
2022 (10)
2021 (5)
2020 (12)
2019 (6)
2018 (8)
2017 (11)
2016 (6)
2015 (17)
2014 (2)
2013 (4)
2012 (2)

Posts By Category

.NET (4)
.NET Core (2)
ASP.NET MVC (4)
AWS (5)
AWS API Gateway (1)
Android (1)
Apache Camel (1)
Architecture (1)
Audio (1)
Azure (2)
Book review (3)
Business (1)
C# (3)
C++ (2)
CloudHSM (1)
Containers (4)
Corporate culture (1)
Database (3)
Database migration (1)
Desktop (1)
Docker (1)
DotNet (3)
DotNet Core (2)
ElasticSearch (1)
Entity Framework (3)
Git (3)
IIS (1)
JDBC (1)
Java (10)
Kibana (1)
Kubernetes (1)
Lambda (1)
Learning (1)
Life (7)
Linux (2)
Lucene (1)
Multi-threading (1)
Music (1)
OData (1)
Office (1)
PHP (1)
Photography (1)
PowerShell (2)
Programming (28)
Python (1)
Rants (5)
SQL (2)
SQL Server (1)
Security (3)
Software (1)
Software Engineering (1)
Software development (2)
Solr (1)
Sql Server (2)
Storage (1)
T-SQL (1)
TDD (1)
TSQL (5)
Tablet (1)
Technology (1)
Test Driven (1)
Testing (1)
Tomcat (1)
Unit Testing (1)
Unit Tests (1)
Utilities (3)
VC++ (1)
VMWare (1)
VSCode (1)
Visual Studio (2)
Wallpapers (1)
Web API (2)
Win32 (1)
Windows (9)
XML (2)

Posts By Tags

.NET(6) API Gateway(1) ASP.NET(4) AWS(3) Adults(1) Advertising(1) Android(1) Anti-forgery(1) Asynch(1) Authentication(2) Azure(2) Backup(1) Beliefs(1) BlockingQueue(1) Book review(2) Books(1) Busy(1) C#(4) C++(3) CLR(1) CORS(1) CSRF(1) CTE(1) Callbacks(1) Camel(1) Certificates(1) Checkbox(1) Client authentication(1) CloudHSM(1) Cmdlet(1) Company culture(1) Complexity(1) Consumer(1) Consumerism(1) Containers(3) Core(2) Custom(2) DPI(1) Data-time(1) Database(4) Debugging(1) Delegates(1) Developer(2) Dockers(2) DotNetCore(3) EF 1.0(1) Earphones(1) Elastic Search(2) ElasticSearch(1) Encrypted(1) Entity framework(1) Events(1) File copy(1) File history(1) Font(1) Git(2) HierarchyID(1) Hyper-V(1) IIS(1) Installing(1) Intelli J(1) JDBC(1) JSON(1) JUnit(1) JWT(1) Java(3) JavaScript(1) Kubernetes(1) Life(1) LinkedIn(1) Linux(2) Localization(1) Log4J(1) Log4J2(1) Logging(1) Lucene(1) MVC(4) Management(2) Migration history(1) Mirror(1) Mobile Apps(1) Modern Life(1) Money(1) Music(1) NGINX(1) NTFS(1) NUnit(2) OData(1) OPENXML(1) Objects(1) Office(1) OpenCover(1) Organization(1) PHP(1) Paths(1) PowerShell(2) Processes(1) Producer(1) Programming(2) Python(2) QAAC(1) Quality(1) REDIS(2) REST(1) Runtimes(1) S3-Select(1) SD card(1) SLF4J(1) SQL(2) SQL Code-first Migration(1) SSH(2) SSL(1) Sattelite assemblies(1) School(1) Secrets Manager(1) Self reliance(1) Service(1) Shell(1) Solr(1) Sony VAIO(1) Spirituality(1) Spring(1) Sql Express(1) System Image(1) TDD(1) TSQL(3) Table variables(1) Tables(1) Tablet(1) Ubuntu(1) Url rewrite(1) VMWare(1) VSCode(1) Validation(2) VeraCode(1) Wallpaper(1) Wallpapers(1) Web Development(4) Windows(2) Windows 10(2) Windows 2016(2) Windows 8.1(1) Work culture(1) XML(1) Yii(1) iTunes(1) open file handles(1) renew(1) security(1) static ip address(1) ulimit(1)