By: Paul Stanton
June 20, 2016
This summer Microsoft will release Windows Server 2016 with containers managed with the Docker API. Microsoft joins an industry-wide movement, with AWS, Google, Red Hat, and hundreds of firms competing in what many consider a sea-change in Cloud and software development.
In a parallel effort, WinDocks has ported Docker's popular open source project to Windows with released support for Windows 8, Windows 10, Windows Server 2012, and Windows Server 2016. A free Community Edition is available at http://www.windocks.com/lps/communityedition In response to customer requests significant work has focused on SQL Server container support, and WinDocks supports all editions of SQL Server 2008 through SQL Server 2016.
The WinDocks plan has been to address a “Window of opportunity” (pardon the pun), to bring container support to the Windows Server 2012. We assumed Microsoft’s implementation on Windows Server 2016 would be preferred longer-term. Windows Server 2012 usage will continue to expand through 2020, with continued usage through 2025 and beyond (ie., a large opportunity for a startup!).
We began our work on Windows Server 2016 in the Fall of 2015, and have re-evaluated the differences between WinDocks and Microsoft’s containers. We now believe that WinDocks provides long-term advantages over Microsoft’s design. This article outlines these differences, and why we feel WinDocks is better for a broad class of applications. This article focuses on Windows containers from a Developer’s perspective. We will address differences in security and lower-level aspects of these two designs in a subsequent article.
Containers have been around for years, with BSD Jails among the first implementations. Containers provide user and process isolation for applications on a shared operating system. Docker launched their Linux design in 2013 and has seen industry-wide adoption. Docker included an elegant method of application packaging, was lightweight, and immediately popular with developers. A Docker Image delivers identical application instances, in seconds, on a shared host. Docker defines containers as:
"Docker containers wrap up a piece of software in a complete filesystem that contains everything it needs to run: code, runtime, system tools, system libraries – anything you can install on a server. This guarantees that it will always run the same, regardless of the environment it is running in. https://www.docker.com/what-docker
Developers want practical solutions that help their productivity. We’ve spoken with hundreds of .NET and SQL Server developers and Testers, and they share almost universal needs:• New tools should add to and enhance existing environments and projects • Support for the complete technology stack is a clear requirement • Developers like tools that support personal machines, shared dev and test servers, and clouds • Developers want freedom from Ops, with less reliance on VMs and VM provisioning
Microsoft and WinDocks meet these to varying degrees, which we’ll revisit later in this article.
Docker’s popularity is attributable in large part for solving the “dependency hell” https://en.wikipedia.org/wiki/Dependency_hell problem, where an application depends on chained and varied shared libraries. Applications that run on a developers machine, invariably run into problems when shared with the test, and again when propped to staging or production servers. Docker containers and their associated images emerged as a solution that captures all dependencies involved in running an application. The Docker promise of “Build, Ship, Run,” emphasizes this point.
Windows may have fewer dependency issues, but comes with other challenges. One challenge is how Windows applications are installed, configured, and managed. On Linux, installing MySQL is as simple as copying the executable into a directory. Adding a database is equally simple, a copy of the database to a directory makes it available. Docker’s design is based on this Linux perspective, where a container with a shell is sufficient to configure applications. Unfortunately, this approach won’t get you very far with many Windows applications. While MySQL is key to Linux developers, on Windows it’s SQL Server, and a shell for configuration of SQL Server simply doesn’t work. SQL Server installation typically involves 30 minutes, with choices to be made on services, service default behavior, and security settings. Attaching or mounting a database is performed by the application, with timing and complex Windows related permissions required. Attaching and detaching databases is simply not feasible without using SQL Server tools, which are invariably GUI based. Sharepoint and other mainstream Windows applications pose similar challenges.
For better or worse, Microsoft has chosen to implement Docker with a “Linux style” Windows container where a shell is used to configure application behavior. This approach is fine for a Windows Service, and for many .NET applications, but is unusable for SQL Server and other Windows applications.
Other issues that arise with Windows Server 2016 container support include:• Microsoft containers disregard local resources. A locally installed SQL Server will be disregarded when using the new Microsoft Windows container. • As noted above, Microsoft containers are designed for Windows services, and will support most .NET apps, and other C# apps, but appears to be unusable for SQL Server and other applications • Microsoft has no plan and has not commented publicly on SQL Server container support, even though “full stack” support is a requirement for enterprise use. Perhaps the SQL Server team’s decision to port to Linux reflects a conclusion that Linux is a better long-term host than Windows?
WinDocks runs on Windows 8, Windows 10, Windows Server 2012, and Windows Server 2016 (all editions), with support for all editions of SQL Server 2008 through 2016. WinDocks containers utilize the Windows shared DLL architecture https://msdn.microsoft.com/en-us/library/ms973843.aspx This architecture supports multiple application instances (ie. Containers), fast provisioning of containers, and uses local installed host resources as well as remote repos. Perhaps most importantly, the design supports the use of a shell and application level configuration. WinDocks SQL Server containers include DockerFile commands for adding and mounting databases. WinDocks is also easily extensible to support third party storage systems (useful to support of cloned databases), and has collaborated with NetApp to demonstrate the mounting of large cloned databases of 1 TB and larger in 45 seconds.
Choice is always good, and when it comes to Windows containers with Docker support there is a clear trade-off between Microsoft plans and WinDocks released software. We believe the trade-offs are:• WinDocks supports the full Windows Operating System family, with an install that recognizes and adds to existing host resources • WinDocks containers provide “full stack” development support, with robust support for SQL Server, and an extensible design that will open up innovation with third party storage systems