JavaRush /Курси /Модуль 2: Fullstack /Оптимізація Dockerfile

Оптимізація Dockerfile

Модуль 2: Fullstack
Рівень 13 , Лекція 5
Відкрита

6.1 Знайомство з оптимізацією образів

Docker-образи хоч і компактні, але все ж займають місце. Тому зменшення їх розміру — завдання важливе, і воно допомагає покращити продуктивність, пришвидшити завантаження і розгортання контейнерів, а також знизити витрати на зберігання. Оптимізувати образ можна за допомогою покращення Dockerfile, адже його можна організовувати по-різному. У цій лекції ми розглянемо кілька стратегій і найкращих практик для створення оптимізованих і легковагих Docker-образів.

Чому важливо зменшувати розмір Docker-образів?

  1. Швидкість розгортання: менші образи швидше завантажуються з реєстру Docker і розгортаються в контейнери, що особливо важливо в автоматизованих системах CI/CD.
  2. Ефективне використання ресурсів: легковагі образи займають менше місця на диску, економлять мережеві ресурси при передачі та забезпечують більш ефективне використання обчислювальних потужностей.
  3. Безпека: менші образи зазвичай містять менше зайвих компонентів, що знижує ризик потенційних вразливостей.
  4. Спрощення оновлень: оновлення легковагих образів відбувається швидше і потребує менше ресурсів, що пришвидшує процес підтримки.

6.2 Стратегії зменшення розміру Docker-образів

1. Використання мінімальних базових образів

Вибір базового образу напряму впливає на розмір кінцевого Docker-образу. Використання мінімальних базових образів, таких як alpine, дозволяє значно скоротити розмір образу.

Приклад:

Заміна образу ubuntu на alpine:

dockerfile

# FROM ubuntu:20.04
FROM alpine:3.12

alpine — це легковажний Linux-дистрибутив, який займає приблизно 5 MB, тоді як образ ubuntu може займати сотні мегабайт.

2. Мінімізація кількості шарів

Кожна інструкція в Dockerfile додає новий шар до образу. Об'єднання декількох команд в одній інструкції RUN зменшує кількість шарів, що допомагає скоротити загальний розмір образу.

Приклад:

До оптимізації:

dockerfile

RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y git
RUN rm -rf /var/lib/apt/lists/*

Після оптимізації:

dockerfile

RUN apt-get update && apt-get install -y curl git && rm -rf /var/lib/apt/lists/*

Видалення кешу менеджера пакетів (rm -rf /var/lib/apt/lists/*) додатково зменшує розмір образу, видаляючи тимчасові файли, створені під час встановлення.

3. Видалення тимчасових файлів

Видалення тимчасових файлів і непотрібних даних після встановлення пакетів допомагає підтримувати образ чистим і компактним.

Приклад:

dockerfile


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:

Terminal


node_modules
dist
*.log
Dockerfile*
.dockerignore

5. Багатоетапна збірка (multi-stage builds)

Багатоетапна збірка дозволяє використовувати кілька проміжних образів для створення фінального легковажного образу, що містить тільки необхідні файли та залежності.

Приклад:

dockerfile


# Етап збірки
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:

dockerfile


RUN apt-get update && apt-get install -y --no-install-recommends curl git && \
    rm -rf /var/lib/apt/lists/*

7. Стиснення і мінімізація даних

Використання інструментів для стиснення і мінімізації даних допомагає зменшити розмір образу.

Приклад:

Стиснення текстових файлів і журналів логів:

dockerfile


RUN gzip /path/to/large/file.log

8. Видалення невикористаних бібліотек і залежностей

Видалення невикористаних бібліотек та залежностей після встановлення необхідних пакетів допомагає підтримувати образ легковажним.

Приклад:

Для Python-додатків:

dockerfile


RUN pip install --no-cache-dir -r requirements.txt

6.3 Приклади оптимізованих Dockerfile

Приклад 1: Оптимізований Dockerfile для Node.js

dockerfile

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

dockerfile

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 не змінений.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