Перечень сокращений, условных обозначений, символов, единиц и терминов 4
Введение 5
Постановка задачи 6
Обзор литературы 7
Глава 1. Основные понятия контейнеризации 9
1.1. Контейнеризация 9
1.2. Устройство технологии Docker 9
1.3. Основные понятия Dockerfile 11
Глава 2. Приложение chainsaw 14
2.1. Устройство chainsaw 14
2.2. Использование chainsaw 15
2.3. Постановка задачи в рассмотренных условиях 16
Глава 3. Проведенные эксперименты 17
3.1. Образ приложения nginx 17
3.2. Образ приложения grafana 18
3.3. Образ приложения postgres 19
3.4. Образ приложения tomcat 20
3.5. Образ приложения peer-calls 21
3.6. Образ приложения Mycodo 21
Глава 4. Полученные результаты 23
4.1. Анализ экспериментов 23
Выводы 26
Заключение 27
Список литературы 28
Приложение 30
A. Dockerfile для образа nginx 30
Б. Dockerfile для образа grafana 31
B. Dockerfile для образа postgres 32
Г. Dockerfile для образа tomcat 34
Д. Dockerfile для образа peer-calls 37
Е. Dockerfile для образа Mycodo-app
Контейнеры в настоящее время являются одной из наиболее удобных технологий виртуализации и используются как для разработки приложений, так и для их тестирования, так как позволяют изолировать части приложений друг от друга.
Обособленный запуск приложения или его частей достигается созданием для них отдельных окружений. У каждого запущенного в контейнере приложения свои версии корневой файловой системы, списка процессов и сетевых устройств.
Контейнеры имеют преимущества перед другими способами виртуализации, такие как:
• легкость и быстрота развертки,
• работа на основе хостовой ОС,
• легкость в управлении,
• безопасный запуск приложения,
• отсутствие накладных расходов других технологий виртуализации,
• небольшие объемы.
Чаще всего, приложение, построенное с применением технологии контейнеров, работает на основе нескольких контейнеров разных технологий, взаимодействующих друг с другом. Образ одного контейнера может иметь размер больше гигабайта. Тогда весь размер пространства, занимаемого на диске, вместе с выделенной памятью на работающие контейнеры, может достигать нескольких десятков гигабайт, а время на передачу или получение образов - нескольких десятков минут. И если на рабочей машине существует ограничение по свободной памяти или существенна оптимизация нагрузки сети, например, в IoT, появляется необходимость уменьшения размера образов.
Постановка задачи
Образы корневых файловых систем для контейнеров создаются, как правило, менеджерами пакетов таким образом, чтобы человек мог их использовать интерактивно. Из этого следует, что образы контейнеров могут включать в себя программы, которые не запускаются приложением внутри контейнера и файлы, которые никогда не читаются и не пишутся.
Так как внутри контейнера работают заранее известные приложения, количество которых ограниченно, можно обнаружить те файлы и программы, которые необходимы для корректной работы приложения в изолированной среде, и исключить из образа остальные.
Задача заключается в том, чтобы уменьшить размер образов корневых файловых систем, которые используются в контейнерах приложений. Идея данной работы заключается в том чтобы определить с помощью встроенных в Linux средств отладки, какие именно файлы используются конкретными приложениями и удалить все остальные файлы из корневой файловой системы контейнера. Это позволит создать образы, которые, в основном, состоят из
• исполняемых файлов приложений,
• библиотек, которые используются этими исполняемыми файлами,
• набора конфигурационных файлов, используемых этими исполняемыми файлами и библиотеками.
Эти образы будут иметь минимально возможный размер, что позволит эффективнее использовать пропускную способность сети и дисковое пространство, а значит, получить экономическую выгоду.
Для решения данной задачи существует приложение chainsaw. Необходимо провести опыты с образами контейнеров различных приложений, провести оценку функционала и качества работы приложения, а также определить, какие параметры влияют на размер нового образа.
Обзор литературы
Было найдено несколько других приложений, которые рассматривают похожие задачи, но используют совсем другие технологии для их решения.
При разворачивании в распределенной системе крупноразмерного приложения на основе Docker контейнеров и использовании локального хранилища образов, построенного на Docker Registry, было предложено решение, именуемое FID (Faster Image Distribution) [3]. Согласно результатам исследований, при использовании P2P сети можно достичь максимального уменьшения на 91,35% времени доставки образов размером 500 MB на 200 узлах, работающих параллельно. Однако, ввиду поставленных условий, FID не применим локально или в малых системах.
В следующем исследовании проанализировано около 47 TB сжатой информации о всех публичных образах из Docker Hub с точки зрения разных аспектов [4]. Исследователи пришли к выводу, что существует огромный потенциал к дедубликации особо больших локальных хранилищ образов. Это также относится к образам, построенным при помощи менеджеров пакетов и, тем самым, имеющим избыточные данные.
Следующее исследование на практике доказало предыдущее исследование и посвящено уменьшению времени передачи образов внутри небольшой распределенной системы и Docker Registry [5]. Образ контейнера строится на основе уровней, открытых только для чтения. Многие образы содержат внутри себя одни и те же уровни, и их переиспользование на конкретной конфигурации среды, позволило максимально в 7 раз уменьшить время обновления образа. Использовалось решающее дерево для того, чтобы определить, каким методом отправить образ: классическим или при помощи дедубликации. Притом, образы, допускающие дедубликацию, определялись с ошибкой 5,3% — 11,4%.
В Wharf, расширении Docker для распределенных файловых систем, также анализирующем уровни образа, получилось до 12 раз сократить время доставки образов [6]. Более того, данное решение оптимизирует работу Docker на распределенных файловых системах, например, реализует параллельную работу с образами.
Однако, все данные решения разработаны под конкретные системы и не применимы локально, в малых системах или для небольших приложений. Именно поэтому приложение chainsaw, которое рассмотрено в данном исследовании, имеет свою актуальность.
Приложение chainsaw действует изнутри образа и с помощью системного вызова ptrace перехватывает системные вызовы, которые работают с файлами, из их аргументов извлекает пути к файлам и сохраняет их.
Подобным образом действует приложение CARE, которое сканирует файловую систему и ее состояние и переменные среды сохраняет в архив, с помощью которого можно добиться полного повторения условий, в которых была запущена программа [7]. В случае chainsaw используемые файлы не сохраняются в архив, а используются для того, чтобы вычислить неиспользуемые файлы и удалить их.
В процессе данной работы на примере нескольких образов была исследована работа приложения chainsaw. Результатом данной работы стали Dockerfile, в которых наглядно представлены все особенности работы с данным приложением, и анализ факторов, влияющих на размер нового образа.
Приложение chainsaw действительно справляется с поставленной за-дачей и действительно будет полезно при разработке приложений на основе технологии Docker.
Несмотря на полученные положительные результаты, задача оставляет пространство для дальнейших исследований и экспериментов:
• реализация нескольких образов chainsaw для разных базовых дистрибутивов для повышения удобства использования приложения;
• исследовать обнаруженные в процессе работы проблемы и попытаться разработать пути их решения;
• разработать интерфейс, упрощающий отладку проблем, возникающих при создании нового образа.
[1] Docker Inc. What is a Container? [Электронный ресурс]: URL:https://www.docker.com/resources/what-container
(дата обращения 23.05.21).
[2] Docker Inc. Docker overview [Электронный ресурс]: URL:https://docs.docker.com/get-started/overview/ (дата обращения 23.05.21).
[3] Wang Kangjin, Yang Yong, Li Ying et al. FID: a faster image distribution system for Docker platform // IEEE 2nd International Workshops on Foundations and Applications of Self* Systems (FAS*W). Tucson, AZ. 2017. P. 191-198.
[4] Nannan Zhao, Tarasov V., Hadeel Albahar, Ali Anwar et al. Large-scale analysis of Docker images and performance implications for container storage systems // IEEE Transactions on Parallel and Distributed Systems Submit Manuscript. 2021. Vol. 32. No 4. P. 918-930.
[5] Zhigang Lu, Yuewen Wu, Jiwei Xu, Tao Wang. An acceleration method for Docker image update // IEEE International Conference on Fog Computing (ICFC). Prague, Czech Republic. 2019. P. 15-23.
[6] Chao Zheng, Rupprecht L., Tarasov V. et al. Wharf: Sharing Docker images in a distributed file system // SoCC ’18: Proceedings of the ACM Symposium on Cloud Computing. New York, USA: Association for Computing Machinery. 2018. P. 174-185.
[7] CARE [Электронный ресурс]: URL:https://proot-me.github.io/care/ (дата обращения: 23.05.21).
[8] Docker Inc. Dockerfile reference [Электронный ресурс]: URL: https://docs.docker.com/engine/reference/builder/ (дата об-ращения 23.05.21).
[9] GitHub репозиторий приложения chainsaw [Электронный ресурс]: URL:https://github.com/LazyDareDevil/chainsaw (дата обращения: 23.05.21).
[10] GitHub репозиторий приложения peer-calls [Электронный ресурс]: URL:https://github.com/peer-calls/peer-calls (дата обращения: 23.05.21).
[11] Docker Hub репозиторий образа chainsaw [Электронный ресурс]: URL:https://hub.docker.com/r/lazydaredevil/chainsaw (дата об-ращения: 23.05.21).
[12] GitHub репозиторий приложения Mycodo [Электронный ресурс]: URL: https://github.com/kizniche/Mycodo (дата обращения: 23.05.21).