🐳 Размер образа Docker: как проверить и уменьшить

Оптимизация образа Docker

by itisgood

Уменьшение размера образов Docker помогает ускорить развертывание контейнеров.

Для крупномасштабных развертываний это может привести к значительной экономии места в хранилище.

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

В этой статье мы расскажем о рекомендуемых методах уменьшения размера образов Docker.

Как проверить размер образа Docker

Docker CLI позволяет проверить размер локально доступных образов.

Для отображения основной информации об образе используйте следующую команду:

docker images

Найдите размер образа в списке, обратившись к колонке SIZE.

Как проверить размер слоев образа Docker

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

Слои накладываются друг на друга, и сумма их размеров представляет собой общий размер образа Docker.

Чтобы получить список всех слоев образа, используйте следующую команду docker history:

docker history [image]

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

В столбце SIZE указан размер каждого слоя.

Что такое ограничение на размер образа Docker?

Docker не устанавливает ограничений на размер образов, но максимальный размер слоя образа составляет 10 ГБ.

Это ограничение означает, что, например, образ Docker размером 50 ГБ должен состоять как минимум из пяти слоев.

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

Самый популярный публичный репозиторий Docker, Docker Hub, ограничивает размер образа до 100 ГБ.

Как установить ограничение на размер образа Docker

Встроенного способа установить ограничение на размер образа в Docker не существует.

Однако ниже приведены два способа достижения аналогичного результата с помощью сторонних инструментов:

  • Используйте пайплайны CI/CD. Интегрируйте такие инструменты, как Docker Slim и Docker Image Size, для проведения статического и динамического анализа образов Docker и автоматической генерации образов меньшего размера.
  • Настройка уведомлений. Напишите скрипт на bash, который анализирует вывод команды docker events. Затем установите пороговое значение размера образа, при достижении которого будет отправляться уведомление. При желании можно автоматизировать скрипт, настроив cronjob.

Каков рекомендуемый размер образа Docker?

Универсальной рекомендации по размеру образа Docker не существует, поскольку структура образа зависит от контекста, в котором он создается.

  • Локальная разработка. Локальная разработка часто требует больших образов, поэтому образы размером до 1 ГБ оптимальны для сред, не зависящих от удаленных репозиториев.
  • Производственное развертывание. Когда образ переходит в стадию развертывания на производстве, необходимо оптимизировать его с точки зрения использования ресурсов и скорости. Цель на этом этапе – получить образ размером менее 500 МБ.
  • Микросервисы. Поскольку микросервисы работают лучше всего, когда они легкие и легко масштабируются, образ каждого сервиса должен быть менее 200 МБ.
  • Обработка данных. Размер образов, связанных с обработкой данных и аналитикой, не должен превышать 500 МБ. Однако размер образа может достигать 1 ГБ в зависимости от используемых инструментов и библиотек.
  • Веб-приложения. Для веб-приложений требуются контейнеры, основанные на легких образах, которые обеспечивают плавную работу. Рекомендуется использовать образы размером менее 500 МБ для веб-сервера, среды выполнения приложений и зависимостей.
  • IoT и edge. Из-за ограниченности ресурсов образы IoT и edge должны быть минимальными. Оптимальный образ IoT не должен превышать 100 МБ.

Как уменьшить размер образа Docker

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

В следующих разделах приведены советы по уменьшению размеров образов Docker с сохранением необходимых данных.

Используйте минимальный базовый образ

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

Создатель образа добавляет существующий родительский образ с помощью вызова Dockerfile FROM.

Основой образа часто является целая операционная система, что может сильно повлиять на размер конечного Docker-образа.

Например, самый популярный образ ОС, Ubuntu, занимает более 150 МБ, что создает значительные накладные расходы в начале процесса создания образа.

Полезной облегченной альтернативой является Alpine, минимальное POSIX-окружение.

Этот образ дистрибутива Linux занимает всего 5 МБ и построен на базе musl libc и BusyBox.

Создание .dockerignore

Используйте файл .dockerignore, чтобы исключить файлы, ненужные для окончательной сборки образа. Когда выполняется команда docker run, Docker проверяет наличие файла .dockerignore в каталоге проекта и, если он есть, создает контейнер образа, исключающий перечисленные в нем файлы и каталоги.

Файл .dockerignore имеет простой синтаксис.

Например, чтобы исключить текстовый файл test.txt и все MD-файлы, кроме readme.md, создайте файл .dockerignore со следующим содержанием:

test.txt
*.md
!readme.md

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

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

Избегайте ненужных слоев

Образ Docker занимает все больше места с каждым добавленным слоем.
Поскольку каждая команда RUN в Dockerfile добавляет новый слой к образу, лучше всего уместить как можно больше в одной команде RUN.
Кроме того, функция && shell позволяет объединить различные команды в одну команду.
Например, чтобы обновить репозиторий, установить несколько пакетов и очистить кэш APT в одной команде RUN, используйте следующую команду:
RUN apt update &&\ 
    apt install -y\
    [package1] \
    [package2] &&\
    rm -rf /var/lib/apt/lists/*

Используйте обратную косую черту (\), чтобы набрать команду в несколько строк и сделать ее более читабельной.

Удаление ненужных пакетов и зависимостей

Установка пакета часто включает загрузку зависимостей.
Однако в процессе загрузки иногда сохраняются и необязательные пакеты.
Такие ненужные пакеты могут накапливаться и занимать много места на диске.
Добавьте опцию –no-install-recommends в команду install, чтобы загружать только основные зависимости:
RUN apt install --no-install-recommends [package]

Организация слоев для кэширования

Docker ускоряет создание образов, локально кэшируя существующие слои Dockerfile и используя кэш для более быстрой сборки образов. Однако кэш используется только для слоев, предшествующих изменяемому слою.
Чтобы оптимизировать образ, размещайте инструкции Dockerfile, которые, скорее всего, будут изменяться, как можно ниже в Dockerfile, чтобы они выполнялись последними.
Хотя эта практика не влияет на общий размер образа Docker, она все же помогает ускорить сборку Docker.

Заключение

Прочитав эту статью, вы должны знать, как оптимизировать образы Docker и сделать их небольшими, чтобы повысить производительность вашего приложения.
Размер образа и эффективность сборки – важные факторы при наблюдении и работе с контейнерами.
см. также:

You may also like

Leave a Comment