Обновление моей оригинальной статьи о выборе правильного образа Docker для вашего проекта.

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

Альпийский, слим, книжный червь, яблочко, стрейч, бастер, джесси, слим-букворм — что все это значит?

Это была и остается моей самой читаемой статьей. Неразбериха настоящая. Но я многому научился с тех пор, как впервые написал статью и хотел предоставить обновление.

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

Помните, что в программировании нет ничего постоянного. Вы можете попробовать разные варианты, посмотреть, что работает для вас, внести изменения и повторно развернуть. Всегда тщательно проверяйте свои изображения, прежде чем отправлять их в производственную среду.

Простые и общие теги

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

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

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

Следует помнить, что «простые» теги используются для одной платформы (Windows или Linux), а «общие теги» могут использоваться для комбинации нескольких платформ.

Как правило, выбирайте простые теги, если знаете, для какой платформы создаете сайт. Если вам действительно нужен портативный образ докера, вы можете рассмотреть общий тег. Будьте осторожны с этим и тщательно тестируйте.

Полное официальное изображение

Я буду использовать python и node в качестве примеров, потому что это мои наиболее часто используемые образы докеров, но эти правила применимы к большинству образов.

Согласно DockerHub, полное изображение без квалификационных тегов является фактическим образом, и его следует использовать, если вы не уверены и только начинаете.

Например:

  • питон: 3.11.4
  • узел: 20.3.0

Эти образы основаны на самой последней стабильной версии операционной системы Debian. Я обычно начинаю с одного из них, когда пытаюсь быстро запустить и запустить проект в среде разработки, и меня пока не беспокоит размер полученного образа или безопасность.

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

Причина в том, что он, вероятно, содержит все, что вам нужно для запуска вашего приложения или скрипта.

Но перед развертыванием в рабочей среде обязательно выберите самый маленький и наиболее безопасный образ, который вам подходит. Подробнее о передовых методах обеспечения безопасности в Docker читайте ниже.

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

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

-книжный червь/-яблочко/-стрейч/-джесси

Изображения, помеченные яблочком, книжным червем, стрейчом, бастером или джесси, являются кодовыми именами для различных выпусков Debian. На момент написания этой статьи стабильный выпуск Debian — 12, а его кодовое имя — Книжный червь. Bullseye — это Debian 11. Buster — это 10. Stretch ​​— кодовое имя для всех вариантов версии 9, а Jessie — кодовое имя для всех вариантов версии 8.

Будущие версии в разработке, но еще не стабильные, это «Forky» и «Trixy». Вы можете начать видеть эти теги в списке версий образов на DockerHub.

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

-стройный

Узкое изображение — это уменьшенная версия полного изображения. Этот образ обычно устанавливает только минимум, необходимый для запуска вашего конкретного инструмента. В случае с Python это минимальный набор пакетов для запуска Python и Node.js.

Избегая менее используемых инструментов, изображение становится меньше. Используйте это изображение, если у вас мало места и вам не нужна полная версия.

Но не забудьте тщательно протестировать при использовании этого изображения! Если вы столкнулись с необъяснимыми ошибками, попробуйте переключиться на полное изображение и посмотрите, решит ли это проблему.

Slim имеет дополнительное преимущество, поскольку является наиболее безопасным. Меньшие образы имеют меньше точек, которые могут быть атакованы, поэтому использование наименьшего изображения — лучший вариант, если вам просто нужно запустить базовый скрипт или вашему приложению не нужно много наворотов полной операционной системы.

-тонкий-книжный червь/-тонкий-яблочко

При объединении slim с определенной версией Debian вы получаете тонкую версию только с самыми важными файлами для запуска операционной системы в этой конкретной версии.

-альпийский

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

Однако некоторые команды отказываются от alpine, потому что эти образы могут вызывать проблемы совместимости, которые трудно отладить. В частности, при использовании образов Python некоторые колеса созданы для совместимости с Debian и должны быть перекомпилированы для работы с образом на основе Apline.

Основная причина использования изображения Alpine — сделать полученное изображение как можно меньше. Базовый образ будет меньше 5 МБ. Базовый образ python (добавление python к базовому образу alpine) в настоящее время составляет 78,9 МБ. Это все еще относительно мало.

Это изображение наиболее рекомендуется, если пространство является проблемой.

Недостатком является то, что он не содержит некоторых пакетов, которые могут вам понадобиться. В основном, он использует более тонкую musllib вместо glibc. Вы можете столкнуться с проблемами, если ваше приложение предъявляет особые требования к libc.

