Docker на windows или linux

Время на прочтение
7 мин

Количество просмотров 30K

Конференция Ignite в Атланте, которая проводилась в конце сентября сего года, стала важным событием для Microsoft и Docker Inc. А именно, тогда был выпущен финальный общедоступный релиз Windows Server 2016, в котором можно найти массу новых возможностей. Windows Server стал интеллектуальнее, в нём улучшили систему безопасности и поддержку облачных решений, повысили производительность, усовершенствовали сетевые инструменты. Нельзя забывать и об улучшенной поддержке кластеризации. Весьма интересна новая облегчённая версия ОС – Nano Server. Этот дистрибутив предназначен для использования в облачных службах. Тогда же был анонсирован Microsoft System Center 2016, стало известно кое-что о новой облачной платформе Azure Stack, возможностями которой можно будет воспользоваться в следующем году. Эта платформа позволит организациям размещать основные службы Azure в собственных дата-центрах.

На конференции было много новостей. Но, пожалуй, самой горячей стала новость о партнёрстве Docker Inc. и Microsoft в области поддержки Docker Engine на платформе Windows Server 2016.

В рамках этого партнёрства Microsoft позволит пользователям Windows Server 2016 бесплатно работать с Docker Engine и обеспечит базовую техническую поддержку. Сложными проблемами будет заниматься техподдержка Docker Inc.

В Windows Server 2016 теперь имеется встроенная поддержка контейнеров Docker и предлагается два способа развёртывания контейнеров: Windows Server Containers и Hyper-V Containers, что предусматривает дополнительный уровень изоляции для многоарендных сред. Поддержка Docker интегрирована в широкий набор средств разработки от Microsoft, в операционные системы и облачную инфраструктуру, в том числе в следующие технологии:

  • Windows Server 2016
  • Hyper-V
  • Visual Studio
  • Microsoft Azure

Если вы – приверженец Linux, вроде меня, то вам, должно быть, не терпится узнать, насколько различается Docker Engine на платформах Windows Server и Linux. В этом материале я собираюсь рассказать об архитектурных различиях, об интерфейсе командной строки, который работает под обеими платформами, о сборке образов с помощью Dockerfile, о некоторых других особенностях работы с Docker на платформе Windows.
Начнём с архитектурных различий контейнеров Windows и Linux.

Docker Engine на платформе Linux

Если рассмотреть Docker Engine на платформе Linux, то сразу бросаются в глаза инструменты командной строки вроде Docker Compose, Docker Client, Docker Registry, и так далее, которые используют Docker REST API. Пользователи взаимодействуют с Docker Engine, а, в свою очередь, Docker Engine работает с демоном containerd. Демон использует runC или другую OCI-совместимую среду выполнения для запуска контейнеров.

В основе этой архитектуры находятся функции ядра, наподобие пространств имён, которые обеспечивают изоляцию контейнеров. Тут же находятся контрольные группы и другие низкоуровневые механизмы. Всё это позволяет реализовать изоляцию контейнеров, распределение и ограничение ресурсов. В результате каждому контейнеру можно выделить необходимую ему долю памяти, процессорного времени, ресурсов дискового накопителя. При этом, что очень важно, отдельный контейнер не может нарушить работу системы, единолично захватив один из этих ресурсов.


Docker Engine на платформе Linux

Docker Engine на платформе Windows

В Windows всё устроено несколько иначе. Архитектура большинства высокоуровневых компонентов выглядит точно так же, как на Linux. Это и то же самое Remote API, те же рабочие инструменты (Docker Compose, например), но глубже, ближе к ядру, всё уже не так, как в Linux. Тут, для тех, кто не очень хорошо ориентируется в вопросах, связанных с ядром Windows, хочу отметить, что ядра Windows и Linux – это далеко не одно и то же. Дело в том, что Microsoft применяет несколько иной подход к проектированию ядра, нежели тот, которому следует сообщество разработчиков Linux. А именно, термин «режим ядра» на языке Microsoft относится не только к самому ядру системы, но и к уровню аппаратных абстракций (hal.dll), и к различным системным службам. Здесь имеются модули, предназначенные для управления объектами, процессами, памятью, безопасностью, кэшем, технологией PnP, электропитанием, настройками, операциями ввода-вывода. Всё вместе это называется исполнительной системой Windows (Windows Executive, ntoskrnl.exe).

