Alpine Linux, легковесный дистрибутив для Docker-образов

Alpine Linux: оптимальный дистрибутив для Docker-образов


Август 04, 2022


Alpine Linux — это невероятно маленький дистрибутив Linux, который весит всего 2,67 МБ. Это в десять раз меньше, чем размер самых популярных дистрибутивов Ubuntu и Debian. Именно поэтому Alpine Linux всё чаще используется в виртуализации или контейнеризации.

Если вы хотите перейти на более компактную ОС, но переживаете, что в Alpine не будет нужных вам утилит, эта статья для вас. Мы расскажем, как в Alpine сочетаются крошечный размер и оптимальная функциональность, объясним, в каких случаях он может вам не подойти, и предложим альтернативное решение для корпоративных клиентов.

  1. Внутри Alpine Linux
    1. musl
    2. BusyBox
    3. OpenRC
    4. apk tool
  2. Три преимущества Alpine Linux для Docker-контейнеров
    1. 1. Маленькие образы
    2. 2. Скорость
    3. 3. Безопасность
  3. Три потенциальных недостатка Alpine Linux
    1. 1. Производительность
    2. 2. Отсутствие коммерческой поддержки
    3. 3. Проблемы с совместимостью и миграцией
  4. Новый Linux: улучшенный Alpine с корпоративной поддержкой
  5. Еще по теме
  6. Полезные ссылки

Внутри Alpine Linux

Все Linux-дистрибутивы построены вокруг ядра и набора утилит и компонентов, которые можно добавлять или удалять. Команда Alpine, удалив все лишнее, смогла создать действительно компактный дистрибутив, включающий в себя основные утилиты без лишних зависимостей. При этом у разработчиков есть возможность добавить все модули, которые могут им понадобиться. Но секрет Alpine не только в отсутствии лишних деталей — в нем используется альтернативный функционал, способствующий дополнительной оптимизации размера.

musl

Alpine Linux основан на библиотеке musl. В отличие от других популярных дистрибутивов, использующих glibc, musl — это минималистичная реализация Си-библиотеки. Как говорят участники проекта musl, он будет завершен, только когда нечего больше будет удалять. Код musl гораздо чище, чем код glibc, у которой за плечами 35 лет истории и много устаревших фич в багаже. Все это можно увидеть в сравнительной таблице musl и glibc. Кроме того, в glibc присутствует оптимизированный код для повышения производительности. В итоге glibc потребляет гораздо больше ресурсов и требует больше памяти, так как она поддерживает легаси-код и содержит не универсальные компоненты. При этом даже если приложениям нужны locales, разработчики предпочитают использовать сторонние, более производительные библиотеки.

У musl, наоборот, статические и динамические издержки меньше. Библиотека не поддерживает некоторые фичи, например, устаревшее поведение BSD для setjmp/longjmp, устаревшие некорректные спецификаторы формата, ленивое связывание и т.д. В библиотеке также поддерживается только урезанный набор символов, соответствующих набору по умолчанию. Но при этом musl включает улучшенные возможности, такие как легковесные заголовочные файлы, нативный многобайтовый UTF-8 и правильное поведение в состоянии end-of-file в соответствии с требованиями ISO C/POSIX.

В результате musl более безопасна благодаря меньшей поверхности атаки и требует меньше памяти. Но за всё нужно платить, и в случае с musl — это сложности с производительностью, хотя они не всегда заметны и не столь критичны, как может показаться.

Также стоит отметить, что musl совместима с большинством приложений, но в некоторых случаях могут потребоваться исправления и патчи для устранения ошибок, возникших при миграции. Наборы патчей доступны на странице совместимости musl.

BusyBox

BusyBox, набор Unix-утилит командной строки, был изначально разработан для встроенных систем и поэтому занимает крайне мало памяти — всего 1 МБ. Поэтому дистрибутивы, основанные на BusyBox, весят гораздо меньше. Он упакован в единый файл, что позволяет экономить ресурсы благодаря одному набору заголовочных файлов ELF. Приложение содержит упрощенные версии 400 основных Unix-утилит, необходимые для администрирования системы. При этом BusyBox можно кастомизировать, добавляя или удаляя утилиты. Хотя некоторые команды ввиду оптимизированного размера могут отсутствовать, можно установить пакет coreutils, включающий множество базовых утилит командной строки.

