Docker: Windows и Linux в контейнерах на одной машине

На странице Docker for Windows я заметил очень интересную фразу:

You can install Docker for Windows, which allows you to develop and run Windows containers natively, or develop and run Linux containers using Hyper-V. This is the best of both worlds.

То есть утверждается, что можно запускать контейнеры как с Linux, так и с Windows внутри.

С Линуксом всё понятно. Для тех кто не в курсе, Docker for Windows (как и его предшественник Docker Toolbox) поднимает контейнеры на Linux внутри виртуальной машины Hyper-V и дополнительно использует различные ухищрения для интеграции с внешней ОС.

А как же запустить контейнер с Windows?

Оказалось, имеется в виду вот что. Рядом с Docker for Windows можно установить так называемый Windows-native Docker Engine и, манипулируя переменной окружения DOCKER_HOST, использовать один и тот же Docker-клиент для управления обоими демонами.

Давайте это сделаем.

Предположим, что Docker for Windows установлен, работает, и контейнеры стартуют:

docker run --rm -ti alpine sh

/ # uname -a
Linux fffdd7df57e0 4.4.20-moby #1 SMP Thu Sep 15 12:10:20 UTC 2016 x86_64 Linux

Теперь скачиваем Docker Engine для Windows. На момент написания статьи стабильного релиза ещё не было, и сборки надо было скачивать с master.dockerproject.org. Я использовал dockerd-1.13.0-dev.exe. Обратите внимание, нужен файл dockerd, с буквой «d» на конце.

Открываем PowerShell с правами администратора и выполняем команду:

Enable-WindowsOptionalFeature -Online -FeatureName containers

Затем переходим в папку со скаченным файлом и запускаем его вот так:

.\dockerd-1.13.0-dev.exe -H npipe:////./pipe/docker_win

С помощью параметра -H мы явно указали сокет (точнее именованный канал), потому что канал по умолчанию занят Докером for Winodws.

В случае успеха вы должны увидеть примерно это:

А в списке сетевых адаптеров появится «vEthernet (HNS Internal NIC)»:

Открываем ещё одно окно PowerShell, тоже под администратором.

Переключаем Docker-клиента на Windows-демон:

$env:DOCKER_HOST="npipe:////./pipe/docker_win"

и смотрим, что покажет docker info:

Видим характерные признаки:

  • Storage Driver: windowsfilter
  • OSType: windows

Можно запускать контейнер:

docker run --rm -ti microsoft/nanoserver cmd

Действительно, не обманули. Мы подняли два контейнера — один с Linux Alpine, другой с Windows Nano Server. Это круто!

К сожалению, на данном этапе нельзя поместить Windows-контейнеры и Linux-контейнеры в общую сеть. Они друг друга не видят, потому что каждый находится за своим NAT-ом. Эта проблема записана на GitHub под номером #27612.


Все материалы по теме Docker:

Видео:

Статьи:

Устаревшее:

Ваш комментарий