Среди возможностей ядра в Windows нет пространств имён и контрольных групп. Вместо этого команда Microsoft, работая над новой версией Windows Server 2016, представила так называемый «Compute Service Layer», дополнительный слой служб на уровне операционной системы, который предоставляет функции пространств имён, управление ресурсами, и возможности, похожие на UFS. Кроме того, как вы увидите ниже, на платформе Windows нет чего-либо, соответствующего демону containerd и среде runC. Compute Service Layer предоставляет общедоступный интерфейс к контейнеру и несёт ответственность за управление контейнерами, за выполнение операций вроде их запуска и остановки, но он не контролирует их состояние, как таковое. Если в двух словах, то он заменяет containerd на Windows и абстрагирует низкоуровневые возможности, которые предоставляет ядро.


Docker Engine на платформе Windows

На рисунке ниже показаны механизмы ядра Windows, созданные для поддержки контейнеров. В самом низу – совместно используемое ядро, то же самое мы уже видели на Linux. Блок Host User Mode – это хост-система Windows, в основном – системные процессы. Гораздо более важные компоненты размещены в правой части рисунка – это System Processes и Application Processes, системные процессы и процессы приложений в контейнерах Windows Server, которые, в сравнении с Linux, работают иначе. Обычная для Linux практика – хорошее документирование механизма вызова системы, а также гарантия его стабильности для разных версий ядра. В Windows механизм вызова системы не документирован, при этом речь не идёт и о гарантиях его единообразного поведения. Единственный способ сделать системный вызов в Windows заключается в обращении к ntdll.dll. В контейнеры Windows входит множество взаимосвязанных процессов, вызывающих друг друга, поэтому они имеют довольно большой размер.


Контейнеры в Windows Server (источник: DockerCon 2016)

Важно отметить, что в файлах Dockerfile для Windows не используется команда «FROM scratch», то есть, нет такого понятия, как «пустой образ». Это так из-за большого числа взаимосвязанных системных процессов, необходимых для предоставления базовой функциональности. Microsoft сделала свои базовые образы в следующих двух вариантах:

  1. Microsoft/windowsservercore – это обычный Windows Server с .NET 4.5, он занимает 9.3 Гб, что немало, поддерживает существующие приложения Windows.
  2. Microsoft/nanoserver – размер этого образа значительно меньше, около 600 Мб, здесь не предусмотрено графической среды. Этот сервер работает быстро, требует меньше памяти, но предоставляет меньше API и может быть несовместим с некоторыми существующими приложениями.

Пара слов о пространствах имён в Windows

В Windows нет концепции «пространств имён», соответствующей пространствам имён в Linux. Однако, на пространства имён Linux здесь весьма похожа концепция приёмников команд (silos) — расширение к объектам-заданиям Windows (Windows Job objects) – набору процессов, ресурсами которых можно управлять. При этом появляется то, что называется пространством имён процесса, пользователя, объекта, сети, и так далее. Пространство имён объекта – это пространство имён системного уровня, скрытое от пользователя. Так же, как и Linux, Windows имеет корневую папку (\) на уровне NT для всех устройств. Например, «C\Windows» отображается на \DosDevices\C:\Windows, или на \Device\Tcp, если речь идёт о сети.

Начало работы с Docker на Windows 2016 Server

Обратите внимание на то, что для того, чтобы опробовать то, о чём я сейчас расскажу, вам понадобится Windows 2016 Server Evaluation сборки 14393. Если попытаться выполнить стандартную процедуру установки Docker на старую версию Windows 2016 TP5, появится сообщение об ошибке.


Сообщение об ошибке