OpenRC

Помимо musl и BusyBox в Alpine Linux используются и другие альтернативные тулы. Один из них — OpenRC, система запуска стартовых скриптов. От systemd, применяемой в большинстве Linux дистрибутивов, ее отличает маленький размер, модульность, эффективное потребление системных ресурсов и отсутствие лишних фич.

apk tool

В качестве менеджера пакетов в Alpine используется apk (Alpine Package Keeper). apk-tools меньше yum/rpm or deb/apt, и хотя у него есть недостатки, он тоже способствует уменьшению размера Alpine.

Три преимущества Alpine Linux для Docker-контейнеров

1. Маленькие образы

Основное преимущество Alpine Linux заключается в крохотном размере. Чем меньше Docker-образы, тем больше вы сэкономите на развертывании в облаке вне зависимости от уровня масштабирования. Сравним размеры базовых контейнерных образов нескольких популярных дистрибутивов Linux:

Дистрибутив Размер
Ubuntu 27,01 МБ
Debian 29,93 МБ
CentOS 79,65 МБ
Alpine Linux 2,67 МБ

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

Образ на базе Alpine Linux и Axiom JDK Lite весит всего 42.72 МБ — посчитайте, сколько вы сэкономите в облаке! Axiom JDK — это доверенный Java-дистрибутив с российской техподдержкой. Если вы разрабатываете на Java, Axiom JDK станет полноценной заменой Oracle JDK. Лицензию на Axiom JDK можно приобрести у наших партнеров.

2. Скорость

Ещё один плюс Alpine — высокая скорость pull. Процесс разработки подразумевает постоянное внесение изменений в код, и разработчики много раз в день выполняют запросы push и pull. В зависимости от задачи, базовый Docker-образ Alpine загрузится в пять или три раза быстрее, чем образ Debian. Быстрое выполнение pull-запроса помогает сэкономить трафик и повысить производительность команды благодаря минимизации времени ожидания.

3. Безопасность

Чем меньше поверхность атаки, тем выше безопасность — в этом плане Alpine Linux максимально минималистичен. Он не содержит большое количество пакетов и библиотек, поэтому риск атак снижается. Более того, члены проекта внедрили в дистрибутив дополнительные фичи безопасности. Так, бинарные файлы компилируются в формате PIE (позиционно-независимых исполняемых файлов), а OpenSSL был заменен на более безопасный LibreSSL. Команда также регулярно выпускает CVE фиксы.

Три потенциальных недостатка Alpine Linux

Alpine Linux подойдет не всем. Расскажем о некоторых характеристиках дистрибутива, которые могут не соответствовать целям вашего бизнеса.

1. Производительность

Несмотря на то, что в большинстве случаев разница между производительностью musl и glibc незначительна (а если речь идет о встроенных системах, musl показывает даже лучшие результаты), некоторые бенчмарки1,2 продемонстрировали худшую производительность musl по сравнению с glibc в многопоточной среде. Иногда причина кроется в реализации malloc, и переключение на mimalloc или jemalloc, например, может решить проблему. Но всё зависит от вашего приложения: возможно, вам больше подойдет дистрибутив с glibc.

2. Отсутствие коммерческой поддержки

Alpine Linux — это некоммерческий проект в отличие от некоторых других популярных дистрибутивов Linux, таких как SUSE и RHEL. У дистрибутивов, разрабатываемых и поддерживаемых сообществом, есть плюсы: экономия на лицензии, быстрое внедрение инноваций, неформальная атмосфера на форумах поддержки. При этом энтузиасты, участвующие в проекте, ничем не хуже специалистов платной техподдержки. С другой стороны, члены сообщества, работающие на добровольных началах, не обязаны мгновенно реагировать на заявки пользователей, так что решение вашей проблемы может затянуться на неделю, а то и больше. У команды некоммерческих проектов также нет четкого руководства или SLA. Alpine Linux может вас разочаровать, если вы

  • Привыкли общаться с партнерами в рамках делового общения
  • Хотите, чтобы ваши проблемы решались быстро
  • Хотите получать своевременные патчи и обновления в соответствии со строгим графиком

