0Pricing
DevOps Bootcamp · Урок

Многоэтапные сборки для повышения эффективности

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

«Многоэтапные сборки для повышения эффективности» — бесплатный урок DevOps Bootcamp на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения DevOps Bootcamp, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс DevOps Bootcamp содержит 4 уроков всего.

Введение в многоэтапные сборки

Добро пожаловать в раздел по расширенной оптимизации Dockerfile! Сегодня мы рассмотрим многоэтапные сборки — мощный приём для создания меньших и более эффективных образов Docker.

Меньшие образы быстрее загружаются, повышают безопасность и эффективнее используют ресурсы.

Многоэтапные сборки для повышения эффективности — иллюстрация 1

Почему размер образов имеет значение

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

  • Более быстрая загрузка: меньшие образы загружаются быстрее.
  • Меньше места на диске: экономится место в реестрах и на хостах.
  • Меньшая поверхность атаки: меньше компонентов означает меньше потенциальных уязвимостей.
  • Повышенная безопасность: рабочий образ содержит только необходимое.

Проблема одноэтапной сборки

Рассмотрим скомпилированное приложение, например написанное на Go. Традиционный одноэтапный Dockerfile включал бы полный компилятор Go и зависимости для разработки в итоговый образ.

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

Пример одноэтапной сборки (Go)

Вот простое приложение на Go и Dockerfile, который собирает его на одном этапе. Обратите внимание: среда сборки включается в итоговый образ.

main.go:

package main

import "fmt"

func main() {
    fmt.Println("Hello from Single-Stage Docker!")
}

Одноэтапный Dockerfile

В этом Dockerfile в качестве основы используется `golang:1.21-alpine`. После сборки приложения этот большой базовый образ вместе со всеми инструментами сборки остаётся в итоговом образе.

FROM golang:1.21-alpine
WORKDIR /app
COPY main.go .
RUN go build -o myapp main.go
EXPOSE 8080
CMD ["./myapp"]

Устройство многоэтапных сборок

Многоэтапные сборки решают эту проблему, позволяя определить несколько инструкций `FROM` в одном Dockerfile. Каждая инструкция `FROM` начинает новый этап сборки.

  • Используйте ключевое слово AS, чтобы дать этапу имя (например, FROM golang:1.21-alpine AS builder).
  • Затем можно скопировать артефакты с предыдущего этапа с помощью COPY --from=<stage_name>.

В качестве образа сохраняется только последний этап.

Структура многоэтапной сборки

Типичный многоэтапный Dockerfile содержит как минимум два этапа:

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

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

Пример многоэтапной сборки (Go)

Перепишем Dockerfile нашего приложения на Go с использованием многоэтапного подхода. Мы соберём приложение на первом этапе, а затем скопируем только скомпилированный двоичный файл в гораздо меньший базовый образ `alpine`.

# Stage 1: Build the application
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY main.go .
RUN go build -o myapp main.go

# Stage 2: Create the final lightweight image
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
EXPOSE 8080
CMD ["./myapp"]

Запуск многоэтапной сборки

При сборке этого Dockerfile Docker выполняет каждый этап. Однако итоговый образ формируется только из содержимого последней инструкции `FROM` и файлов, скопированных с предыдущих этапов.

В результате образ получается значительно меньше одноэтапного, поскольку компилятор Go и инструменты сборки в него не попадают.

Преимущества многоэтапных сборок

Многоэтапные сборки особенно полезны для:

  • Компилируемых языков: Go, Java, C++, Rust.
  • Фронтенд-фреймворков: сборки приложений React/Angular и раздачи статических ресурсов с помощью Nginx.
  • Приложений Node.js: установки `node_modules` на этапе сборки с последующим копированием только `package.json`, `package-lock.json` и собранного приложения в компактный образ для выполнения.

Проверьте свои знания

Каковы основные преимущества использования многоэтапных сборок Docker?

Итоги: эффективность многоэтапных сборок

Вы узнали о многоэтапных сборках Docker!

  • Они используют несколько инструкций FROM в одном Dockerfile.
  • Ключевое слово AS задаёт имена этапам, а COPY --from= переносит артефакты.
  • Главное преимущество — значительно меньшие, более безопасные и эффективные итоговые образы.

Этот приём крайне важен для оптимизации приложений в контейнерах. Далее мы рассмотрим использование кэширования сборки!

Часто задаваемые вопросы

Урок «Многоэтапные сборки для повышения эффективности» бесплатный?

Да — полный текст урока «Многоэтапные сборки для повышения эффективности» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс DevOps Bootcamp, подпишись на CoddyKit PRO. Курс DevOps Bootcamp содержит 4 уроков всего.

Чему я научусь в уроке «Многоэтапные сборки для повышения эффективности»?

Используйте многоэтапные сборки для создания меньших и более безопасных рабочих образов, отделяя зависимости сборки от зависимостей выполнения. Ты практикуешь DevOps Bootcamp с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать DevOps Bootcamp?

Предыдущий опыт не требуется. DevOps Bootcamp на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Многоэтапные сборки для повышения эффективности»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке DevOps Bootcamp?

Да. Каждый урок DevOps Bootcamp включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Многоэтапные сборки для повышения эффективности
  2. Использование кэширования сборки
  3. Лучшие практики безопасности Dockerfile
  4. Уменьшение размера образов с помощью Slim и Distroless
← Назад к DevOps Bootcamp