Не забудьте и о том, что обновить систему TP5 на новую версию не получится. Поэтому для того, чтобы попробовать новейший Docker 1.12.2, понадобится установить ОС Windows Server Evaluation, которую можно загрузить отсюда.

Когда нужная версия Windows Server будет установлена, выполните нижеприведённые команды, соблюдая их последовательность:

Invoke-WebRequest "https://download.docker.com/components/engine/windows-server/cs-1.12/docker.zip" -OutFile "$env:TEMP\docker.zip" -UseBasicParsing
Expand-Archive -Path "$env:TEMP\docker.zip" -DestinationPath $env:ProgramFiles
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Program Files\Docker", [EnvironmentVariableTarget]::Machine)
dockerd --register-service
Start-Service Docker

Этих команд в большинстве случаев будет вполне достаточно для того, чтобы установить Docker и не столкнуться при этом с какими-либо проблемами.

Кстати, 10 ноября я узнал, что Windows 2016 Final Release и Nano Server доступны на платформе Azure.

Приступая к работе с контейнерами в Windows Server 2016, в которой установлен соответствующий компонент, проверьте, запущен ли сервис Docker:

docker version

Если вы столкнулись с сообщениями об ошибках, наподобие показанных ниже, которые довелось увидеть мне, выполните такую команду:

Start-Service Docker


Сообщения об ошибках и запуск Docker

Теперь вы можете найти Windows-приложения, подготовленные для Docker, используя такую команду:

docker search microsoft

Вот, например, что удалось найти мне.


Результаты поиска приложений

Ещё можно воспользоваться такой командой:

docker search windows

В ответ система выведет примерно такой список:


Результаты поиска приложений

Об ограничениях Docker на Windows

  1. На платформе Windows Linux-контейнеры работать не будут. Вот что система сообщает по этому поводу:


    Docker на Windows и Linux-контейнеры

  2. На платформе Windows всё ещё не поддерживается DTR.
  3. Нельзя, с помощью команды docker commit, зафиксировать изменения в исполняющемся контейнере и создать на его основе новый образ (на Linux это – обычное дело).
  4. Docker для Windows пока не поддерживает Swarm Mode.

Использование Dockerfile в Windows и образ с MySQL

На платформе Windows Server можно создавать контейнеры с использованием файлов Dockerfile. Возьмём пример такого файла для MySQL и соберём на его основе контейнер MySQL. Мне подходящий файл попался где-то на GitHub и я решил взглянуть на то, как механизм создания образов с помощью Dockerfile работает на Windows. Этот файл выглядит так:

FROM microsoft/windowsservercore
LABEL Description="MySql" Vendor="Oracle" Version="5.6.29″
RUN powershell -Command \
$ErrorActionPreference = ‘Stop’; \
Invoke-WebRequest -Method Get -Uri https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.29-winx64.zip -OutFile c:\mysql.zip ; \
Expand-Archive -Path c:\mysql.zip -DestinationPath c:\ ; \
Remove-Item c:\mysql.zip -Force
RUN SETX /M Path %path%;C:\mysql-5.6.29-winx64\bin
RUN powershell -Command \
$ErrorActionPreference = ‘Stop’; \
mysqld.exe –install ; \
Start-Service mysql ; \
Stop-Service mysql ; \
Start-Service mysql
RUN type NUL > C:\mysql-5.6.29-winx64\bin\foo.mysql
RUN echo UPDATE user SET Password=PASSWORD(‘mysql123′) WHERE User=’root’; FLUSH PRIVILEGES; .> C:\mysql-5.6.29-winx64\bin\foo.mysql
RUN mysql -u root mysql < C:\mysql-5.6.29-winx64\bin\foo.mysql

Всё сработало как ожидалось, образ MySQL был собран быстро и без проблем. Вот мой репозиторий «докеризованного» MySQL для Windows (правда, мне ещё надо заполнить его описание).


MySQL для Windows

Итоги

