Порівняльний аналіз Docker Engine на платформах Windows Server і Linux

Конференція 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 доступні на платформі Microsoft.

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

docker version

Якщо ви зіткнулися з повідомленнями про помилки, на зразок показаних нижче, які довелося побачити мені, виконайте таку команду:

Start-Service Docker


Повідомлення про помилки і запуск Docker

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

docker search microsoft

Ось, наприклад, що мені вдалося знайти.


Результати пошуку додатків

Ще можна скористатися такою командою:

docker windows search

У відповідь система виведе приблизно такий список:


Результати пошуку додатків

Про обмеження 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.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.