{"id":11266,"date":"2018-05-24T18:14:00","date_gmt":"2018-05-24T16:14:00","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/windocks-a-different-way-to-use-sql-server-on-docker\/"},"modified":"2023-07-17T14:47:04","modified_gmt":"2023-07-17T12:47:04","slug":"windocks-a-different-way-to-use-sql-server-on-docker","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/windocks-a-different-way-to-use-sql-server-on-docker\/","title":{"rendered":"Windocks &#8211; a different way to use SQL Server on Docker"},"content":{"rendered":"<p>I spent some times to write blog posts about SQL Server on Docker since few months and you likely noticed it concerned mainly SQL Server on Linux. But what about SQL Server on Docker and Windows? If you take a look at the Docker images provided by Microsoft, only 2017 version is available and it is only intended for development and testing use. Versions prior 2017 seem to not be supported so far (but I don\u2019t have in mind the Microsoft plan on this topic) and if you want to\u00a0use containers with\u00a0older SQL Server versions\u00a0you\u00a0have to start from scratch\u00a0by yourself. This is not a hard task but I\u00a0have in mind\u00a0a discussion with one of my customers about\u00a0the maintenance of\u00a0SQL Server images prior 2017 and he told me he didn\u2019t allocate resources to create and maintain such images by himself.<\/p>\n<p>In addition, I recently presented\u00a0at different events including\u00a0our\u00a0dbi services internal event\u00a0 for customers\u00a0the internal project we are managing about our <a href=\"https:\/\/www.dbi-services.com\/offering\/products\/dmk-management-kit\/\">DMK maintenance module tool for SQL Server<\/a>. To cut the story short, this tool aims to provide smart maintenance capabilities for customer databases including backups, index, statistics etc \u2026<\/p>\n<p>Over the time, the code grew up and we had to support different versions of SQL Server from 2008 to SQL Server 2017. In the same time, the number of scenarios we have to manage and to test regarding the new features shipped with service packs and cumulative updates as well\u00a0increased drastically over the time. So we decided to move on docker containers from different obvious reasons:<\/p>\n<ul>\n<li>Containers are easy to provision for unit testing<\/li>\n<li>Lower footprint on our local machine<\/li>\n<li>We can share easily SQL images between members of our \u201cdevelopment\u201d team in a private registry<\/li>\n<li>We will able to integer containers in a potential \u201cfuture\u201d CI pipeline<\/li>\n<\/ul>\n<p>In our context, each developer has a local docker engine installed\u00a0on a Windows 10 Pro laptop\u00a0but for medium\/large companies, internal rules may prevent installing\u00a0such product\u00a0on each individual developer laptop. Therefore, they prefer likely to provide a dedicated environment for developers that meet the internal rules and to keep the focus on flexibility.<\/p>\n<p>In such shared infrastructure a main concern will be probably\u00a0disk space issues because of the potential testing database(s) size and the number of containers provisioned at the same time. Let\u2019s say that several developers would like to provision\u00a0one SQL Server instance each with a testing database attached on it and that\u00a0comes from the production through a sanitized database pipeline. The total size of this database is enough big to warn about a potential disk space issue because each instanced container will include its own image size (roughly 10GB with SQL Server containers on Windows) + the size of the testing database &#8211; let&#8217;s say\u00a0more than 50\u00a0GBs and\u00a0likely more\u00a0for usual cases.<\/p>\n<p>If you\u2019re in one of the aforementioned scenarios, <a href=\"https:\/\/www.windocks.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Windocks<\/a> may be a good alternative scenario.<\/p>\n<p>During this month I had the\u00a0opportunity to test the product in the context of our internal project and after some experimentation stuff I admit I was agreeably surprised by some built-in capabilities as:<\/p>\n<ul>\n<li>Windows authentication mode supported<\/li>\n<li>SQL Server database cloning capabilities<\/li>\n<li>The ability to use both Docker CLI and Web UI (even if I\u2019m in favor of Docker CLI)<\/li>\n<li>The ability to refresh a cloned database image from a\u00a0differential backup<\/li>\n<\/ul>\n<p>Before to dig further into the above features let\u2019s just take few seconds to see the Windocks architecture design<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-23633\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-133-1-windocks-architecture-e1527183485304.jpg\" alt=\"blog 133 - 1 - windocks - architecture\" width=\"800\" height=\"323\" \/><\/p>\n<p>We may notice some differences here. With a traditional Docker architecture, containers run on shared operating system kernel (either Windows or Linux) whereas Windocks is a strictly application construct-oriented solution and requires installing a SQL Server instance on the host as base instance for SQL Server containers. This is a fundamental change that provides some interesting advantages:<\/p>\n<ul>\n<li>We don\u2019t have to rebuild the containers to get OS &amp; Framework patches through <a href=\"https:\/\/blogs.msdn.microsoft.com\/stevelasker\/2017\/12\/20\/os-framework-patching-with-docker-containers-paradigm-shift\/\" target=\"_blank\" rel=\"noopener noreferrer\">base image updates<\/a> because containers rely only on the SQL Server base instance<\/li>\n<li>We don\u2019t break compatibility with some Windows storage functionalities as VSS and SQL Writer as well if you rely on them with third-party backup tools<\/li>\n<li>We benefit from the underlying security and configuration of the SQL Server based instance meaning we may use Windows authentication for instance<\/li>\n<\/ul>\n<p>Let\u2019s talk now about one interesting feature shipped with Windocks that is cloned databases. Here a picture (from Windocks) that shows a high-level workflow of using SQL Server containers with cloned databases.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-23634\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-133-2-windocks-cloned-db-architecture.jpg\" alt=\"blog 133 - 2 - windocks - cloned db architecture\" width=\"771\" height=\"236\" \/><\/p>\n<p>The starting point is a full database backup or a snapshot and Windocks will generate the corresponding VHD parent image of the backup media. Then each SQL Server container generated will use a writable clone of this parent image reducing drastically the disk footprint of each container (at least when the SQL Server container is generated). This is a common workflow that customers may implement for unit testing or for\u00a0CI\/CD pipeline to refresh development environments. The production database may be big in size and in this context the interest of using cloned databases becomes obvious. Another way provided would be to rely on mounted snapshot-based volumes from the storage provider but at this stage I didn\u2019t test it. Maybe a next time!<\/p>\n<p>To give a better picture of what it is possible to do with cloned databases, let me show you one way to implement it in the context of our DMK maintenance tool project. The development workflow of the development project is as follows:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-23636 size-full\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-133-3-windocks-dev-workflow-e1527183795133.jpg\" alt=\"blog 133 - 3 - windocks - dev workflow\" width=\"900\" height=\"448\" \/><\/p>\n<p>We use SSDT and GitLab to manage our DMK maintenance tool sources and we perform unit testing by provisioning one or several SQL Server containers regarding the target version we want to validate at this moment. Furthermore we developed testing scenarios based on <em>tSQLt <\/em>framework we run after provisioning the SQL Server containers. With such architecture, we initially have to maintain images of different SQL Server versions and each time we want to create a container we have to attach one copy of the customized <em>AdventureWorks_dbi<\/em> database. Let\u2019s say we want to work with 4 containers (SQL Server 2016) at time. We must to ensure we have sufficient disk space for 4 copies of this database (5 x 4 = 20GB) + space required for each container (10GB x 4 = 40GB) = 60GB. The <em>dbi_tools<\/em> database is intended to stay very small (512MB up to 1GB) comparing to other testing components, this is way I didn&#8217;t include it to the math.<\/p>\n<p>Let\u2019s now apply Windocks with the above context and the new architecture becomes as follows:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-23637 size-full\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-133-4-windocks-dev-workflow-e1527183932421.jpg\" alt=\"blog 133 - 4 - windocks - dev workflow\" width=\"900\" height=\"410\" \/><\/p>\n<p>In this second scenario, we may include both the <em>AdventureWorks_dbi<\/em> and <em>dbi_tools<\/em> databases (including <em>tSQLt framework<\/em> objects) in a VHD parent image. For the demo, I used a SQL Server 2016 instance installed on the host that will be controlled by Windocks service during the container generation.<\/p>\n<p>As I said previously we may rely on the configuration and the security of the base instance. Thus, I configured my security based on both Windows Authentication (<em>dbi-services\\clustadmin<\/em> domain account) for SQL Server sysadmins and SQL authentication for development purpose (windock user).<\/p>\n<p>In terms of configuration, tSQLt framework requires enabling CLR on the server level, so I changed the configuration directly on the SQL based instance to allow all my containers to inherit this configuration change.<\/p>\n<pre class=\"brush: sql; gutter: true; first-line: 1\">SELECT \n\t[name],\n\tprincipal_id,\n\t[type_desc]\nFROM \n\tsys.server_principals \nWHERE \n\t[type] IN ('U', 'S')\n\tAND [name] NOT LIKE '##MS_%##'\n\tAND [name] NOT LIKE 'NT SERVICE%'<\/pre>\n<p><a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-133-41-windocks-base-instance-security.jpg\">\u00a0<\/a><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-23639\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-133-41-windocks-base-instance-security.jpg\" alt=\"blog 133 - 41- windocks - base instance security\" width=\"452\" height=\"140\" \/><\/p>\n<p>Here the\u00a0content of my docker file.<\/p>\n<pre class=\"brush: xml; gutter: true; first-line: 1\">FROM mssql-2016\nSETUPCLONING FULL AdventureWorks_dbi \\\\Win2012sql16ls\\windock\\AdventureWorks_dbi_2008.bak\nSETUPCLONING FULL dbi_tools \\\\Win2012sql16ls\\windock\\dbi_tools.bak<\/pre>\n<p>You may notice some new commands here:<\/p>\n<ul>\n<li>FROM <strong>mssql-2016<\/strong> indicates we will use the SQL Server 2016 instance as base image.<\/li>\n<li><strong>SETUPCLONING FULL<\/strong> indicates to generate the VHD parent image that we will include both the <em>AdventureWorks_dbi<\/em> and dbi_tools databases in a remote network path<\/li>\n<\/ul>\n<p>Go ahead and let\u2019s generate the corresponding SQL Server docker cloned image with the special <strong>-t<\/strong> flag<\/p>\n<pre class=\"brush: powershell; gutter: true; first-line: 1\">docker build -t 2016withdmk C:\\DMK\\WithClone\\BasedImage\\<\/pre>\n<p><a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-133-5-windocks-cloned-database-image.jpg\">\u00a0<\/a><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-23640\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-133-5-windocks-cloned-database-image.jpg\" alt=\"blog 133 - 5- windocks - cloned database image\" width=\"1024\" height=\"100\" \/><\/p>\n<p>The process may take some times to generate the VHD parent image depending on the different database sizes and the location (local fast disk, network share bandwidth etc \u2026)<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-23641 size-full\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-133-6-windocks-cloned-db-size-e1527184506576.jpg\" alt=\"blog 133 - 6- windocks - cloned db size\" width=\"900\" height=\"197\" \/><\/p>\n<p>As expected, because the VHD parent image is a full byte copy of the data, the size is basically the sum of both <em>AdventureWorks_dbi<\/em> and <em>dbi_tools<\/em> database sizes.<\/p>\n<p>Compared to a traditional approach, the provisioning of the associated containers will be faster irrespective to database size. Let\u2019s create 2 containers from the image generated previously with the following docker commands:<\/p>\n<pre class=\"brush: powershell; gutter: true; first-line: 1\">PS C:\\DMK\\WithClone&gt; docker run --name sql20161 -d 2016withdmk\nPS C:\\DMK\\WithClone&gt; docker run --name sql20162 -d 2016withdmk<\/pre>\n<p>Note that by default, Windocks will choose a random port between a configured range in the node.conf (<strong>START_PORT<\/strong>\/ <strong>PORTS_PER_USER<\/strong>) unless you override the default behavior using the <strong>-p<\/strong> parameter.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-23643\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-133-7-windocks-create-containers.jpg\" alt=\"blog 133 - 7- windocks - create containers\" width=\"1024\" height=\"99\" \/><\/p>\n<p>Let&#8217;s get a picture of the existing containers. My 2 containers have been generated correctly from the 2016withdmk base image.<\/p>\n<pre class=\"brush: powershell; gutter: true; first-line: 1\">PS C:\\DMK\\WithClone&gt; docker ps\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS\n89344d99758b        2016withdmk         \"\"                  5 minutes ago       Started             1433\/\n4dfd1a198626        2016withdmk         \"\"                  4 minutes ago       Started             1434\/<\/pre>\n<p>Let\u2019s take another look at the storage side:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-23645 size-full\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-133-8-windocks-cloned-databases-diff-e1527184778690.jpg\" alt=\"blog 133 - 8 - windocks - cloned databases diff\" width=\"900\" height=\"235\" \/><\/p>\n<p>The interesting point here is the two differential disks created during the creation of my 2 previous containers\u00a0are very small size (~70MB per container).<\/p>\n<p>Let\u2019s try to connect from SSMS to\u00a0the new fresh containers:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-23646\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-133-9-windocks-ssms-connection.jpg\" alt=\"blog 133 - 9 - windocks - ssms connection\" width=\"565\" height=\"279\" \/><\/p>\n<p>It works and did you notice I was connected with my domain account? \ud83d\ude42<\/p>\n<p>Last topic I wanted to share with you is the Windocks capability to update a base image from differential backups. In a real context, you may need to refresh frequently your environment with recent data for developers and regarding your full backup size it might be advantageous to deal with differential backups.<\/p>\n<p>Let\u2019s consider this process with my internal project environment. During the development process we already had to scale the database schema of our testing database with the features shipped with new versions, service packs or cumulative update over the time. Let\u2019s say we have to add a new <em>dbo.bigTransactionhistory_cci<\/em> table to test columnstore index scenarios. We first add the concerned table. Then we will perform a differential backup and finally we will update the 2016withDMK base image with it. Obviously in the context of my demo, the database size is likely not big enough to take full advantage of this feature but I trust you to draw a comparison with a more realistic scenario.<\/p>\n<p>The image I want to update is named 2016withdmk. Note the mssql-xxx images that are in fact images from SQL Server base instances installed on my host server.<\/p>\n<pre class=\"brush: powershell; gutter: true; first-line: 1\">PS C:\\DMK\\WithClone&gt; docker images\nREPOSITORY            TAG                 IMAGE ID            CREATED                  VIRTUAL SIZE\n2016withdmk           none                b3a249ba-2cf        Less than a second ago   0 B\nagitated_heisenberg   none                bbd0ce26-4bb        Less than a second ago   0 B\ndotnet-4.5            none                dotnet-4.5          3 years ago              0 B\nwindows               none                windows             3 years ago              0 B\nmssql-2008r2          none                mssql-2008r2        3 years ago              0 B\nmssql-2016            none                mssql-2016          3 years ago              0 B\nmssql-2014            none                mssql-2014          3 years ago              0 B<\/pre>\n<p>My new docker file content\u00a0to update the 2016withdmk base image is as follows.<\/p>\n<pre class=\"brush: xml; gutter: true; first-line: 1\">FROM 2016withdmk\n\nSETUPCLONING DIFF AdventureWorks_dbi \\\\Win2012sql16ls\\windock\\AdventureWorks_dbi_2008.DIFF\nSETUPCLONING DIFF dbi_tools \\\\Win2012sql16ls\\windock\\dbi_tools.DIFF<\/pre>\n<p>I used the differential backup of the <em>AdventureWorks_dbi<\/em> database with the SETUPCLONNING DIFF command.<\/p>\n<p>Let\u2019s start updating the 2016withDMK base image with the following docker command (I tagged my new image with 1.2 suffix):<\/p>\n<pre class=\"brush: powershell; gutter: true; first-line: 1\">docker build -t 2016withdmk1.2 C:\\DMK\\WithClone\\DiffImage\\<\/pre>\n<p><a href=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-133-10-windocks-cloned-database-diff-backup.jpg\">\u00a0<\/a><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-23653\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-133-10-windocks-cloned-database-diff-backup.jpg\" alt=\"blog 133 - 10 - windocks - cloned database diff backup\" width=\"1024\" height=\"110\" \/><\/p>\n<p>Although using a differential backup may allow for substantial productivity keep in mind that updating a VHD parent image will require creating an additional VHD parent image that will become another full byte copy of the environment as shown below:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-23652 size-full\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-133-11-windocks-cloned-db-size-diff-e1527185121654.jpg\" alt=\"blog 133 - 11- windocks - cloned db size diff\" width=\"900\" height=\"292\" \/><\/p>\n<p>After running the same docker run command exposed before, let\u2019s get a picture of the running on my server. The container id 789ce49562d0 is the new fresh container with updated data (2016withdmk1.2 image).<\/p>\n<pre class=\"brush: powershell; gutter: true; first-line: 1\">PS C:\\DMK\\WithClone&gt; docker ps\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS\n89344d99758b        2016withdmk         \"\"                  About an hour ago   Started             1433\/\n4dfd1a198626        2016withdmk         \"\"                  About an hour ago   Started             1434\/\n789ce49562d0        2016withdmk1.2      \"\"                  2 minutes ago       Started             1436\/<\/pre>\n<p>I may retrieve the new dbo.bigTransactionHistory_cci after connecting to the concerned SQL Server instance. I\u2019m now able to update and to execute tSQLt scenarios to test columnstore index maintenance scenarios!<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-23654\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-133-12-windocks-ssms-connection-2.jpg\" alt=\"blog 133 - 12- windocks - ssms connection 2\" width=\"708\" height=\"372\" \/><\/p>\n<p>In this blog post we\u2019ve just surfaced some capabilities and possibilities provided by Windocks. There are other interesting features as encrypted password in the docker file (as we may use with <a href=\"https:\/\/www.dbi-services.com\/blog\/managing-sql-server-sa-credentials-with-docker-secrets-on-swarm\/\" target=\"_blank\" rel=\"noopener noreferrer\">Docker Swarm<\/a> for instance), the support of TDE databases or lastly the ability to manage SQL Server on Linux. I will probably blog about it in the near future. Stay tuned!<\/p>\n<p><span style=\"float: none; background-color: #ffffff; color: #333333; cursor: text; font-family: Georgia,'Times New Roman','Bitstream Charter',Times,serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none;\">By David Barbarin<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I spent some times to write blog posts about SQL Server on Docker since few months and you likely noticed it concerned mainly SQL Server on Linux. But what about SQL Server on Docker and Windows? If you take a look at the Docker images provided by Microsoft, only 2017 version is available and it [&hellip;]<\/p>\n","protected":false},"author":26,"featured_media":11267,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[229],"tags":[1357,601,1358,1346,1359],"type_dbi":[],"class_list":["post-11266","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-database-administration-monitoring","tag-cloned-databases","tag-docker","tag-setupcloning","tag-sqlserver","tag-windocks"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Windocks - a different way to use SQL Server on Docker - dbi Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/windocks-a-different-way-to-use-sql-server-on-docker\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Windocks - a different way to use SQL Server on Docker\" \/>\n<meta property=\"og:description\" content=\"I spent some times to write blog posts about SQL Server on Docker since few months and you likely noticed it concerned mainly SQL Server on Linux. But what about SQL Server on Docker and Windows? If you take a look at the Docker images provided by Microsoft, only 2017 version is available and it [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/windocks-a-different-way-to-use-sql-server-on-docker\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-05-24T16:14:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-07-17T12:47:04+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-133-1-windocks-architecture-e1527183485304.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"323\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Microsoft Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Microsoft Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/windocks-a-different-way-to-use-sql-server-on-docker\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/windocks-a-different-way-to-use-sql-server-on-docker\\\/\"},\"author\":{\"name\":\"Microsoft Team\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/bfab48333280d616e1170e7369df90a4\"},\"headline\":\"Windocks &#8211; a different way to use SQL Server on Docker\",\"datePublished\":\"2018-05-24T16:14:00+00:00\",\"dateModified\":\"2023-07-17T12:47:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/windocks-a-different-way-to-use-sql-server-on-docker\\\/\"},\"wordCount\":1926,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/windocks-a-different-way-to-use-sql-server-on-docker\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/04\\\/blog-133-1-windocks-architecture-e1527183485304.jpg\",\"keywords\":[\"cloned databases\",\"Docker\",\"SETUPCLONING\",\"SQLServer\",\"windocks\"],\"articleSection\":[\"Database Administration &amp; Monitoring\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/windocks-a-different-way-to-use-sql-server-on-docker\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/windocks-a-different-way-to-use-sql-server-on-docker\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/windocks-a-different-way-to-use-sql-server-on-docker\\\/\",\"name\":\"Windocks - a different way to use SQL Server on Docker - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/windocks-a-different-way-to-use-sql-server-on-docker\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/windocks-a-different-way-to-use-sql-server-on-docker\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/04\\\/blog-133-1-windocks-architecture-e1527183485304.jpg\",\"datePublished\":\"2018-05-24T16:14:00+00:00\",\"dateModified\":\"2023-07-17T12:47:04+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/bfab48333280d616e1170e7369df90a4\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/windocks-a-different-way-to-use-sql-server-on-docker\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/windocks-a-different-way-to-use-sql-server-on-docker\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/windocks-a-different-way-to-use-sql-server-on-docker\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/04\\\/blog-133-1-windocks-architecture-e1527183485304.jpg\",\"contentUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2022\\\/04\\\/blog-133-1-windocks-architecture-e1527183485304.jpg\",\"width\":800,\"height\":323},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/windocks-a-different-way-to-use-sql-server-on-docker\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Windocks &#8211; a different way to use SQL Server on Docker\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/bfab48333280d616e1170e7369df90a4\",\"name\":\"Microsoft Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g\",\"caption\":\"Microsoft Team\"},\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/microsoft-team\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Windocks - a different way to use SQL Server on Docker - dbi Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/windocks-a-different-way-to-use-sql-server-on-docker\/","og_locale":"en_US","og_type":"article","og_title":"Windocks - a different way to use SQL Server on Docker","og_description":"I spent some times to write blog posts about SQL Server on Docker since few months and you likely noticed it concerned mainly SQL Server on Linux. But what about SQL Server on Docker and Windows? If you take a look at the Docker images provided by Microsoft, only 2017 version is available and it [&hellip;]","og_url":"https:\/\/www.dbi-services.com\/blog\/windocks-a-different-way-to-use-sql-server-on-docker\/","og_site_name":"dbi Blog","article_published_time":"2018-05-24T16:14:00+00:00","article_modified_time":"2023-07-17T12:47:04+00:00","og_image":[{"width":800,"height":323,"url":"http:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-133-1-windocks-architecture-e1527183485304.jpg","type":"image\/jpeg"}],"author":"Microsoft Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Microsoft Team","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/windocks-a-different-way-to-use-sql-server-on-docker\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/windocks-a-different-way-to-use-sql-server-on-docker\/"},"author":{"name":"Microsoft Team","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4"},"headline":"Windocks &#8211; a different way to use SQL Server on Docker","datePublished":"2018-05-24T16:14:00+00:00","dateModified":"2023-07-17T12:47:04+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/windocks-a-different-way-to-use-sql-server-on-docker\/"},"wordCount":1926,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/windocks-a-different-way-to-use-sql-server-on-docker\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-133-1-windocks-architecture-e1527183485304.jpg","keywords":["cloned databases","Docker","SETUPCLONING","SQLServer","windocks"],"articleSection":["Database Administration &amp; Monitoring"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/windocks-a-different-way-to-use-sql-server-on-docker\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/windocks-a-different-way-to-use-sql-server-on-docker\/","url":"https:\/\/www.dbi-services.com\/blog\/windocks-a-different-way-to-use-sql-server-on-docker\/","name":"Windocks - a different way to use SQL Server on Docker - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/windocks-a-different-way-to-use-sql-server-on-docker\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/windocks-a-different-way-to-use-sql-server-on-docker\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-133-1-windocks-architecture-e1527183485304.jpg","datePublished":"2018-05-24T16:14:00+00:00","dateModified":"2023-07-17T12:47:04+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4"},"breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/windocks-a-different-way-to-use-sql-server-on-docker\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/windocks-a-different-way-to-use-sql-server-on-docker\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/windocks-a-different-way-to-use-sql-server-on-docker\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-133-1-windocks-architecture-e1527183485304.jpg","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2022\/04\/blog-133-1-windocks-architecture-e1527183485304.jpg","width":800,"height":323},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/windocks-a-different-way-to-use-sql-server-on-docker\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Windocks &#8211; a different way to use SQL Server on Docker"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/bfab48333280d616e1170e7369df90a4","name":"Microsoft Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c44a1a792c059f24055763aa77d80a244467f6eef724a8bd13db8d4a350b7a4c?s=96&d=mm&r=g","caption":"Microsoft Team"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/microsoft-team\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/11266","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/26"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=11266"}],"version-history":[{"count":1,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/11266\/revisions"}],"predecessor-version":[{"id":26735,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/11266\/revisions\/26735"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media\/11267"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=11266"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=11266"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=11266"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=11266"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}