ADG Оставить заявку
Блог DevOps 4 мин чтения

Docker 17.03: новая схема версий, CE vs EE и что это значит для наших плейбуков

Docker сменил схему версионирования на YY.MM и разделил дистрибутив на CE и EE. Разбираем что это меняет в Ansible-ролях и как выбрать правильную версию для закрепления.

Контекст момента

Docker объявил смену версионирования на YY.MM и разделение на Community Edition и Enterprise Edition - первый релиз по новой схеме выйдет как 17.03

На этой неделе Docker Inc. объявила о двух вещах сразу: смене схемы версионирования и разделении на два продукта - Community Edition и Enterprise Edition. Следующий релиз выйдет как 17.03, а не 1.14. Для большинства команд это административная новость, но у нас сразу возник конкретный вопрос: что делать с docker_version: "1.13.1" в Ansible-роли?

Что именно изменилось

Версионирование. Вместо 1.x теперь YY.MM - как у Ubuntu LTS, только без «long-term» в самом номере. Первый релиз по новой схеме - 17.03, выйдет в марте. Следующий через месяц - 17.04, и так далее ежемесячно. Раз в квартал один из месячных релизов будет объявлен «стабильным» - с более длинным окном поддержки.

Community Edition vs Enterprise Edition. CE - бесплатный, доступен как раньше через apt/yum. EE - платный, добавляет встроенный оркестратор (Swarm с UI), сканирование образов на уязвимости, support от Docker Inc. и сертификацию на конкретных ОС. По сути EE это то, что раньше продавалось как Docker Datacenter.

Поддержка. CE в стабильном квартальном цикле получает патчи два месяца после следующего квартального релиза. CE в месячном цикле - только до следующего месячного. EE поддерживается год.

Почему это создаёт головную боль

Мы закрепляем версию Docker в Ansible-роли явно. Не latest, а конкретный тег - это базовая гигиена для воспроизводимости. С 1.12, 1.13 это работало понятно: цифра в переменной, плюс проверка через docker --version.

Теперь логика установки из репозитория изменится. Сейчас репозиторий Docker на Ubuntu выглядит как deb https://apt.dockerproject.org/repo .... С выходом 17.03 они переезжают на новые адреса - отдельные для CE и EE. Официальная инструкция уже показывает download.docker.com/linux/ubuntu. Это значит - переписывать роль в любом случае, не только менять переменную.

Конкретно наша роль делает примерно следующее:

- name: install docker
  apt:
    name: "docker-engine={{ docker_version }}"
    state: present

После перехода пакет называется docker-ce, не docker-engine. Если просто поменять переменную и оставить старый репозиторий - сломается. Если поменять репозиторий и оставить старый пакет - тоже сломается. Нужно обновлять синхронно.

Что мы решили делать

Разобрали варианты:

  • Закреплять месячный CE. Обновлять чаще, но каждый месяц есть свежие патчи. Проблема - надо успевать тестировать роль и выкатывать на объекты между релизами, иначе всегда будешь на N-1 без понимания что упускаешь.

  • Закреплять квартальный CE. Два месяца поддержки после следующего квартального выпуска - примерно пять месяцев на версию. Это ближе к нашему темпу. Обновления раз в квартал мы осилим без аврала.

  • EE. Год поддержки выглядит привлекательно. Но цена и необходимость договора с Docker Inc. для большинства наших объектов избыточны - мы управляем небольшими инсталляциями без нужды в Datacenter-фичах.

Выбрали квартальный CE. 17.03 станет первым кандидатом - подождём неделю-две после выхода, посмотрим на первые issue, потом обновим роль и прогоним на тестовом стенде.

Что конкретно меняем в роли

Переменная переедет с docker_version типа 1.13.1 на формат 17.03.0~ce-0~ubuntu-xenial - именно такой формат имени пакета в новом репозитории. Некрасиво, но это реальное имя в apt-cache show.

Репозиторий - новый URL, новый GPG-ключ, задача на удаление старого docker-engine перед установкой docker-ce. Плюс проверка через assert что установленная версия совпадает с ожидаемой - лучше упасть явно, чем молча поехать не на той версии.

- name: assert docker version matches
  command: docker --version
  register: docker_ver_out
  failed_when: docker_version not in docker_ver_out.stdout
  changed_when: false

Это не изменение архитектуры роли, просто обязательная переработка под новую реальность.

Про EE честно

Идея «Docker с поддержкой год» для продакшена звучит хорошо. Но в текущем виде EE это платформа вокруг Swarm, а на нескольких наших объектах мы смотрим в сторону Kubernetes. Платить за встроенный Swarm-оркестратор когда планируешь уходить на k8s - сомнительно. Посмотрим как Docker разведёт позиционирование этих двух вещей в ближайшие кварталы.

На сопровождении у нас семь объектов с Docker. Роль обновим до выхода 17.03 - с новым репозиторием и структурой, чтобы в день релиза была просто замена переменной с версией, а не авральный рефакторинг.

Контакт

Нужна такая же инженерная работа?

Опишите задачу и контекст. Ответим в течение рабочего дня, при необходимости подпишем NDA.