imageДанная публикация является разбором особенностей контейнерной виртуализации Docker под системой Windows.

Она не претендует на роль исчерпывающей и по мере необходимости будет обновляться и дополняться.

За практическим руководством с нуля советую обратиться к этой публикации.

Содержание



Предварительные настройки


Контейнерная виртуализация или виртуализация на уровне операционной системы Docker нативно работает только на дистрибутивах Linux и FreeBSD (экспериментально).
На Windows вам понадобится гостевая Linux система либо специальная минималистичная виртуальная машина с ядром Linux от разработчиков Docker, которая и ставится из коробки.
Само собой разумеется, что вы включили виртуализацию у себя в BIOS/UEFI
Пункт настройки может называться по-разному: VT-x, VT-d, Intel VT, AMD-V, Virtualization Technology.

Еще одним минимальным системным требованием будет разрядность системы x64 и версия не ниже Windows 7 Pro.

Выбор между Docker Toolbox on Windows или Docker for Windows


Появление Docker Toolbox on Windows и Docker Toolbox on Mac было большим событием.

Сборка включается в себя сам docker, утилиту docker-compose, утилиту для работы с виртуальной машиной docker-machine и клиент Kitematic.

Используется виртуальная машина (по умолчанию на VirtualBox) с минималистичным Linux окружением.

Позже для новых операционных систем выпустили Docker for Windows и Docker for Mac, которая на текущий момент является актуальной версией и продолжает развиваться.

Выбор между версиями не сложный:
— Если у вас Windows 10 x64 Pro, Enterprise или Education то включаем службу Hyper-V и ставим Docker for Windows.

Заметьте, что после включения службы Hyper-V пропадет возможность запускать и создавать x64 виртуальные машины на VirtualBox.

— Если же у вас другая версия Windows(7 Pro, 8, 8.1, 10 Home) то ставим VirtualBox и Docker Toolbox on Windows.

Несмотря на то, что Docker Toolbox разработчиками признан устаревшим работа с ним слабо отличается от Docker for Windows.

Вместе с установкой Docker Toolbox будет создана виртуальная машина.
В самом VirtualBox можно будет добавить оперативной памяти и ядер процессора на ваше усмотрение.

Windows контейнеры и Linux контейнеры


Docker for Windows предоставляет возможность переключать контейнеризацию между Linux и Windows версией.

В режиме Windows контейнеризации вы можете запускать только Windows приложения.
Замечу, что на май 2018 года в официальном Docker Hub существует всего 13 образов для Windows.

После включения Windows контейнеризации не забудьте добавить внешнюю сеть.

В конфигурационном файле docker-compose.yml это выглядит так:

networks:
  default:
    external:
      name: nat

Особенности монтирования папок


На примонтированных volume-ах не кидаются события файловой системы, поэтому inotify-tools не работает.
Спасибо пользователю eee

Если вы разрабатываете свой проект и пользуетесь docker-compose вне домашней папки то вам нужно будет продать некоторые манипуляции.

Используя Docker for Windows для монтирования нового диска у вашего локального пользователя обязательно должен стоять пароль, который будет использоваться для доступа к shared папки.

Особенность заключается в том, что монтируемые внутрь контейнера диск будет монтироваться как от удаленной машины //10.0.75.1/DISK_DRIVE по протоколу SMB.

Для Docker Toolbox диски монтируются в самом VirtualBox на вкладке «Общие папки»
Пример для диска «D»:



Права доступа к монтируемым файлам и папкам


Как бы вам не хотелось, но для всех примонтированных из хост-машины файлов и папок будут стоять права 755 (rwx r-x r-x) и поменять их вы не сможете.

Остро встает вопрос при монтировании внутрь файла закрытого SSH ключа, права на который должны быть только у владельца(например 600).

В данном случае либо генерируют ключ при создании образа, либо прокидывают сокет ssh-agent с хост-машины.

Монтирование с хост-машины или volume


Монтирование внутрь контейнера происходит с использованием сети и протокола SMB, следовательно, внутри контейнера диск «D:\» будет примонтирован из источника //10.0.75.1/D
Использование volume внутри контейнера отображается как монтирование локального диска /dev/sda1, что влияет на скорость работы.

Простым тестом копирование файла на обычном HDD скорость работы получилась следующая:
Тип Чтение Запись
Монтирование ~85 МБ/с ~50 МБ/с
Volume ~340 МБ/с ~220 МБ/с

