Docker — это инструмент, который мы используем каждый день в нашем развитии, но сколько времени вы тратите впустую докеренные сборки? И как вы справляетесь с гигантским размером образа?
Что если я скажу вам, что есть лучший способ построить ваши контейнеры?
Ваш любимый следующий инструмент называется Buildkit!
В этом руководстве мы погрузимся в расширенное использование Docker, чтобы оптимизировать процесс разработки либо в строю времени, так и в размере самого изображения. Мы сделаем это, используя Buildkit Параллельные многоступенчатые сборки Отказ
Buildkit.
Buildkit Это инструментарий, разработанный Moby Project Чтобы улучшить сборку и упаковку программного обеспечения с использованием контейнеров.
Основные характеристики
Среди различных функций Buythkit предлагает автоматическое сборку мусора для очистки ненужных ресурсов, одновременных разрешений зависимостей и эффективной кэширования инструкции. Buildkit является частью Docker Build
Так как Докер 18.06.
Как включить BuildKit
Если вы хотите использовать двигатель сборки Buildkit Poweredkit, вы можете сделать это, используя переменную среды Docker_buildkit = 1 docker build
Отказ
Также возможно включить PublyKit по умолчанию:
- Отредактируйте конфигурацию демона в
/etc/docker/daemon.json
и добавить
{ "features": { "buildkit": true } }
- Перезапустите демон с
sudo systemctl daemon-reload sudo systemctl restart docker
Пример кода
Для этого учебника мы собираемся подготовить изображение для развертывания экземпляра Prometheus в производстве. Мы начнем со стандартной докерафила, и мы позаботимся к улучшению выступлений.
Legacy Dockerfile
Мы собираемся построить PROMETHEUS из исходного кода, чтобы сделать то, что нам нужно изображение докера со всеми его зависимостями сборки: Голанг
С Nodejs
С пряжа
и сделать
Отказ
FROM ubuntu:bionic ENV GOPATH=$HOME/go ENV PATH=$PATH:/usr/local/go/bin:$GOPATH/bin RUN apt-get update \ && apt-get install -y curl git build-essential \ && curl -sL https://deb.nodesource.com/setup_14.x | bash - \ && apt-get install -y nodejs \ && npm install -g yarn \ && curl -O https://storage.googleapis.com/golang/go1.15.2.linux-amd64.tar.gz \ && tar -xvf go1.15.2.linux-amd64.tar.gz \ && mv go /usr/local \ && git clone https://github.com/prometheus/prometheus.git prometheus/ \ && cd prometheus/ \ && make build # RUN ./prometheus --config.file=your_config.yml
И давайте построим это с:
$ time docker build --no-cache -t prometheus . -f Dockerfile.prometheus ... Successfully built 54b5d99ef76a Successfully tagged prometheus:latest real 19m56,395s user 0m0,506s sys 0m0,334s
Размер изображения:
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE prometheus latest 54b5d99ef76a 25 minutes ago 2.38GB
Наследие Строительная производительность
Глядя на результаты, которые нам нужно почти 20 минут создать экземпляр PROMETHEUS, который имеет размер 2.38 ГБ Отказ Это будет нашей отправной точкой.
Многоступенчатая сборка
Теперь у нас есть изображение, готовое к производству, Итак, мы счастливы, верно?
Нет, мы определенно не
Как вы, возможно, заметили, изображение, которое мы только что создали, — это Huuuge, мы можем определенно сделать лучше, используя функцию Advanced Docker под названием многоступенчатая сборка Отказ Многоступенчатая сборка доступна в Docker с версии 17.05, и именно для оптимизации размера изображения. Вы можете использовать От ... как ...
Инструкция по определению стадии сборки и Скопировать - от
Инструкция по делу артефактов между этапами.
Refactor Legacy DockerFile для использования многоступенчатой сборки
Давайте применяем эти концепции до старых докерфила.
FROM ubuntu:bionic as base-builder ENV GOPATH=$HOME/go ENV PATH=$PATH:/usr/local/go/bin:$GOPATH/bin RUN apt-get update \ && apt-get install -y curl git build-essential \ && curl -sL https://deb.nodesource.com/setup_14.x | bash - \ && apt-get install -y nodejs \ && npm install -g yarn \ && curl -O https://storage.googleapis.com/golang/go1.15.2.linux-amd64.tar.gz \ && tar -xvf go1.15.2.linux-amd64.tar.gz \ && mv go /usr/local \ && git clone https://github.com/prometheus/prometheus.git prometheus/ \ && cd prometheus/ \ && make build FROM ubuntu:bionic as final COPY --from=base-builder prometheus/prometheus prometheus # RUN ./prometheus --config.file=your_config.yml
Что нам нужно сделать, это создать крошечный Финал
Этап, которая содержит только исполняемый прометею. Мы можем сделать это с Скопировать - от
предыдущий этап.
Пришло время построить изображение докера.
$ time docker build --no-cache -t prometheus-multistage . -f Dockerfile.prometheus-multistage ... Successfully built ab2217626102 Successfully tagged prometheus-multistage:latest real 19m19,570s user 0m0,418s sys 0m0,459s
Размер изображения есть.
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE prometheus-multistage latest ab2217626102 31 seconds ago 151MB
Многоступенчатая сборка производительности
Глядя на новые результаты, мы потратили 19 минут, чтобы построить изображение, но улучшение по размеру является значительным Уменьшение 99,9%!
Параллельная многоступенчатая сборка
Таким образом, мы смогли уменьшить размер изображения, но время сборки все еще слишком много. Мы все еще можем оптимизировать, что, используя Buildkit Build Engine Отказ Наследие Docker Build Engine выполняет сборку этапов последовательно, с другой стороны, Buildkit вычисляет График зависимости этапов и распараллелизуют сборки. Имея это в виду, мы можем ревертировать DockerFile, чтобы ускорить время сборки.
Refactor DockerFile для использования параллельной многоступенчатой сборки
Давайте посмотрим, как это можно сделать.
FROM ubuntu:bionic as base-builder ENV GOPATH=$HOME/go ENV PATH=$PATH:/usr/local/go/bin:$GOPATH/bin RUN apt-get update \ && apt-get install -y curl git build-essential FROM base-builder as base-builder-extended RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - \ && apt-get install -y nodejs \ && npm install -g yarn FROM base-builder as golang RUN curl -O https://storage.googleapis.com/golang/go1.15.2.linux-amd64.tar.gz \ && tar -xvf go1.15.2.linux-amd64.tar.gz FROM base-builder as source-code RUN git clone https://github.com/prometheus/prometheus.git prometheus/ FROM base-builder-extended as builder COPY --from=golang go /usr/local COPY --from=source-code prometheus/ prometheus/ RUN cd prometheus/ && make build FROM ubuntu:bionic as final COPY --from=builder prometheus/prometheus prometheus # RUN ./prometheus --config.file=your_config.yml
Мы создаем первый этап под названием Base-Builder
который содержит основные инструменты и будет действовать в качестве основы для следующих слоев. Наследование от Base-Builder
Определим:
Голанг
, что содержитидти
;Исходный код
, что мы используем для получения исходного кода PROMETHEUS;Базовый строитель - расширенный
Это улучшениеBase-Builder
который содержитNodejs
ипряжа
;
3 этапа не зависят друг от друга, поэтому сборка будет параллелизована.
На данный момент мы готовы построить код, мы используем строитель
для этого. На этом этапе мы Скопировать --от
Предыдущие этапы артефакты, которые нам нужно запустить сборку. Опять же мы создаем крошечный Финал
Этап, которая содержит только исполняемый прометею.
Мы можем запустить сборку сейчас.
$ DOCKER_BUILDKIT=1 docker build --no-cache -t prometheus-parallel-multistage . -f Dockerfile.prometheus-parallel-multistage [+] Building 734.4s (13/13) FINISHED => [internal] load build definition from Dockerfile.prometheus-parallel-multistage 1.1s => => transferring dockerfile: 963B 0.1s => [internal] load .dockerignore 0.8s => => transferring context: 2B 0.1s => [internal] load metadata for docker.io/library/ubuntu:bionic 0.0s => CACHED [final 1/2] FROM docker.io/library/ubuntu:bionic 0.0s => [base-builder 2/2] RUN apt-get update && apt-get install -y curl git build-essential 195.6s => [source-code 1/1] RUN git clone https://github.com/prometheus/prometheus.git prometheus/ 77.6s => [base-builder-extended 1/1] RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - && apt-get install -y nodejs 102.1s => [golang 1/1] RUN curl -O https://storage.googleapis.com/golang/go1.15.2.linux-amd64.tar.gz && tar -xvf go1.15.2.linux 149.8s => [builder 1/3] COPY --from=golang go /usr/local 13.6s => [builder 2/3] COPY --from=source-code prometheus/ prometheus/ 9.5s => [builder 3/3] RUN cd prometheus/ && make build 338.6s => [final 2/2] COPY --from=builder prometheus/prometheus prometheus 2.6s => exporting to image 1.9s => => exporting layers 1.6s => => writing image sha256:c0e59c47a790cb2a6b1229a5fec0014aa2b4540fc79c51531185c9466c9d5584 0.1s => => naming to docker.io/library/prometheus-parallel-multistage 0.1s
И проверьте размер изображения.
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE prometheus-parallel-multistage latest c0e59c47a790 About a minute ago 151MB prometheus-multistage latest ab2217626102 9 minutes ago 151MB prometheus latest 54b5d99ef76a 39 minutes ago 2.38GB
Параллельная многоступенчатая производительность
Глядя на новые результаты, мы потратили почти 12,5 минут, чтобы построить изображение, снижение 30% , сохраняя тот же размер изображения.
Результаты Recap
В таблице ниже приведены время сборки и размер изображения в трех разных примерах.
12,5 М. | PROMETHEUS-PARALLEL-MULISTAGE | 151 МБ |
19 М. | PROMETHEUS-MULISTAGE | 151 МБ |
20 М. | Прометей | 2.38 ГБ |
Как вы можете увидеть улучшение, как в строке времени, так и в размере изображения, действительно огромно. Использование многоступенчатой параллельной сборки подхода может быть полезным в продукции, где меньшее изображение докера может иметь значение. Все, что вам нужно сделать, это иметь в виду, как работает BuaderKit, подумайте о том, что можно распараллегировать в вашем DockerFile и развивать его соответственно. Вы можете легко интегрировать buildkit в вашем докере Build/Test/Tag/Push-трубопровод ).
Это оно!
Я надеюсь, что это было полезно для вас, теперь иди и рекакторуйте свой старый докер!
Добраться до меня в Twitter @Gasparevitta и Дайте мне знать свои улучшения производительности Отказ
Вы можете найти фрагменты кода на Github Отказ
Эта статья была первоначально опубликована на моем блог . Голова там, если вам нравится этот пост и хочу прочитать других, как это!
Оригинал: «https://dev.to/gasparev/3-steps-to-drastically-improve-your-docker-build-performances-17jg»