1. Обзор Windows Docker (кратко)
2. Как мы построили систему билда приложений в Docker (Visual Studio\Mongo\Posgresql\etc)
3. Примеры Dockerfile (выложенные на github)
4. Отличия процессов DockerWindows от DockerLinux (Долгий билд, баги, remote-регистр.)
4. Что мы имеем
• Компания по разработке ПО
• Увеличивающееся количество продуктов
• Требуется различное сборочное окружение для команд
• Группа поддержки процессов Continuous Integration
• Поддержка новых и старых релизов
5. Как было раньше
• Группировка проектов по используемым технологиям
• Создание идентичного окружения на пуле серверов
• Процесс изменения окружения:
• Изменения вносятся вручную на одном сборочном сервере
• Смотрим, что ничего не сломалось
• Вносим изменения на все сервера
• Чиним то, что сломалось позже
• Делается для экономии ресурсов и отказоустойчивости
• Используется 2 сервера:
• 16CPU
• 256GB RAM
• SSD ~ 3TB
7. Проблемы
1. Сборочное окружение ломается
2. Командам нужно изменять окружение самостоятельно
3. Иногда не соблюдается требование отказоустойчивости
4. Не сохраняется сборочное окружение прошлых релизов
5. Неполная утилизация ресурсов виртуальных машин
9. Долгожданный
• Docker показал себя эффективным инструментом для решения озвученных
проблем
• Опыт работы в системе сборки с Docker Linux > 4 лет
• Своя инфраструктура Docker Registry (Artifactory)
• Windows Docker анонсирован в сентябре 2016 года
13. Размер ПО: делаем как в Linux
Linux
• У каждой команды свой docker образ (и не один)
• У каждой компоненты может быть свой docker образ
• Допускается создание фича-веток docker образов
• На сборочных серверах вычищаются все docker образы по ночам
14. Размер ПО: делаем как в Linux
Критерий Linux Windows
Размер образа с основным
набором ПО для компиляции
до 5 GB до 45 GB
Среднее время сборки образа с
нуля
до 20 минут до 70 минут
Среднее время pull до 3 минуты до 50 минут
15. Размер ПО: делаем по своему
Windows
• Есть базовые образы, с предустановленным часто используемым ПО
o Python
o Visual Studio Build Tools
o SDKs
• У каждой команды есть свой образ, где они могут добавлять ПО
• Тестирование новых образов происходит строго на одном сервере
• Docker образы очищаются редко, практически вручную
16. Размер ПО: делаем по своему
vc140
Visual Studio 2015
SDKs
Other
vc150
Visual Studio 2017
SDKs
Other
team1
FROM: vc140
PostgreSQL
Python 3.6 x64
team2
FROM: vc150
.NET Core 2.0
Python 2.7 x86
17. Процесс внесения изменений: установка ПО
• Сохранить exemsi на сервер по адресу yourstorage.example.ru/win/packages
— храним установщики, чтобы меньше зависить от интернета (не всегда
получается, как, например, с msbuild-tools)
• С помощью USSF (Universal Silent Switch Finder) найти ключи для установки
в silent mode
• Добавляем строчку с помощью скрипта install-web.ps1 (или download-and-
unpack) по аналогии с существующими
Примеры Dockerfile доступны по ссылке: github.com/allburov/docker-windows
20. 260 символов хватит всем
• Win32 API MAX_PATH=260 — имя файла не больше 260 символов
• В Windows Docker проблема появляется. Если к запускаемому докеру
подключать директорию, то она подключается как symlink
• c:build =>
• ?ContainerMappedDirectories30FA5B39-9158-4785-A3A9-0435BFF32D2B
• Даже если в хостовой системе путь допустимый и меньше 260 символов, то
в docker он превращается в более длинный путь
• Обещали в локальных политиках дать возможность отключить ограничение
на количество символов в имени
21. У каждого слоя свой hostname
Проблема установки служб
1. Устанавливается в слое rabbitmq
2. В следующем — запускается
3. Проходят еще шаги
4. Запускается контейнер — но у него уже другой hostname
5. Rabbitmq отказывается запускаться
Hostname mismatch: node "rabbit@202fd51f02fd" believes its host is different.
Please ensure that hostnames resolve the same way locally and on
"rabbit@202fd51f02fd"
22. Silent install & GUI
Не всё ПО поддерживает Silent install mode
• gvim (vim для Windows) — ранее не поддерживал silent-установку,
пришлось править инсталлятор
Не всё ПО (даже установщик) может работать без интерфейса
• NET SDK 4.0 — устанавливается только в GUI-режиме
24. Дальнейшее развитие
1. Версионирование docker образов
• Нужно для сохранения при релизах наших продуктов
2. Устанавливать продукты в docker и запускать интеграционные тесты
3. Поставлять dev-окружение контейнерами
4. Поставлять production docker образы
Текст доклада и примеры Dockerfile: github.com/allburov/docker-windows
25. Итоги
1. Как было раньше
• только группа Continuous Integration имеет доступ к серверам
2. Проблемы
• долго
• ломалось и нет версионирования
• неэкономно
3. Решение
• упрощение установки — скрипты, фиксированный процесс
• своя схема для Windows
4. С чем столкнулись
• Symbolic Links
• Silent install mode