6.1 Знайомство з оптимізацією образів
Docker-образи хоч і компактні, але все ж займають місце. Тому зменшення їх розміру — завдання важливе, і воно допомагає покращити продуктивність, пришвидшити завантаження і розгортання контейнерів, а також знизити витрати на зберігання. Оптимізувати образ можна за допомогою покращення Dockerfile, адже його можна організовувати по-різному. У цій лекції ми розглянемо кілька стратегій і найкращих практик для створення оптимізованих і легковагих Docker-образів.
Чому важливо зменшувати розмір Docker-образів?
- Швидкість розгортання: менші образи швидше завантажуються з реєстру Docker і розгортаються в контейнери, що особливо важливо в автоматизованих системах CI/CD.
- Ефективне використання ресурсів: легковагі образи займають менше місця на диску, економлять мережеві ресурси при передачі та забезпечують більш ефективне використання обчислювальних потужностей.
- Безпека: менші образи зазвичай містять менше зайвих компонентів, що знижує ризик потенційних вразливостей.
- Спрощення оновлень: оновлення легковагих образів відбувається швидше і потребує менше ресурсів, що пришвидшує процес підтримки.
6.2 Стратегії зменшення розміру Docker-образів
1. Використання мінімальних базових образів
Вибір базового образу напряму впливає на розмір кінцевого Docker-образу. Використання мінімальних базових образів, таких як alpine, дозволяє значно скоротити розмір образу.
Приклад:
Заміна образу ubuntu на alpine:
# FROM ubuntu:20.04
FROM alpine:3.12
alpine — це легковажний Linux-дистрибутив, який займає приблизно 5 MB, тоді як образ ubuntu може займати сотні мегабайт.
2. Мінімізація кількості шарів
Кожна інструкція в Dockerfile додає новий шар до образу. Об'єднання декількох команд в одній інструкції RUN зменшує кількість шарів, що допомагає скоротити загальний розмір образу.
Приклад:
До оптимізації:
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y git
RUN rm -rf /var/lib/apt/lists/*
Після оптимізації:
RUN apt-get update && apt-get install -y curl git && rm -rf /var/lib/apt/lists/*
Видалення кешу менеджера пакетів (rm -rf /var/lib/apt/lists/*) додатково зменшує розмір образу, видаляючи тимчасові файли, створені під час встановлення.
3. Видалення тимчасових файлів
Видалення тимчасових файлів і непотрібних даних після встановлення пакетів допомагає підтримувати образ чистим і компактним.
Приклад:
RUN apt-get update && apt-get install -y curl git && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
4. Використання .dockerignore
Файл .dockerignore допомагає виключити непотрібні файли і директорії з контексту збірки, що зменшує розмір образу і прискорює процес збірки.
Приклад .dockerignore:
node_modules
dist
*.log
Dockerfile*
.dockerignore
5. Багатоетапна збірка (multi-stage builds)
Багатоетапна збірка дозволяє використовувати кілька проміжних образів для створення фінального легковажного образу, що містить тільки необхідні файли та залежності.
Приклад:
# Етап збірки
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# Фінальний етап
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
У цьому прикладі перший етап створює збірку додатку, а фінальний етап використовує тільки результати збірки, що зменшує розмір кінцевого образу.
6. Оптимізація встановлення пакетів
Встановлення тільки необхідних пакетів і використання опцій менеджерів пакетів для мінімальної установки допомагають зменшити розмір образу.
Приклад:
Використання параметра --no-install-recommends для apt-get:
RUN apt-get update && apt-get install -y --no-install-recommends curl git && \
rm -rf /var/lib/apt/lists/*
7. Стиснення і мінімізація даних
Використання інструментів для стиснення і мінімізації даних допомагає зменшити розмір образу.
Приклад:
Стиснення текстових файлів і журналів логів:
RUN gzip /path/to/large/file.log
8. Видалення невикористаних бібліотек і залежностей
Видалення невикористаних бібліотек та залежностей після встановлення необхідних пакетів допомагає підтримувати образ легковажним.
Приклад:
Для Python-додатків:
RUN pip install --no-cache-dir -r requirements.txt
6.3 Приклади оптимізованих Dockerfile
Приклад 1: Оптимізований Dockerfile для Node.js
FROM node:14-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
Цей приклад використовує багатоступеневу збірку. Спочатку додаток збирається на проміжному етапі, а потім тільки результати збірки копіюються у фінальний образ на базі Nginx.
Приклад 2: Оптимізований Dockerfile для Python
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
У цьому прикладі використовується легковаговий базовий образ python:3.9-slim. Встановлення залежностей винесено в окремий крок, що дозволяє використовувати кеш Docker, якщо файл requirements.txt не змінений.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