Если вы обнаружите, что в образе Alpine не хватает чего-то необходимого, вы всегда можете установить свой пакет прямо в свой Dockerfile. Это сохраняет изображение только тем, что вам нужно. Имейте в виду, что ваш Dockerfile изменится, если вы устанавливаете внешние пакеты. Основное отличие состоит в том, что для установки пакетов вы будете использовать apk вместо apt-get.

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

-windowsservercore

Я редко использую windows, я сейчас твердо в лагере Mac/Linux, но если ваше приложение работает только на Windows или Windows Server, то этот образ для вас.

В рабочей среде всегда следуйте рекомендациям по обеспечению безопасности.

Выбор правильного базового образа, когда вы будете готовы к работе, имеет решающее значение. Когда вы пройдете стадию «заставьте это работать», вам захочется убедиться, что вы «делаете это правильно». Одна вещь, имеющая огромное значение, — это безопасность.

Во-первых, убедитесь, что вы используете официальный образ из DockerHub или образ, созданный проверенным издателем. Вы можете увидеть эти значки в списке вместе с изображением на DockerHub.

Выберите минимальное базовое изображение, соответствующее вашим требованиям. Решите, какая из приведенных выше версий изображения соответствует вашим потребностям. Меньшее изображение сводит к минимуму количество уязвимостей системы безопасности, которые вы выявляете, и является более легким.

Убедитесь, что вы удалили все ненужные пакеты из вашего Dockerfile. Вы можете немного поэкспериментировать и установить кучу пакетов во время разработки и тестирования, но вернитесь назад и избавьтесь от всего, что не используется, перед развертыванием в рабочей среде.

Никогда не используйте ‹image›:latest в рабочем Dockerfile. При этом всегда будет загружаться последний образ, а зависимости вашего приложения могут быть несовместимы с будущими версиями, что может привести к его поломке в будущем.

Итак, какой из них я выбираю?

Вот несколько общих рекомендаций, которыми я пользуюсь:

  • Если мне нужно быстро что-то настроить и запустить в среде разработки, не имея ограничений по пространству и времени на возню, я начинаю с образа де-факто. Моя главная забота здесь заключается в том, чтобы в изображении было все, что мне нужно для работы «из коробки», и я могу заставить работать свою концепцию. Однако этот образ будет занимать больше всего места и будет наименее безопасным. Не используйте его в производственной среде без крайней необходимости.
  • Если место ограничено и я знаю, что мне нужны только минимальные пакеты для запуска определенного языка, такого как python, я выбираю -slim. Slim обеспечивает самый минимум, необходимый для запуска Python, и снижает уязвимости системы безопасности. Простые скрипты Python — хорошие кандидаты для тонких образов.
  • Для некоторых проектов, которые у меня есть, чтобы тщательно протестировать, и которые имеют крайние ограничения по пространству, я буду использовать образы Alpine. Но имейте в виду, что это может привести к увеличению времени сборки и скрытым ошибкам. Если у вас возникли проблемы с переносом контейнеров Docker в новые среды или что-то сломалось при добавлении новых пакетов, попробуйте другой образ.
  • Когда мне нужно установить дополнительные пакеты, предназначенные для определенной версии Debian, я использую тег "яблочко" или "книжный червь". Это гарантирует, что я получу последнюю версию Debian, но не сломаю свою сборку в будущем. Вы можете дополнительно попробовать -slim версии этих образов, чтобы уменьшить пространство.
  • Наконец, всегда прокручивайте вниз страницу DockerHub для поиска определенного образа и читайте рекомендации по выбору конкретного образа.

Сравнение размеров образа докера

Если вы хотите самостоятельно проверить образы докеров и сравнить их размеры, попробуйте это.

docker pull --quiet python:3.11.4
docker pull --quiet python:3.11.4-slim
docker pull --quiet python:3.11.4-alpine
docker pull --quiet python:3.11.4-bookworm
docker pull --quiet python:3.11.4-slim-bookworm
docker images | sort -k7 -h

Вы увидите, что существуют огромные различия между изображениями де-факто и версиями -slim и -alpine.

Заключение

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

Я надеюсь, что это помогло пролить свет на различия и помочь вам выбрать образ докера для вашего следующего проекта.

🙏 Спасибо, что дочитали до конца! Прокомментируйте ниже или напишите мне по адресу [email protected], если у вас есть какие-либо вопросы.

👉 Впервые на Medium? Стать участником всего за 1 доллар в неделю, чтобы читать любую статью!

☕ Вам нравится то, что вы читаете? Купите мне кофе, чтобы получить больше контента!

Рекомендации