в docker, tips

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


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

Почему Alpine, а не Debian, который был базовым образом до этого? Давайте разберемся!

Alpine позиционирует себя как:

Small. Simple. Secure. Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox

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

Во-первых, размер.
Размер имеет значение. В определенных контекстах «маленький размер» скорее огорчит, чем обрадует, но в мире Docker все наоборот — чем меньше размер образа, тем лучше. Docker-образ Alpine 3.6 занимает всего 3.98MB. В сравнении с остальными версиями популярных дистрибутивов, это выглядит так:

+----------------+---------+--------+
| DISTRIBUTION   | VERSION | SIZE   |
+----------------+---------+--------+
| Debian         | Jessie  | 123MB  |
| CentOS         | 7       | 193MB  |
| Fedora         | 25      | 231MB  |
| Ubuntu         | 16.04   | 118MB  |
| Alpine         | 3.6     | 3.98MB |
+----------------+---------+--------+

Alpine примерно в 30 раз меньше Debian — теперь понятно, почему команда Docker изменила свой выбор базового обораза.

Можно посмотреть сколько раз с Docker Hub были скачаны образы Debian и Alpine (на момент написания статьи 39277937 и 219376002 раз соответственно). Конечно, если мы помним про использование слоев в docker-образах, то мы не будем утверждать, что каждый раз при скачивании из реджистри «вытягивается» полный размер образа до последнего байта, но давайте на минутку представим, что это именно так и наши образы хранятся на Amazon S3.

Скачивание 39277937 раз базового образа с Amazon S3 нам обойдется:

+----------------+------------------+----------------------+
| DISTRIBUTION   | GIGS TRANSFERRED | S3 TRANSFER OUT COST |
+----------------+------------------+----------------------+
| Debian         | 4717955          | $ 253676.98          |
| Alpine         | 152662           | $ 12609.49           |
+----------------+------------------+----------------------+

Примечание. Для расчета использовался этот калькулятор стоимости, считал Data Transfer Out за месяц. Буду рад, если укажете на неточность в расчетах или предложите более оптимальный вариант.

В долларовом эквиваленте использование маленьких docker-образов могло бы сэкономить бизнесу ~$240 000 — и я не затрагиваю здесь вопросы использования дискового пространства и утилизации сети передачи данных (о них — второй аргумент). Серьезно, уменьшение размера docker-образа на 100MB — это настоящее достижение (вне зависимости, что в нем установлено) и превосходная экономия.

Во-вторых, скорость.
Alpine быстрый, и чтобы убедиться в этом рассмотрим конкретный пример — установку утилиты curl в docker-образ. В первом случае будем выполнять команду на хосте, где нет базовых docker-образов (они будут скачаны).
Debian:

time docker run --rm debian:jessie sh -c "apt-get update && apt-get install curl -y --no-install-recommends"
Unable to find image 'debian:jessie' locally
jessie: Pulling from library/debian

...

real    1m6,773s
user    0m0,040s
sys 0m0,040s

Alpine:

time docker run --rm alpine:3.6 sh -c "apk update && apk add curl"
Unable to find image 'alpine:3.6' locally
3.6: Pulling from library/alpine
88286f41530e: Pull complete 

...

real    0m7,981s
user    0m0,036s
sys 0m0,004s

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

time docker run --rm debian:jessie sh -c "apt-get update && apt-get install curl -y --no-install-recommends"

...

real    0m40,108s
user    0m0,020s
sys 0m0,020s

Alpine:

time docker run --rm alpine:3.6 sh -c "apk update && apk add curl"

...

real    0m3,886s
user    0m0,024s
sys 0m0,004s

Думаю здесь комментарии излишни.

В третьих, безопасность.
Еще одним преимуществом маленького размера docker-образа является тот факт, что намного меньше «площадь поверхности для атаки». Поясню: если в вашей системе всего пару пакетов и библиотек, то слишком мало пространства для внедрения вредоносного кода. Помните ShellShock? Так вот, Alpin’у он не страшен, ведь там нет интерпретатора Bash!

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

Еще один довод в пользу того, что Alpine беспокоится о безопасности — разработчики не стесняются менять некоторые пакеты, например, OpenSSL на LibreSSL. Вот как они объяснили свой поступок:

While OpenSSL is trying to fix the broken code, libressl has simply removed it

На мой взгляд, выбор базового образа для docker-контейнеров очевиден — только Alpine.

Добавить комментарий