Рубрики
Uncategorized

Ускорение ваших изображений докера с многоступенчатой сборкой

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

В этом посте вы обнаружите, как создавать небольшие и безопасные изображения контейнера, используя Multi-Stopent Docker Build особенность только с одним докерфилом.3

Благодаря Docker, создание изображений никогда не было проще, вам просто нужно поставить стандартную DockerFile в свою исходную папку, укажите базовое изображение, добавьте свой код и создайте свое изображение, запустив команду Docker «Build», а Shazam 🏄! Ваш контейнер изображения построен!. Это потрясающе, мы можем даже упростить закрепление устаревшего приложения без повторного архитектуры.

Недостатком этой простоты состоит в том, что легко строить огромные контейнеры, полные вещей, которые вам действительно не нужно. Большинство Docker Image использует Debian или Ubuntu в качестве базового изображения. Хотя это отлично подходит для совместимости и простого борта, эти базовые изображения могут добавлять накладные расходы на ваш контейнер. Например, простое приложение Hello World в Node.js — почти 700 МБ, и, как вы, вероятно, уже знаете, это пример — это только несколько МБ по размеру. Таким образом, дополнительный накладной расход впустую пространство и отличное место для уязвимостей безопасности и ошибок.

Процесс создания изображений отличается в зависимости от того, используете ли вы интерпретируемый язык или скомпилированный язык. Итак, давайте погрузимся в него!

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

Давайте возьмем это Node.js Приложение в качестве примера и вместо здания с использованием «Узел: onbuild» Backer Base Image Используйте «Узел: альпийский» Версия, которая меньше. Эта версия удаляет много файлов и программ, оставляя только то, что вам нужно для запуска вашего приложения. Alpine Linux Это небольшое и легкое распределение Linux, которое очень популярно с пользователей Docker, потому что оно совместимо с множеством приложений, в то время как все еще сохраняя контейнеры. Почему альпийские изображения такие маленькие, и их другие преимущества объясняются подробно здесь Отказ

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

Теперь подумайте о Статически составленные языки исходный код переходит в скомпилированный код заранее. Таким образом, шаги компиляции часто требуют инструментов, которые на самом деле не требуются для запуска кода. А затем размер полученного изображения составляет 4-10x больше, чем размер, необходимый для запуска нашего приложения, не упомянув давно, что здание будет принимать.

Общий обходной путь состоит в том, чтобы использовать узор строителя. Это включает в себя использование двух или более изображений докера. Код встроен в первом контейнере (разработка, инструменты для сборки), а затем скомпилированный код упакован в окончательный контейнер (производство, время выполнения) без всех компиляров и инструментов, необходимых для компиляции кода. В качестве недостатка вы должны поддерживать 2+ докерафайлов, даже если это не идеально, и вам понадобится оркестровка его, используя дополнительные инструменты, такие как скрипты Bash или файлы YAML.

На Dockercon 2017. На Docker представлена новая функция под названием Multi-Stopiant Builds Builds (версия 17.05 или выше), которая помогает создать несколько промежуточных изображений из того же DockerFile. Эта концепция дает нам преимущества узора построителя без хлопота поддержания отдельных файлов.

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

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

  • Один докерф
  • Один синтаксис для изучения
  • Та же сборка (разработка и производство)
  • Работает на локальной машине и CI Server
  • Может создать несколько стадийных трубопроводов

Итак, давайте решаем Go DockerFile в качестве примера:

Как видите, можно назвать этапы здания, а затем ссылаться на них. По умолчанию этапы не названы, и вы должны использовать номера, начиная с 0 для первого из инструкции. Вы не ограничиваетесь копией с этапов, которые вы создали ранее в вашем DockerFile. Вы можете использовать копию — от инструкции для копирования с отдельного изображения, либо используя локальное имя изображения, тег, доступную локально или в реестре Docker, или тег ID.

$ COPY — from=sampleapp:latest …/config.json app/config.json

Наличие одной бинарной на производственном изображении отлично, но как насчет развития? Вам, вероятно, понадобится присутствующие зависимости в построении, и рекомендуется иметь одинаковый докер для производства, так и для разработки. Хитрость состоит в том, чтобы использовать целевой флаг команды сборки, которая позволяет указывать на какой этап вы хотите остановить вашу сборку. Например, следующая команда предполагает, что вы используете предыдущий DockerFile, но останавливаются на этапе с именем Build-env:

$ docker build — target build-env -t  .

Это может быть очень полезно для отладки определенного этапа сборки, и мы можем даже создавать такие трубопроводы, как это:

Теперь небольшие контейнеры на самом деле имеют измеримое преимущество? Ответ да. Чтобы выяснить это, вы можете взглянуть на две области, где сияет небольшие контейнеры: производительность и безопасность. Говоря о производительности, вы можете рассмотреть время построить, толкать его в реестр, а затем вытащить его из реестра. Чтобы реализовать об улучшениях безопасности, вы можете проверить ваши контейнеры с использованием сканирования уязвимости Google.

Упаковка

До докера 17.05 шаблон строителя был эффективен в качестве обходного пути, но поскольку этот докер версия, многоступенчатая сборка — отличный способ создания небольших изображений. Использование Docker Multi-Stopid Build Мы также можем создавать передовые трубопроводы. Основная информация была получена из здесь Отказ Если вы также хотите играть в Интернете с многоступенчатой функцией, которую вы можете использовать Это Отказ

Если у вас есть какие-либо вопросы, проблемы или если вы просто хотите добавить свои мысли, вы любежем приветствуете это в поле «Комментарии» ниже. Вы также можете связаться со мной на LinkedIn 😊.

Оригинал: «https://dev.to/fgriberi/speedup-your-docker-images-with-multi-stage-builds-1ipd»