Docker для Windows – технология очень молодая, поэтому она пока не поддерживает все те возможности, которые имеются у Linux-версии. Однако, существующие наработки, усилия компаний и сообществ независимых разработчиков, вселяют надежду в то, что полноценное использование Docker на платформе Windows – дело недалёкого будущего.

Кстати, если вы хотите продолжить знакомство с Docker для Windows – взгляните на этот регулярно пополняемый и обновляемый набор материалов от Microsoft.

A Detailed Overview of Rancher’s Architecture

This newly-updated, in-depth guidebook provides a detailed overview of the features and functionality of the new Rancher: an open-source enterprise Kubernetes platform.

You can run Docker containers on Windows as well as Linux. Although, in
many ways, Docker works similarly on these operating systems, there are
some differences. Below, I walk through the steps of installing and
running Docker on Windows, and point out how they are similar to and
different from running Docker on Linux.

Installing Docker on Windows and Linux

Let’s start with installation. The Docker installation process is
different on both operating systems. To install Docker on Windows, just
download the application and install it as you would any Windows
application. You get a user-friendly installation wizard: The Windows
installation wizard displays and asks you to select any additional tasks
you'd like to set
up. To
install Docker on Linux, in contrast, you can either grab the Docker
package from your distribution’s package manager (yum, dnf, or something
similar), or install directly from Docker’s site with the command:

sudo sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -"

Docker Under the Hood: Differences Between Windows and Linux

The Docker method of installation is just one difference between Windows
and Linux. When you install Docker on Linux, you install only the Docker
Engine and management tools. You don’t need to create a virtual machine
or virtual networks, because your containers will handle the setup for
you. Things are different on Windows. At the time of installation,
Docker creates a Linux-based virtual machine called MobyLinuxVM, which
is based on Alpine Linux. The Docker
application connects to this machine, so that you can create your
container with the necessary apparatus for operation. The Docker
installation also configures a subnet for the virtual machine to
communicate with the local network and NAT for your containers to use in
the application. All of these steps occur behind the scenes and, as the
user, you don’t really have to worry about them. Still, the fact that
Docker on Windows runs a virtual machine in the background is another
major difference between Docker on Windows and Docker on Linux.

Docker Commands

Once you install Docker, the commands are the same on both Linux and
Windows. You only have to learn one set of tools, no matter which
operating system you run. The only difference between Windows and Linux
when running Docker commands is where you run them. On Linux, you can
use the terminal emulator of your choice. On Windows, use the PowerShell
CLI. Below are examples of running Docker in PowerShell on Windows. The
first screenshot displays information about the system, while the second
shows some containers running on Windows. PowerShell displays
information about the Docker on Windows
system Docker
containers running on Windows in
PowerShell

Windows vs. Linux: Which is Better for Docker?

Personally, I find it easier to work with Docker from Linux than from
Windows. Even though there is no functional difference between Docker on
Windows and Linux environments, the installation process on Linux is a
bit faster (an apt-get install is quicker than installing a Windows
package), and the shell is easier to access on Linux. That said, this is
just my personal preference. From a technical standpoint, there is no
real difference between using Docker on Windows and Linux. You can
achieve the same things with Docker on both platforms. I don’t think you
can say that either Windows or Linux is “better” for hosting Docker.

Conclusion

The fact that no operating system is better than another for Docker is
what makes Docker so great. No matter where Docker runs (despite some
differences in configuration and what goes on in the background), the
Docker user experience is always the same. A docker run -d -p 80:80
nginx
command spins up an NGINX container, no matter which operating
system you are working from, which particular shell you’re using,
whether your Docker environment runs in the cloud or on-premises, or
whether it’s sunny or rainy outside. This consistency is what makes
Docker so reliable and pleasant to work with. It saves you from the
configuration hell and environment unpredictability that are part and
parcel of working with virtual machines and other older forms of
infrastructure.

A Detailed Overview of Rancher’s Architecture

This newly-updated, in-depth guidebook provides a detailed overview of the features and functionality of the new Rancher: an open-source enterprise Kubernetes platform.

You can supposedly also run Linux images on Windows «natively» via WSL now as well. I’m not sure there are any benefits to doing so, though.

