Створення образів
Docker може збирати образи автоматично, читаючи інструкції з Dockerfile. Dockerfile - це текстовий файл, який містить інструкції для автоматичної збірки Docker-образу. Docker-образ є шаблоном, який використовується для створення Docker-контейнера, який є ізольованим середовищем для виконання додатків.
[!TIP] Опис всіх команд ви можете знайти у Dockerfile reference
Основні команди, які можна знайти в Dockerfile, включають:
FROM: Вказує базовий образ, на основі якого буде створюватись новий образ. Наприклад,FROM node:14використовує образ з встановленою версією Node.js 14 як базовий.RUN: Виконує команди в командному рядку в процесі збирання образу. Наприклад,RUN npm installвстановлює залежності проекту.COPYабоADD: Копіює файли або директорії з локальної машини в образ. Наприклад,COPY . /appкопіює всі файли з поточної директорії в/appв образі.WORKDIR: Встановлює робочу директорію для наступних інструкцій. Наприклад,WORKDIR /appвстановлює/appяк робочу директорію.EXPOSE: Вказує порти, які контейнер повинен відкрити під час виконання. Наприклад,EXPOSE 8080відкриває порт 8080.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.
Кешування шарів

Компоновка Dockerfile має велике значення для ефективного використання кешу шарів. При правильному підході можна значно скоротити час збірки образів, оскільки Docker зберігає результати виконання інструкцій в шарах та повторно використовує їх за умови, що інструкція та її контекст не змінилися. Нижче наведені найкращі практики, які допоможуть створити ефективні Dockerfile:
Встановлення залежностей на самому початку:
- Оскільки залежності проєкту часто змінюються рідше, ніж сам код, копіювання файлів, які містять лише залежності – таких як
package.jsonтаpackage-lock.json– перед копіюванням всього коду створює шар, який рідше потрібно буде пересобирати.COPY package*.json ./ RUN npm install
- Оскільки залежності проєкту часто змінюються рідше, ніж сам код, копіювання файлів, які містять лише залежності – таких як
Розміщення інструкцій
RUN, які не змінюються, раніше:- Інструкції, які встановлюють системні пакети або залежності, варто розташовувати якомога вище у Dockerfile.
FROM node:14 RUN apt-get update && apt-get install -y some-package
- Інструкції, які встановлюють системні пакети або залежності, варто розташовувати якомога вище у Dockerfile.
Оптимізація
COPYкоманд:- Уникайте частих
COPYкоманд. Копіюйте лише необхідні файли на кожному етапі. - Використовуйте
.dockerignore, щоб виключити файли, які не потрібні у контейнері (наприклад, файли версіонування, тестові файли, тимчасові файли).
- Уникайте частих
Зменшення кількості шарів:
- Для цього можна з’єднувати кілька команд в одному рядку за допомогою операторів
&&. Це створить один шар замість декількох.RUN apt-get update && apt-get install -y \ some-package \ another-package && \ rm -rf /var/lib/apt/lists/* - По максимуму використовуйте кешування при копіюванні файлів та установці залежностей.
- Для цього можна з’єднувати кілька команд в одному рядку за допомогою операторів
Використання багатостадійного збірковування:
Багатостадійне збірковування дозволяє мати різні етапи для побудови та запуску, що зменшує розмір кінцевого образу.
# етап 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"]
Кешування залежностей:
- Використовуйте можливості кешування у разі доступу до залежностей. У прикладі Node.js це означає ізоляцію
npm installдо зміни файлівpackage*.json.
- Використовуйте можливості кешування у разі доступу до залежностей. У прикладі Node.js це означає ізоляцію
Наведений нижче приклад демонструє всі ці найкращі практики:
# Вказуємо базовий образ з 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 не можна використовувати зсередини запущених контейнерів.

Детально кожну з цих можливостей розглянуто у статті 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.