Такая разница в скорости скорее всего связана с тем, что в volume данные сбрасываются на диск постепенно, задействуя кеш в ОЗУ.

Особенности разметки диска GPT и MBR


Данный пункт не является истинной так как опровергающей или подтверждающей информации в интернете найти не смог.

Если на хост-машине таблица разделов MBR, то контейнер с MySQL/MariaDB может упасть с ошибкой:
InnoDB: File ./ib_logfile101: 'aio write' returned OS error 122. Cannot continue operation
По умолчанию в базе дынных включен параметр innodb_use_native_aio, отвечающий за асинхронный ввод/вывод и его надо будет выключить.

Данная проблема также встречается на некоторых версиях MacOS.

Docker Toobox to Windows


Главное правило: начинать работу с запуска ярлыка на рабочем столе «Docker Quickstart Terminal», это решает 80% проблем.

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

eval $(docker-machine env default)

— Если все же возникают проблемы из разряда «docker: error during connect», необходимо выполнить:

docker-machine env --shell cmd default 
@FOR /f "tokens=*" %i IN ('docker-machine env --shell cmd default') DO @%i

Название Docker Machine по умолчанию default.

Docker Swarm


Ни в Docker for Mac, ни в Docker for Windows — нет возможности использовать запущенные демоны в качестве клиентов кластера (swarm members).
Спасибо пользователю stychos

Полезные ссылки


Docker Toolbox on Windows
Docker for Windows
Практическое руководство по Docker

Заключение


Особенности работы с Docker контейнеризацией на системе Windows не отличается от работы на Linux за исключение разобранных выше.

В статье я умышленно не упомянул заметно низкую скорость работы контейнеров и overhead используя систему Windows как само собой разумеющееся.

Буду рад услышать ваши отзывы. Не стесняйтесь предлагать улучшения или указывать на мои ошибки.

