Зачем использовать Alpine в качестве основы docker-образа


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

Уже давно не секрет, что Docker часто использует Alpine в качестве базового образа для официальных docker-образов. Эта тенденция началась в начале 2016 года. Сейчас почти каждый официальный docker-образ имеет тег Alpine.

Но вряд ли будет так, что вы проснетесь одним прекрасным утром и подумаете: “О! А почему бы мне не использовать другую ОС для всех своих образов”. Тем более, когда до этого по умолчанию официальным образом был Debian. И позиции его были весьма прочными.

Вы всегда можете выбрать docker-образы на основе Debian. Но лучшее ли это решение?

Почему Alpine?




Звучит, конечно, интересно. Но что это значит для тех, кто регулярно использует Docker?

Главное преимущество — сжатие размеров


Если вы используете Docker, то вы должны стремиться к этому сжатию. Благодаря этому ваш docker-образ будет меньше.
Apline 3.6 весит всего 3,98 мб.

Вот сравнение с другими дистрибутивами:


Получается, что Alpine в 25 раз меньше Debian’а.

Всего с Docker Hub были сделаны уже миллионы пулов. Немного покопавшись с его публичным API, можно увидеть, что у Debian 45 275 515 пулов, в то время как у Alpine -целых 397 152 768 (по состоянию на 10.10.2017).

Уменьшение образа на 100 мб может иметь большое значение.


В реально используемых веб-приложениях, в которых установлено множество пакетов, можно заметить 2-3 — кратное уменьшение конечного образа с Alpine. Экономия этих 100 мб останется всегда, вне зависимости от того, что встроено в ваш образ.

Сравним размер некоторых образов на основе Alpine и разных версиях Debian:
  • Redis на основе alpine весит 27,5 мб, а на jessie — 107 мб
  • Python на основе alpine- 89 мб, а на основе jessie — 690 мб
  • Golang на основе alpine — 270 мб, а на основе stretch- 733 мб




Конечно, если вы захотите использовать образ в реальном приложении, вам надо будет установить несколько зависимостей, поставить необходимые библиотеки и т.д через dockerfile. Все это приведет к “утяжелению” dockerfile’а. Но даже если сравнивать конечный dockerfile на основе debian и alpine, то последний будет легче.

Образ на Alpine следует использовать, когда конечный образ должен быть как можно меньше. Чтобы образы на основе Alpine были меньше, туда не включены такие инструменты, как git или bash. Если вы используете Alpine в качестве основы образа, то для установки необходимых вам пакетов их нужно добавить в dockerfile.

Alpine быстрый


Уменьшение размеров не единственное преимущество использования маленьких docker-образов.

Изначально цель была, чтобы система запускалась из RAM. То есть, это “одноразовая” система, которая переустанавливается после каждого перезапуска. И это отлично вписывается в концепцию контейнеров.

Да, такими дистрибутивами, как Debian или Ubuntu пользовать легче, но они слишком большие и медленные по сравнению с Alpine. apt-get update тратит столько же времени на обновление списка актуальных пакетов, сколько Alpine тратит на установку или обновление всей системы. В Alpine используется свой менеджер пакетов apt-tools (ничего общего с форматом .apk в Android). Apk расшифровывается как “alpine package keeper”. Поскольку Alpine должен быть очень легкой системой, то нужен очень быстрый менеджер пакетов. В одном интервью один из разработчиков Alpine говорил: “Мы рассматривали pacman от arch linux, также deb, ipkg, .rpm и другие. Но приняли решение использовать свой менеджер пакетов, руководствуясь требованием “run-from-ram”.

Alpine безопасный


Еще одно преимущество того, что образ не занимает много пространства, заключается в том, что не так много целей для атаки.
Когда в системе мало пакетов и библиотек, шанс того, что что-то пойдет не так заметно снижается.

Для обеспечения безопасности системы разработчики делают упор не на фикс багов, которые привели к уязвимости, а делают все, чтобы эти баги не появились. В ядре системы минимально компонентов. В Alpine не устанавливается ничего, чем пользователи никогда не будут пользоваться. Например, BashShell. Вместо него используется по умолчанию используется BusyBox Bash. Кроме того, Alpine предоставляет блоки, из которых пользователь сам собирает то, что ему надо. Во многих дистрибутивах дела обстоят иначе: многие компоненты включены по умолчанию, и пользователям приходится самостоятельно отключать некоторые компоненты, чтобы обеспечить безопасность системы. И если находится библиотека, которая по мнению разработчиков более безопасна, то они ее меняют. Так они заменили OpenSSL на LibreSSL, т.к. по мнению разработчиков Alpine, эта библиотека является более безопасной.

Несколько лет назад существовал bash-эксплойт, который позволял получить контроль над машиной, если она поражена так называемым “Shellshock”. Alpine таким атакам не был подвержен, так как по умолчанию bash там не установлен.

Установка пакетов на Alpine


Как я уже писал, для управления пакетами в Alpine используется apk. И некоторых пакетов, которые вам будут нужны, по умолчанию не будет в Alpine. Придется ставить их самостоятельно. Названия пакетов для Debian и Alpine будут отличаться. Например, чтобы установить пакет, который в Debian называется libpq-dev, в Alpine надо прописать apk add postgresql-dev.

Используйте лучший инструмент для работы


Alpine он делает все, чтобы быть легким и безопасным дистрибутивом. Поэтому использование Alpine в качестве основы для Docker-образа является оптимальным решением.

P.s. Спасибо моим коллегам из Containerum за помощь в написании этой статьи.




К сожалению, не доступен сервер mySQL