Where is this documented and is this available on Windows 18.09 stable channel?

That would be a huge win if you can run the Docker daemon on WSL directly (without Docker for Windows). Not just for volume mount performance, but it removes a lot of indirection.

Edit: Did some digging around and found https://github.com/Microsoft/WSL/issues/2291.

Basically, while it runs, there’s still a lot of issues and as of today Docker Compose will not work because WSL doesn’t support iptables fully yet, which unfortunately means for every day usage, this isn’t going to work.

But it’s great news because maybe in 6-12 months things will be ready for prime time.

September 26, 2016 was an important day for both Docker Inc. and Microsoft at Ignite conference in Atlanta. Two week ago, Microsoft finally unveiled the final GA release of Windows Server 2016 which holds plenty of new features such as improved security, productivity, intelligence, cloud, networking tools and not to miss out, a better support for clustering. The major point of attraction was  the addition of the Nano Server option, a stripped-down version of the OS for use in the cloud and Microsoft’s System Center 2016 announcement too. A new preview of Azure Stack, targeted to be available in 2017, will allow enterprises to run the core Azure services inside their own data centers.BUT the biggest news was that of Docker Commercial Partnership with Microsoft by extending Docker Engine support on Windows Server 2016 platform. As part of commercial partnership, Microsoft will make the commercially supported Docker Engine available to Windows Server 2016 customer at no additional charge. Essentially, Microsoft will handle most of the basic support and then pass more complicated issues on to Docker Inc.

microdocker

What does it mean to Windows community?

It means that Windows Server 2016 natively supports Docker containers now on-wards and offers two deployment options — Windows Server Containers and Hyper-V Containers, which offer an additional level of isolation for multi-tenant environments.The extensive partnership integrates across the Microsoft portfolio of developer tools, operating systems and cloud infrastructure including:

  • Windows Server 2016
  • Hyper-V
  • Visual Studio
  • Microsoft Azure

What does it mean to Linux enthusiasts?

In case you are Linux enthusiast like me, you must be curious to know how different does Docker Engine on Windows Server Platform work in comparison to Linux Platform. Under this post, I am going to spend considerable amount of time talking about architectural difference, CLI which works under both the platform and further details about Dockerfile, docker compose and the state of Docker Swarm under Windows Platform.

Let us first talk about architectural difference of Windows containers Vs Linux containers.

Looking at Docker Engine on Linux architecture, sitting on the top are CLI tools like Docker compose, Docker Client CLI, Docker Registry etc. which talks to Docker REST API. Users communicates and interacts with the Docker Engine and in turn, engine communicates with containerd. Containerd spins up runC or other OCI compliant run time to run containers. At the bottom of the architecture, there are underlying kernel features like namespaces which provides isolation and  control groups etc. which implements resource accounting and limiting, providing many useful metrics, but they also help ensure that each container gets its fair share of memory, CPU, disk I/O; and, more importantly, that a single container cannot bring the system down by exhausting one of those resources.

     Docker Engine on Linux Platform

pico9

Under Windows, it’s slightly a different story. The architecture looks same for the most of the top level components like same Remote API, same working tools (Docker Compose, Swarm) but as we move down, the architecture looks different. In case you are new to Windows kernel, the Kernel within the Windows is somewhat different than that of Linux because Microsoft takes somewhat different approach to the Kernel’s design. The term  “Kernel mode” in Microsoft language refers to not only the Kernel itself but the HAL(hal.dll) and various  system services as well. Various managers for  Objects, processes, Memory, Security, Cache, Plug in Play (PnP), Power,  Configuration and I/O collectively called Windows Executive(ntoskrnl.exe) are available. There is no kernel feature specifically called namespace and cgroup on Windows. Instead, Microsoft team came up with new version of Windows Server 2016 introducing «Compute Service Layer» at OS level which provides namespace, resource control and UFS like capabilities. Also, as you see below, there is NO containerd and runC concept available under Windows Platform. Compute Service Layer provides public interface to container and does the responsibility of managing the containers like starting and stopping containers but it doesn’t maintain the state as such. In short, it replaces containerd on windows and abstracts low level capabilities which the kernel provides.

   Docker Engine on Windows Platform

