Створення образів

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

[!TIP] Опис всіх команд ви можете знайти у Dockerfile reference

Основні команди, які можна знайти в Dockerfile, включають:

  1. FROM: Вказує базовий образ, на основі якого буде створюватись новий образ. Наприклад, FROM node:14 використовує образ з встановленою версією Node.js 14 як базовий.
  2. RUN: Виконує команди в командному рядку в процесі збирання образу. Наприклад, RUN npm install встановлює залежності проекту.
  3. COPY або ADD: Копіює файли або директорії з локальної машини в образ. Наприклад, COPY . /app копіює всі файли з поточної директорії в /app в образі.
  4. WORKDIR: Встановлює робочу директорію для наступних інструкцій. Наприклад, WORKDIR /app встановлює /app як робочу директорію.
  5. EXPOSE: Вказує порти, які контейнер повинен відкрити під час виконання. Наприклад, EXPOSE 8080 відкриває порт 8080.
  6. CMD або ENTRYPOINT: Вказує команду, яка буде виконуватись під час запуску контейнера. Наприклад, CMD ["node", "app.js"] запускає файл app.js з використанням Node.js.

Нижче, приклад Dockerfile для запуску простого веб-серверу з використанням Node.js:

# Використовуємо базовий образ з Node.js
FROM node:14

# Встановлюємо робочу директорію
WORKDIR /app

# Копіюємо package.json та package-lock.json
COPY package*.json ./

# Встановлюємо залежності
RUN npm install

# Копіюємо всі файли проекту
COPY . .

# Відкриваємо порт 8080
EXPOSE 8080

# Запускаємо сервер
CMD ["node", "server.js"]

У цьому прикладі ми використовуємо базовий образ node:14, встановлюємо робочу директорію /app, копіюємо package.json та package-lock.json, встановлюємо залежності за допомогою npm install, копіюємо всі файли проекту, відкриваємо порт 8080 та запускаємо сервер за допомогою команди node server.js.

Кешування шарів

Layers cache

Компоновка Dockerfile має велике значення для ефективного використання кешу шарів. При правильному підході можна значно скоротити час збірки образів, оскільки Docker зберігає результати виконання інструкцій в шарах та повторно використовує їх за умови, що інструкція та її контекст не змінилися. Нижче наведені найкращі практики, які допоможуть створити ефективні Dockerfile:

  1. Встановлення залежностей на самому початку:

    • Оскільки залежності проєкту часто змінюються рідше, ніж сам код, копіювання файлів, які містять лише залежності – таких як package.json та package-lock.json – перед копіюванням всього коду створює шар, який рідше потрібно буде пересобирати.
      COPY package*.json ./
      RUN npm install
      
  2. Розміщення інструкцій RUN, які не змінюються, раніше:

    • Інструкції, які встановлюють системні пакети або залежності, варто розташовувати якомога вище у Dockerfile.
      FROM node:14
      RUN apt-get update && apt-get install -y some-package
      
  3. Оптимізація COPY команд:

    • Уникайте частих COPY команд. Копіюйте лише необхідні файли на кожному етапі.
    • Використовуйте .dockerignore, щоб виключити файли, які не потрібні у контейнері (наприклад, файли версіонування, тестові файли, тимчасові файли).
  4. Зменшення кількості шарів:

    • Для цього можна з’єднувати кілька команд в одному рядку за допомогою операторів &&. Це створить один шар замість декількох.
      RUN apt-get update && apt-get install -y \
        some-package \
        another-package && \
        rm -rf /var/lib/apt/lists/*
      
    • По максимуму використовуйте кешування при копіюванні файлів та установці залежностей.
  5. Використання багатостадійного збірковування:

    • Багатостадійне збірковування дозволяє мати різні етапи для побудови та запуску, що зменшує розмір кінцевого образу.

      # етап 1: збірка
      FROM node:14 AS build
      WORKDIR /app
      COPY package*.json ./
      RUN npm install
      COPY . .
      RUN npm run build
      
      # етап 2: виконання
      FROM node:14
      WORKDIR /app
      COPY --from=build /app .
      CMD ["node", "server.js"]
      
  6. Кешування залежностей:

    • Використовуйте можливості кешування у разі доступу до залежностей. У прикладі Node.js це означає ізоляцію npm install до зміни файлів package*.json.

Наведений нижче приклад демонструє всі ці найкращі практики:

# Вказуємо базовий образ з Node.js
FROM node:14 AS build

# Встановлюємо робочу директорію
WORKDIR /app

# Копіюємо package.json та package-lock.json для кешування шарів залежностей
COPY package*.json ./

# Встановлюємо залежності
RUN npm install

# Копіюємо решту файлів проекту
COPY . .

# Створюємо збірочний образ
RUN npm run build

# Використовуємо багатостадійне збірковування для зменшення розміру кінцевого образу
FROM node:14
WORKDIR /app
COPY --from=build /app .

# Відкриваємо порт 8080
EXPOSE 8080

# Запускаємо сервер
CMD ["node", "server.js"]

Ці рекомендації допоможуть оптимізувати збірку Docker-образів і використовувати кешування максимально ефективно.

https://docs.docker.com/build/guide/layers/

ARG and ENV

При використанні Docker ми розрізняємо два різних типи змінних - ARG та ENV. Вони відрізняються тим, на якому етапі життєвого циклу контейнера зображення доступні їхні значення.

Ось спрощений огляд доступності ARG та ENV. Починаючи зі створення образу Docker з Docker-файлу і до запуску контейнера. Значення ARG не можна використовувати зсередини запущених контейнерів.

An overview of ARG and ENV availability

Детально кожну з цих можливостей розглянуто у статті Docker ARG, ENV and .env - a Complete Guide.

Збірка образу

Після того як Dockerfile підготовлено, його можна зібрати в образ за допомогою команди docker build.

Команда docker build

Основний синтаксис:

docker build -t <ім'я_образу>:<тег> <шлях_до_Dockerfile>
  • -t: Прапорець для зазначення тегу (імені) образу.
  • <ім'я_образу>:<тег>: Ім'я та тег образу. Наприклад, myapp:latest.
  • <шлях_до_Dockerfile>: Шлях до директорії з Dockerfile. Частіше всього це . (поточна директорія).

Приклад:

docker build -t myapp:latest .

Ця команда зібере Docker-образ із поточної директорії (.), назвавши його myapp з тегом latest.

Best practices

https://docs.docker.com/guides/workshop/09_image_best/

results matching ""

    No results matching ""