Рубрики
Uncategorized

3 шага, чтобы значительно улучшить ваши спектакли по сборке Docker

Docker — это инструмент, который мы используем каждый день в нашем развитии, но сколько времени вы тратите вхождение в ожидание … Tagged с Docker, DevOps, Tutorial.

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»