Не следует пренебрегать коммерческой поддержкой, ведь она — как страховка, которую вам никто не продаст, когда у вас уже возникли проблемы, в результате чего вы заплатите в десятки раз больше за устранение последствий. Поэтому мы советуем заключить контракт с надежным бизнес-партнером, который будет поддерживать вашу ОС в безопасности.

3. Проблемы с совместимостью и миграцией

Если вы уже используете дистрибутив, основанный на glibc, переход на musl будет непростой задачей. Дело в том, что некоторые приложения или их зависимости скомпилированы с динамической линковкой к libc, а поскольку musl и glibc — это разные имплементации libc, то сломается резолвинг. Чтобы всё исправить, придется пересобирать приложение и зависимости с новой версией libc, на которую выполняется миграция. Это приведет к ошибкам, связанным с совместимостью. В некоторых случаях приложение будет выдавать ошибку уже при запуске. Если вы запустите на musl системе программу, скомпилированную на системе с glibc, то получите следующее:

/home/build # ./a.out
/bin/sh: ./a.out: not found
/home/build # ldd ./a.out
/lib64/ld-linux-x86-64.so.2 (0x7fa126a75000)
libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7fa126a75000)
/home/build #

Список показанных библиотек включает в себя динамический линкер с системы glibc, которого нет в musl системе. Там есть только ld-musl-x86_64.so.1 вместо ld-linux-x86-64.so.2.

Кроме того, musl не поддерживает некоторые DNS протоколы:

  • Размер пакетов UPD больше 512 байт через механизм расширения для DNS (EDNS)
  • Переключение с UDP на TC при использовании DNS

Это может привести к проблемам с разрешением DNS-запросов при использовании образов на основе Alpine. Особенно часто такие проблемы возникают в кластерах Kubernetes из-за метода разрешения имен в Kubernetes. Версии Alpine Linux 3.3 и старше (справедливости ради, и некоторые версии glibc) могут работать некорректно в кластерах K8s, но проблемы с DNS возникают и при использовании более свежих версий Alpine.

Новый Linux: улучшенный Alpine с корпоративной поддержкой

Инженеры команды Axiom JDK, вдохновленные идеалами и успехами команды Alpine, решили использовать Alpine Linux в качестве основы инновационного решения для корпоративных клиентов. Оно включает в себя новый дистрибутив Linux, сохранивший все достоинства Alpine плюс

  • Улучшенную musl и возможность использовать glibc
  • Улучшенный APK tools
  • Ускоренную загрузку системы
  • Инструменты для Java-разработки
  • Строгий график LTS-релизов и обновлений
  • Коммерческую поддержку от инженеров, разрабатывающих ОС

И это ещё не всё! Linux — это лишь один из компонентов предложения. Продукт поставляется с Axiom JDK Lite и Axiom NIK, поэтому вы получите полный стек российских технологий для разработки и деплоя облачно-нативных Java-приложений. Подпишитесь на нашу рассылку, чтобы не пропустить важные новости!

Еще по теме

Работаете с контейнерами? Узнайте, как избежать побочных эффектов контейнеризации

Только начинаете осваивать микросервисы? Ознакомьтесь с обзором микросервисной архитектуры

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

  1. Testing alternative C memory allocators in musl
  2. Rust benchmark results for musl
Author image

Олег Чирухин

Директор по коммуникациям с разработчиками (DevRel)

Команда Axiom JDK roman.karpov@axiomjdk.ru Команда Axiom JDK logo Axiom Committed to Freedom 199 Obvodnogo Kanala Emb. 190020 St. Petersburg RU +7 812-336-35-67 Команда Axiom JDK 199 Obvodnogo Kanala Emb. 190020 St. Petersburg RU +7 812-336-35-67