Рубрики
Uncategorized

Краткий курс по оптимизации изображений Docker для производства

Отказ от ответственности: Zeet спонсирует этот пост в блоге на следующий месяц. Я попробовал это на днях. Это … с меткой Docker, DevOps, Node, ShowDev.

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

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

TL; DR

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

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

  • Почему node.js?
  • Использование изображения node.js default.js
  • Использование альпийского изображения Node.js
  • За исключением зависимостей развития
  • Использование базового альпийского изображения
  • Используя многоэтажные сборки

Давайте прыгнем.

Почему node.js?

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

Как интерпретированный язык, у JavaScript нет составной цели, например, например. Вы мало что можете сделать, чтобы лишить размер ваших изображений node.js. Или есть?

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

В примерах ниже я использовал простой Node.js api Я написал некоторое время назад.

Использование изображения node.js default.js

Начиная, конечно, я использовал изображение node.js по умолчанию. Docker Hub . О, как я был невежественен.

FROM node
WORKDIR /usr/src/app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]

Хотите угадать размер? Моя челюсть упала. 727 МБ Для простого API!?

Не делай этого, пожалуйста. Вам не нужно делать это, честно говоря, просто не делайте.

Использование альпийского изображения Node.js

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

FROM node:alpine # adding the alpine tag
WORKDIR /usr/src/app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]

В целом шесть раз меньше! До 123,1 МБ . Это больше походит на это.

За исключением зависимостей развития

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

FROM node:alpine
WORKDIR /usr/src/app
COPY package.json package-lock.json ./
RUN npm install --production # Only install prod deps
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]

Там мы пойдем. Мы побрили еще 30 МБ! До 91,6 МБ Теперь. Мы где -то получаем.

Это заставило меня очень гордиться собой, и я был готов назвать это днем. Но тогда это ударило меня. Что если я начну с необработанного альпийского изображения? Может быть, было бы меньше, если бы я сам взял базовое альпийское изображение и установите node.js. Я был прав!

Использование базового альпийского изображения

Вы могли бы подумать, что подобный шаг не имеет ничего общего, но он побрил еще 20 МБ от предыдущей версии.

FROM alpine # base alpine
WORKDIR /usr/src/app
RUN apk add --no-cache --update nodejs nodejs-npm # install Node.js and npm
COPY package.json package-lock.json ./
RUN npm install --production
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]

До 70.4MB Теперь. Это колоссально в 10 раз меньше, чем где мы начали!

Не намного больше, что мы можем сделать сейчас, верно? Верно…?

Используя многоэтажные сборки

Ну, на самом деле, есть. Давайте немного поговорим о слоях.

Каждое изображение Docker построено из слоев. Каждый слой является командой в DockerFile. Вот файл из выше:

FROM alpine # base alpine
WORKDIR /usr/src/app
RUN apk add --no-cache --update nodejs nodejs-npm # install Node.js and npm
COPY package.json package-lock.json ./
RUN npm install --production
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]

Инструкция создает слой, так же как и Workdir, а также бег и т. Д. Все слои только для чтения, за исключением последнего, CMD, который является написанным слоем. Слои только для чтения могут быть переданы между контейнерами, что означает, что между контейнерами можно разделить одно изображение.

Здесь происходит то, что Docker использует драйверы для хранения для управления слоями только для чтения и слоя для записи. Это эфемерный слой, который удаляется после удаления контейнера. Действительно крутые вещи. Но почему это важно?

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

FROM alpine AS multistage
WORKDIR /usr/src/app
RUN apk add --no-cache --update nodejs nodejs-npm
COPY package.json package-lock.json ./
RUN npm install --production
​
#
​
FROM alpine
WORKDIR /usr/src/app
RUN apk add --no-cache --update nodejs
COPY --from=multistage /usr/src/app/node\_modules ./node\_modules
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]

Мы используем первое изображение только для установки зависимостей, затем на нашем окончательном изображении мы копируем все Node_Modules, не создавая и не устанавливая что -либо. Мы можем даже пропустить установку npm На последнем изображении тоже!

Хотите угадать окончательный размер? Вперед, продолжать!

Я бы сказал, что мы сделали это хорошо, доставив это до 48,6 МБ , который является 15x Улучшение — это то, чем можно гордиться.

Вердикт

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

Выбор оптимизированных базовых изображений даст вам долгий путь. Если вам действительно нужен увеличение скорости развертывания и страдает от медленных трубопроводов CI/CD, ознакомьтесь с Многоступенчатые сборки . Вы не захотите сделать это другим способом в будущем.

Примечание : Я пропустил выборку, в которой зависимости развития включены для проведения испытаний перед тем, как развернуть до производства, так как это не имело отношения к окончательному снижению размера для работы в производстве. Конечно, это действительный вариант использования! Не стесняйтесь добавлять свои идеи в комментарии ниже. Я хотел бы услышать, что вы думаете!

Если вы хотите проверить какие -либо из моих предыдущих статей, связанных с DevOps о Docker и Kubernetes, не стесняйтесь перейти к моему профилю.

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

Оригинал: «https://dev.to/adnanrahic/a-crash-course-on-optimizing-your-docker-images-for-production-2f9l»