correct1

The below picture depicts the underlying Windows kernel feature built to support the containers. At the bottom, there is a shared kernel just like that we saw on Linux. The Host User mode talks about the Windows host operating system, primarily the system processes.The most important components are on the left hand side of the picture — System Processes & Application Processes which works differently from Linux prospective. Usually under Linux system, the system call mechanism  is documented and guaranteed to be stable across different kernel versions. Windows does not document or even guarantee consistency of the system call mechanism. The only way to make a system call on Windows is to call into ntdll.dll. Reason of large container size is because of DLLs which are interlinked processes calling each other.

t13                                                                                                                                                                                                      ~ Source: DockerCon 2016

It is important to note that there is no «FROM scratch» in Dockerfile for Windows due to large number of DLLs interlinked system processes to provide the base functionalities. Instead, Microsoft settled down their base images at the following two options:

  1. microsoft/windowsservercore — basically windows server, .Net 4.5, 9.3 Gigs, large, fully compatible, support Windows existing app
  2. microsoft/nanoserver — very smaller, ~600MB, no graphic stack, fast, smaller API  surface, existing application mighn’t be compatible, less memory

A Brief about Windows Namespace:

Under Windows system, there is NO such concept primarily called «namespaces» compared to Linux. But very similar to what namespace does, there is a concept called «Silos» — extension to so called «Windows Job objects.» — set of processes which you can assign or limit the resource control. With this, there is an introduction to process namespace, user namespace, object namespace, network namespace etc. Object namespace is a system level namespace hidden from users. Just like Linux, Windows too has \(slash root) at NT level for all the devices, example C:\Windows maps to \DosDevices\C:\Windows, \Device\Tcp in case of networking.

Getting Started with Docker on Windows 2016 Server

Important : You need Windows 2016 Server Evaluation build 14393 or later to taste the newer Docker Engine on Win2k16. If you try to follow the usual Docker installation process on your old Windows 2016 TP5 system, you will get the following error:

take1

Please note that you won’t be able to update your TP5 system to Evaluation version to try the newer Docker 1.12.2. One need to install the newer Windows Server 2016 Evaluation version which you can download directly using  this link.

Once you have Windows Server 2016 Evaluation versions readily installed, just run the below commands in sequence:

Invoke-WebRequest "https://download.docker.com/components/engine/windows-server/cs-1.12/docker.zip" -OutFile "$env:TEMP\docker.zip" -UseBasicParsing
Expand-Archive -Path "$env:TEMP\docker.zip" -DestinationPath $env:ProgramFiles
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Program Files\Docker", [EnvironmentVariableTarget]::Machine)

dockerd --register-service

Start-Service Docker

The above commands should be enough to get Docker installed on your system without any issue.

Update: 10/11/2016 — Good News ! Windows 2016 Final Release and Nano Server is available under Azure Platform. In case you choose Windows Server 2016 with Container, you need to ensure that the following service is started:

> Start-Service Docker

win12

Now you can search plenty of Windows Dockerized application using the below command:

untitled-picture

win2linux

Important Points:

1. Linux containers doesn’t work on Windows Platform.(see below)

linonwin

2. DTR is still not supported on Windows Platform

