В этом посте мы увидим пример сборки docker приложения API node js, начиная с медленного и заканчивая сборкой ~в 10 раз быстрее. Я уже говорил о причинах использования docker для среды разработки. Я также упоминал, как docker изменил то, как мы, инженеры-программисты, работаем, и многоступенчатую сборку docker в прошлых постах. Для этого давайте сосредоточимся на примере сборки docker с учетом более быстрой сборки.
Информация, прежде чем прыгать в
- Требуется знакомство с докером и процессом сборки докера
- Все примеры основаны
Docker version 19.03.13, build 4484c46d9d
на компьютере Mac - Приложение Currency API используется для этого примера сборки docker
Почему быстрее строится докер
Есть много причин, по которым вы хотели бы, чтобы ваши контейнеры Docker создавались быстрее, вот некоторые из них:
- Это сэкономит время инженера-программиста в ожидании создания изображений контейнеров в конвейере CI/CD. Представьте себе это, если бы вся ваша сборка docker заняла половину времени, это привело бы к гораздо меньшему ожиданию.
- Это также сэкономит инженерам время на локальную сборку и запуск программного обеспечения. В нашу эпоху микросервисов, если бы эти изображения создавались быстрее, это очень помогло бы.
- Более быстрая сборка также обеспечивает более быстрое развертывание и выпуски. Если вы хотели откатить развертывание с ошибками, если сборка заняла 10 минут, этот код с ошибками остается в prod по крайней мере в течение этих 10 минут, пока выполняется отмененное изменение.
Пример сборки Docker: медленная сборка
Давайте посмотрим на докер ниже, этот невинно выглядящий файл докера взят из API Node Js. У этого есть одна важная проблема, которую мы раскроем по мере продолжения.
FROM node:14-alpine
WORKDIR /src
COPY . /src
ENV NODE_ENV=production
RUN npm install --production
EXPOSE 8080
CMD ["node", "index.js"]
RUN npm ci
есть ли другой лучший вариант вместо RUN npm install --production
Давайте использовать обычную сборку docker
Когда мы пытаемся создать приведенный выше файл docker с помощью сборки docker, используя следующую командуКопировать
time docker build -t node-14-first-bad-cache-no-buildkit
time
Команда имеет префикс перед docker build
командой, чтобы мы знали время, необходимое для завершения команды сборки docker. Ниже показано, сколько времени это заняло:
Как видно выше, это заняло 57,17 секунды.
Простое ускорение, используйте BUILDKIT
Docker build недавно добавил BUILDKIT версии 18.09. Докер в основном говорит, что это капитальный ремонт процесса сборки. Как уже упоминалось в этом посте, это быстрее, эффективнее и одновременно. Вы можете прочитать больше о его достоинствах в этой статье о docker.com. А пока давайте посмотрим на это в действии.
time DOCKER_BUILDKIT=1 docker build -t node-14-second-bad-cache-with-buildkit
Как вы можете видеть, время сборки составляет менее половины предыдущей сборки без набора сборки.
Эта сборка заняла всего 27,32 секунды по сравнению с предыдущей сборкой, которая заняла 57,14 секунды.
Пример сборки Docker: быстрая сборка
Хорошо, в нашем предыдущем файле docker есть серьезная проблема. Кэш docker разрывается при каждом изменении, будь то наш пользовательский код или любые другие добавляемые модули npm. Подробнее о кэше сборки docker читайте также в этом посте.
Более быстрая сборка докера при правильном кэшировании
Наш код меняется почти каждый раз, но модули npm, которые мы подключаем, меняются нечасто. Таким образом, мы можем безопасно кэшировать модули npm, как показано ниже.
FROM node:14-alpine
WORKDIR /src
COPY package.json package-lock.json /src/
ENV NODE_ENV=production
RUN npm install --production
COPY . /src
EXPOSE 8080
CMD ["node", "index.js"]
Вы можете взглянуть на разницу между этими двумя файлами docker здесь. Основное изменение заключается в том, что мы сначала копируем файл package.json и package-lock.json, а затем запускаем установку npm. Только после этого пользовательский код копируется в /src
. Поэтому, если вы не добавите новую библиотеку npm, кэш будет сохранен.
Для создания в первый раз потребовалось 34 секунды, как показано ниже, с помощью следующей команды:
time DOCKER_BUILDKIT=1 docker build -t node-14-third-good-cache-with-buildkit
Быстро ли выполняется сборка docker после изменения кода?
Для этого примера сборки докера я добавил строку комментария в index.js файл приложения API узла JS. Теперь давайте посмотрим, сколько времени это займет и кэширует ли он node_modules, используемые в npm install
команде.Копировать
time DOCKER_BUILDKIT=1 docker build -t node-14-fourth-good-cache-file-change-with-buildkit
Сборка заняла всего 6,01 секунды, благодаря большому использованию кэша докером и использованию buildkit.
Несмотря на то, что код изменился, но модули NPM были кэшированы, что позволило завершить сборку всего за 6 секунд. Те же принципы применимы и для использования кэша сборки docker. Он может быть применен к PHP с помощью composer.json и composer.блокировка файла или любого другого языка. Всегда думайте о предыдущем выполнении команды и о том, как ее лучше кэшировать.
Все четыре изображения были размером около 233 МБ, одно заняло ~60 секунд, а последнее-6 секунд. Это примерно в 10 раз быстрее.
Вывод
Если вы создаете образы докеров, не забудьте использовать BUILDKIT, он очень эффективен. В дополнение к BUILDKIT всегда анализируйте, как использовать кэш сборки docker в своих интересах для более быстрых сборок docker.
Я надеюсь, что этот небольшой пример сборки докера помог вам. Такие вещи, как наличие небольших изображений docker, таких как использование базового изображения alpine, также могут немного помочь в ускорении сборки docker.