imageВ бизнес-продразделении Odin* недавно объявили о поддержке контейнеров Docker в Virtuozzo. Эта поддержка – часть нашей стратегии по реализации Virtuozzo как инфраструктурной основы для платформ контейнерной виртуализации, наиболее подходящей для работы в средах, где главные требования – безопасность и производительность.

Стоит отметить, что такие контейнерные проекты, как Docker, иногда называют конкурентами нашим собственным разработкам. На самом деле, мы работаем на разных уровнях – Docker занимается управлением приложениями, а мы виртуализацией – в том числе и той, что используется в Docker. В результате нас нередко связывают партнерские отношения и совместная работа. Например, вместе с Docker мы разрабатываем проекты системных библиотек, предоставляющих интерфейс к ядерным контейнерным компонентам – это и начатый Docker проект Libcontainer (вместе с Canonical, Google и RedHat), и наш — libct (вместе с LXC и Google).
Ниже – пример таких возможностей, которые дают совместные технологии.

Поддержка Docker внутри Virtuozzo добавляет “контейнеры внутри контейнеров” в ядро Virtuozzo Linux, позволяя создавать контейнеры Docker внутри контейнеров Virtuozzo. Так появляются дополнительные пространства имен для Docker внутри виртуального контейнера Virtuozzo. Аналогичный сценарий в гипервизорах, таких как KVM, работает по умолчанию – поскольку ядро гостевой ОС и ядро сервера там разделены, пространства имен изначально не пересекаются. Теперь же появилась возможность делать то же самое, добавив преимущества контейнерной виртуализации, а именно: быстрый запуск, мгновенное масштабирование, высокую эластичность и производительность, равную производительности физического оборудования.
Для сервис-провайдеров и всех остальных, кому нужен многопользовательский режим, это также означает, что контейнер Virtuozzo может устранить проблемы безопасности Docker без потерь производительности, которые дают гипервизоры. Собственные средства разграничения в Docker весьма ограничены — к примеру, как отмечено в этой статье, наличие доступа к командной строке Docker по сути означает наличие прав пользователя root на сервере.
Вот пример команды позволяющей получить root:

$ docker run -v $PWD:/stuff -t my-docker-image /bin/sh -c 'cp /bin/sh /stuff && chown root.root /stuff/sh && chmod a+s /stuff/sh'

image

Результатом ее выполнения будет копия shell’а в текущем каталоге, c выставленным suid битом (что позволяет запускать shell не от имени текущего пользователя, а от имени владельца файла – в данном случае root).

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

Однако данная проблема легко решается, если на сервере работает Virtuozzo. Создание контейнеров Virtuozzo эффективно разделяет ресурсы сервера, делая сервер по-настоящему многопользовательским. Клиенты, изолированные друг от друга с помощью контейнеров Virtuozzo, могут использовать Docker точно так же, как и на физическом сервере, но с добавлением нового уровня изоляции и управления ресурсами (и поэтому клиенты не конкурируют друг с другом за физическую память, дисковое пространство и ресурсы процессора). В результате у каждого появляются свои собственные контейнеры Docker, а общая производительность остается такой, как если бы они были на физическом сервере.

Вот пример, почему Docker крайне удобен пользователям, которым нужно запустить приложение в облаке. Для начала попробуем запустить Docker-приложение на своем собственном ноутбуке:

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
Pulling repository hello-world
91c95931e552: Pulling image (latest) from hello-world, endpoint: https://registr91c95931e552: Download complete
a8219747be10: Download complete
Status: Downloaded newer image for hello-world:latest
Hello from Docker.
This message shows that your installation appears to be working correctly.
...


Это можно делать многократно, правя код и устраняя баги (естественно, когда это не hello world, а что-нибудь более полезное) – в какой-то момент мы принимаем решение – все, готово, пора выпускать и внедрять.

Дальше делаем так:

$ export DOCKER_HOST=tcp://server:2376 DOCKER_TLS_VERIFY=1


(Предполагается, что TLS-сертификаты уже разложены и Docker настроен им доверять). Server – это адрес сервера, на котором крутится наше приложение в облаке. Запуск свежей копии приложения на нем теперь – это уже знакомое

$ docker run hello-world


Готово – приложение запущено, и, что важно, – оно попало на сервер вместе с окружением и системными библиотеками, с которыми отлаживалось и тестировалось – то есть вероятность сломать его неправильными настройками почти нулевая.
Являясь членом unix-группы docker внутри контейнера Virtuozzo, каждый пользователь по-прежнему будет иметь возможность повысить доступ до уровня root – но это будет root изолированного контейнера, а не root сервера. То есть Virtuozzo-контейнер остается однопользовательским — но на физическом сервере таких с Docker уже может быть много.
Это лишь один из первых поддержанных в Virtuozzo сценариев c контейнерами приложений, который мы реализовали и о котором хотели рассказать. Будут и другие, поэтому следите за обновлениями.

* Под этим новым брендом с марта 2015 года работает бизнес-продразделение компании Parallels, отвечающее за решения для сервис-провайдеров

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


  1. pavelodintsov
    06.05.2015 10:30

    Это прекрасно! Мы потестировали фичу — все работает на ура!

    Но мы хотим рабочий chkpnt/resume для контейнеров с Docker. Это промышленные фичи, без которых поддержка Docker для нас (говорю от лица FastVPS) не имеет смысла. Без этой фичи не работает Live миграция, без нее приходится жестко вырубать контейнер, когда кончился срок оплаты клиентом (а это может повредить файлы) и множество других, неприятных моментов (как нарушение uptime при ребуте ферм), которые не позволяют внести эту фичу в продакшен, а хочется! Как хочется! И клиенты просят :)


  1. moruga Автор
    06.05.2015 19:48

    Павел, спасибо за отзыв
    Онлайн миграция будет в 7ке, когда мы перейдем на ядро с CRIU
    Проблема в том что докер поднимает пачку подсистем в ядре которые сейчас check point/resume не покрывает. При этом объем работы такой что писать его сейчас, при том что паралельно делается новое ядро в котором эта часть не используется — работа насмарку — поскольку по оценкам это сойдется почти одновременно
    И еще — я бы рекомендовал подождать с продакшеном пока не выйдет апдейт на graph driver с поддержкой нормальных snapshots (мы его делаем прямо сейчас и отдаем в общий код docker ). Текущий vfs создает копии — для тестирования и ограниченного использования (нескольк images, несколько snapshots) годится, но если не ограничивать создание snapshots — съедается неразумное количество места на диске