3.  You can’t commit a running container and build image out of it. (This is very much possible on Linux Platform.

Using Dockerfile for MySQL

Building containers using Dockerfile is supported on Windows server platform. Let’s pick up a sample MySQL Dockerfile to build up MySQL container. I found it available on some github repository and want to see if Dockerfile is supported or not. The sample Dockerfile looks somewhat like as shown below:

FROM microsoft/windowsservercore

LABEL Description=»MySql» Vendor=»Oracle» Version=»5.6.29″

RUN powershell -Command \

$ErrorActionPreference = ‘Stop’; \

Invoke-WebRequest -Method Get -Uri https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.29-winx64.zip -OutFile c:\mysql.zip ; \

Expand-Archive -Path c:\mysql.zip -DestinationPath c:\ ; \

Remove-Item c:\mysql.zip -Force

RUN SETX /M Path %path%;C:\mysql-5.6.29-winx64\bin

RUN powershell -Command \

$ErrorActionPreference = ‘Stop’; \

mysqld.exe —install ; \

Start-Service mysql ; \

Stop-Service mysql ; \

Start-Service mysql

RUN type NUL > C:\mysql-5.6.29-winx64\bin\foo.mysql

RUN echo UPDATE user SET Password=PASSWORD(‘mysql123′) WHERE User=’root’; FLUSH PRIVILEGES; .> C:\mysql-5.6.29-winx64\bin\foo.mysql

RUN mysql -u root mysql < C:\mysql-5.6.29-winx64\bin\foo.mysql

This just brings up the MySQL image perfectly. I had my own version of MySQL Dockerized image available which is still under progress. I still need to populate the Docker image details.

myown

Does Docker Engine on Windows support Swarm Mode?

Not Yet. Docker Engine on Windows Platform is still young. There has been number of contributions flowing in from Windows and Linux enthusiasts to build Windows containers.

In the future post, I will be talking about how to get simple application like wordpress up and running using Docker-compose.

[clickandtweet handle=»@ajeetsraina» hashtag=»#docker, #windows» related=»@docker» layout=»» position=»»]A Comparative Study of Docker Engine on Windows Server Vs Linux Platform[/clickandtweet]

Please follow and like us:

When using Docker for Windows, you must choose to either use Windows or Linux containers, but you can’t use both at the same time. What is the technical reason(s) for this? It’s a little counter-intuitive, since each container has its own isolated operating system.

asked Apr 6, 2018 at 8:37

JamesFaix's user avatar

Linux containers on Docker for Windows are not handled by windows itself, but they are using Hyper-V Linux VM — MobyLinuxVM. Hence the necessity to switch between Linux and Windows.

However starting from Windows 1709 and Docker in edge version you can try out linux containers on windows — see: https://blog.docker.com/2017/09/docker-windows-server-1709/

Update

As @v.karbovnichy brought up, technically on Docker for Windows you «can» run linux and windows containers simultanously — you can use docker-machine command to create additional linux-based virtual machine that will run your linux containers. Then, you can connect them into one swarm and, with a dose of good will, you will run linux and windows containers simultaneously on same machine.

docker client command itself can connect to both linux or windows docker-server and «manage» both of them — check docker login — it’s widely used in server configurations.

However as stated above, true running linux and windows containers next to each other is in preview state.

answered Apr 6, 2018 at 8:40

Miq's user avatar

MiqMiq

3,9812 gold badges18 silver badges32 bronze badges

Docker ecosystem on your Windows machine contains several components.
One is Docker command line: the docker command that you use for everything-management. The second one is Docker daemon — A self-sufficient runtime for containers, the core.

Docker daemons for Linux Containers and Windows Containers are different, but they listen for connections from the docker client on the same pipe. So one needs to be stopped for other to be started. This is the technical reason that you asked for.

However, you can observe that containers started for ex. in MobyLinuxVM is still running and available for connections when you switch to Windows containers. The only thing here is that you cannot manage them because the Docker daemon for Windows does not know how to manage Linux containers in MobyLinuxVM.

UPDATE: As described in this post,

Docker for Windows 18.02 now supports Linux and Windows containers running side-by-side via LCOW, using a single Docker daemon.

So actually now you can use one docker daemon to manage both worlds, it’s just about using the new --platform flag in docker pull.

answered Apr 6, 2018 at 8:50

v.karbovnichy's user avatar

v.karbovnichyv.karbovnichy

3,1922 gold badges36 silver badges47 bronze badges

  • Docker для windows server 2012
  • Docker desktop is shutting down windows 10
  • Docker для windows server 2008
  • Docker switch to windows containers
  • Docker desktop for windows что это