Комментарии (26)


  1. Sigest
    17.05.2018 19:03

    А если какая-то выгода от использования Docker на Windows вместо привычных VmWare (которая к слову тоже не хочет запускаться с включенным Hyper-V) и VirtualBox? Ну кроме того что он бесплатный.


    1. zelenin
      17.05.2018 19:36
      +1

      это ведь разные вещи, если даже отдаленно вам это кажется знакомым.


      1. gecube
        17.05.2018 21:18

        Я думаю, что более важный вопрос — есть ли выгода от использования Docker for Windows по сравнению с использованием нативной линукс версии в VirtualBox (ес-но с установленным любимым дистрибутивом линукс внутри ВМ)


        1. zelenin
          17.05.2018 21:24

          Ответ такой же. Это разные вещи.


          Docker is an open platform for developers and sysadmins to build, ship, and run distributed applications, whether on laptops, data center VMs, or the cloud.


          1. gecube
            18.05.2018 07:45

            Я имел в виду докер под Линукс в ВМ. Смотрите внимательней.


            1. VokaMut Автор
              18.05.2018 10:12

              Выгоды не будет, а будет только больший overhead т.к. вам нужно крутить полноценную ОС в виртуалке, а не минимально необходимую сборку с ядром linux, которая занимает всего 50-100МБ.
              Плюс вы лишаете себя удобной работы с докером из хост машины.
              В вашем случае проще использовать Vagrant, чем Docker в полноценной виртуалке


              1. 4144
                19.05.2018 19:52

                Если вы имеете в виду, что минимальная сборка занимает 50-100MB оперативной памяти, то это совсем не минимальная сборка, а как раз вполне обычный дистрибутив, в котором из авто запуска выкинули не нужные демоны.


  1. dima_eam
    17.05.2018 19:03
    +1

    В Win 7 еще невероятный гемор с монтированием томов — они монтируются пустыми github.com/docker/for-win/issues/298


    1. VokaMut Автор
      18.05.2018 10:01

      Скорее всего решение проблемы в монтировании в виртуалку нужного диска или проблем с протоколом SMB


  1. Alxly
    17.05.2018 20:06

    из своего опыта, по ощущениям, докер на винде работает чуток быстрее, чем на маке. не отслеживал последнее время-починили ли багу со скоростью в маке, так как была реальная проблема из-за тормозов. ну и еще в винде могут быть проблемы с билдом контейнера.


    1. VokaMut Автор
      17.05.2018 22:41

      На MacOS говорят большой overhead из-за использования в ней специфичной файловой системы.


      1. stychos
        17.05.2018 23:45

        Было такое, раньше маунты жутко тупили, но вроде как поправили (запилили osxfs).


  1. stychos
    17.05.2018 23:49

    Плохо, что нигде не пишут большим предупреждающим шрифтом, что ни в Docker for Mac, ни в Docker for Windows — нет возможности использовать запущенные демоны в качестве клиентов кластера (swarm members).


    1. VokaMut Автор
      18.05.2018 09:52

  1. fukkit
    18.05.2018 08:09

    Докер в Винде — это для тех, кто любит Ops больше, чем Dev.


    1. VokaMut Автор
      18.05.2018 10:13

      Докер на Windows доставляет больше боли, чем должен, я с вами полностью согласен.
      В этом и причина написания данной статьи.


  1. eee
    18.05.2018 08:39

    Еще на примонтированных volume-ах не кидаются события файловой системы, поэтому inotify-tools не работает.


    1. VokaMut Автор
      18.05.2018 10:07

  1. PetSerVas
    18.05.2018 10:57

    Docker for Windows предоставляет возможность переключать контейнеризацию между Linux и Windows версией.


    В последних версиях Docker for Windows есть функция LCOW (Linux containers on Windows), которая позволяет запускать Linux контейнеры вместе и Windows контейнерами.


  1. glogrus
    18.05.2018 10:57

    Информация во многом сильно устаревшая. Под Windows 10 x64 Pro, Enterprise есть нативный linux. Не виртуальная машина, а именно Linux subsystem. Install the Windows Subsystem for Linux. При включении в Docker for Windows Microsoft’s Linux containers on Windows (LCOW) одновременно будут работать несколько контейнеров с Windows и Linux. С Swarm есть проблемы, но с сетью. Windows и Linux не видят сеть друг друга. Linux видит Linux. В принципе мне это не было нужно, но на форуме docker были свежие обсуждения где даже удалось поднять swarm из Windows + Linux. Сам не пробовал, настаивать не буду. И про «на май 2018 года в официальном Docker Hub существует всего 13 образов для Windows» тоже сильно преуменьшено. Это если искать по ключевому слову win? Попробуйте еще microsoft, mssql, nanoserver к примеру. Сильно удивитесь разнообразию.


    1. VokaMut Автор
      18.05.2018 11:15

      Спасибо, протестирую и напишу в статье если найду проблемы.


  1. valentinmk
    18.05.2018 11:11

    1. Самый большой косяк, с которым я столкнулся это баг с правами доступа после запроса и смены пароля по доменной политики — все, после этого Docker for Windows пришлось удалять и искать какой то старый билд в ветке 17. В новой версии похоже исправили, но сидишь как на пороховой бочке.
    2. По опыту Тулбокс не удобен при разработке из-за того, что он не биндит localhost, а какой-то условный 192.168.100.99, который приходится прокидывать через переменные среды или хардкодить.


  1. OnYourLips
    18.05.2018 12:13

    Работает очень костыльно и криво, причем прилетает оттуда, откуда подвоха не ожидаешь.

    Мне пришлось отдельный компьютер достать для задач, связанных с докером и кубернетсом и ставить на него линукс. Этот способ гораздо проще и бюджетнее (с учетом сохраненного времени) даже если придется покупать отдельный и достаточно производительный ноутбук.


  1. huksley
    18.05.2018 12:30

    По поводу образов для Windows Containers. Есть еще образы в официальном репо Microsoft на Docker Hub.

    Папки в Docker Toolbox (для Windows 7/8.1) лучше не подключать как volume — очень медленно выполняются операции чтения/записи.

    По опыту Тулбокс не удобен при разработке из-за того, что он не биндит localhost

    Можно пробросить порты с 192.168.100.99 на localhost — делается через VirtualBox интерфейс в настройках виртуальной машины default.

    Для себя сделал решение — просто перейти на разработку под Linux. Нативная поддержка Docker. Весь инструментарий для разработки Java/Frontend/etc поддерживается нативно. Для чего-нибудь экзотичного VirtualBox с Windows 7.


  1. dmitry_dvm
    18.05.2018 12:43

    А если в WSL поставить линуксовый докер будет нормально работать?


    1. VokaMut Автор
      18.05.2018 13:01

      Еще одна прослойка, не пробовал.