Основи Dockerfile: визначення та створення контейнеризованих додатків
12:49, 29.05.2026
Docker — це платформа, необхідна для запуску і, що ще важливіше, для створення контейнеризованих додатків. За допомогою контейнерів можна об’єднати в один пакет залежності, вихідний код та середовище виконання. Це можна зробити за допомогою Docker, встановленого на вашому комп’ютері, або за допомогою кластера Kubernetes як інфраструктури.
Під час запуску контейнерів необхідний образ контейнера. Образи визначають початковий стан файлових систем контейнерів. Це можна зробити за допомогою Dockerfile, і в цій статті ми розповімо вам про процес створення контейнерних додатків та поділимося корисними практиками.
Вступ до Dockerfile
Dockerfile містять інструкції у вигляді тексту, необхідні для побудови образу контейнера. Щоб обробити всі інструкції у файлі для складання образу, слід використати таку команду:
docker build
Після використання цієї команди всі інструкції обробляються послідовно. Якщо рядок починається з #, це не команда, а коментар або тлумачення команди. Аргументи в рядках можна розділяти за допомогою зворотної косої риски.
Основні інструкції, що використовуються в Dockerfile
Існує понад 15 інструкцій, які можна використовувати в Dockerfile для налаштування деяких параметрів та додавання вмісту. Ось список найпопулярніших з них:
- FROM зазвичай знаходиться на початку файлу і є основою для побудови.
- COPY потрібна для додавання папок/файлів до файлової системи. Процес копіювання відбувається між образом та хостом Docker.
- ADD працює аналогічно до вищезгаданої інструкції, але також підтримує розпакування архівів та URL-адреси файлів. Використання ADD може спростити деякі завдання. Наприклад, архівні файли розпаковуються в контейнері, а не просто копіюються.
- RUN використовується для виконання команди в образі. Це означає, що створюється новий шар образу з деякими необхідними змінами. Зазвичай ця команда необхідна для налаштування та встановлення додаткових пакетів.
- ENV – необхідна для налаштування середовища.
Приклад робочого процесу: написання та застосування Dockerfile
Тепер, коли ви зрозуміли деякі основні команди, перейдемо до фактичного прикладу робочого процесу.
Почніть зі створення нового каталогу, використавши наступний код та збереживши його:
import { v4 as uuid } from "uuid";
console.log("Hello World");
console.log(`Your ID is ${uuid()}`);
Потім додайте пакет до проектів наступним чином:
$ npm install uuidНаступним кроком буде додавання наступних інструкцій та їх збереження у файлі Dockerfile:
FROM node:16
WORKDIR /app
COPY package.json .
COPY package-lock.json .
RUN npm install
COPY main.js .
ENTRYPOINT ["node"]
CMD ["main.js"]
Спробуємо пояснити деякі деталі коду:
- node:16 – офіційний образ, який використовується як основа.
- WORKDIR – у цій частині каталог змінюється на /app.
- COPY використовується для додавання 2 файлів з каталогу хоста до робочого каталогу всередині контейнера.
- npm install – використовується для встановлення у файловій системі контейнера з метою завантаження залежностей.
- COPY main.js – вихідний код копіюється до контейнера.
Кроки для створення вашого Dockerfile
На цьому етапі ви можете розпочати створення образу з Dockerfile за допомогою наступної команди:
$ docker build -t demo-image:latest .
Після створення образу ви побачите інструкції в терміналі.
Опції, доступні під час побудови Docker
Використовуючи docker build команду, ви вказуєте шляхи, на які посилаєтеся у файлі. Шляхи поза контекстом не будуть помітні для більшості інструкцій.
Docker автоматично перевіряє інструкції відповідно до робочого каталогу, але можна вказати інший файл за допомогою -f, як показано нижче:
docker build -f dockerfiles/app.dockerfile -t demo-image:latest -t demo-image:v1.0 .
Запуск та використання створеного образу
Щоб запустити створений образ, скористайтеся наступним:
docker run demo-image:latest node main.js
Рекомендовані практики щодо Dockerfile
Написання Dockerfile вважається досить простим завданням, але слід врахувати деякі рекомендації для покращення продуктивності, зручності використання та рівня безпеки.
1. Уникайте використання тегу `latest` для базових образів
В інструкції FROM краще уникати використання «latest», оскільки це може призвести до деяких непередбачених змін. Більшість авторів образів відразу використовують останню версію. Під час перекомпіляції образу це може непомітно спровокувати використання іншої версії, що спричинить певні проблеми.
Тому краще бути більш конкретним і вказати node:16.
2. Вибирайте базові образи тільки з надійних джерел
Використання надійного джерела для базового образу є надзвичайно важливим, інакше ви можете зіткнутися з деякими ризиками безпеки. Ненадійний базовий образ може містити шкідливе програмне забезпечення, яке працює поза контейнерами. Тому краще використовувати образи, опубліковані перевіреними користувачами або офіційні.
3. Впровадьте HEALTHCHECK для моніторингу стану контейнера
Дуже важливо моніторити стан контейнера. Це можна зробити за допомогою оркестраторів, таких як Kubernetes, щоб проблемні контейнери можна було автоматично перезапустити.
HEALTHCHECK слід додати до Dockerfile, щоб команда запускалася всередині та перевіряла, чи все працює належним чином:
HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD curl -f http://localhost || exit 1
Стан контейнерів можна перевірити за допомогою команди ps.
4. Налаштуйте ENTRYPOINT та CMD належним чином
Інструкції CMD та ENTRYPOINT є дещо схожими. CMD надає аргументи за замовчуванням, а ENTRYPOINT запускає цей процес. Аргументи в CMD можна налаштувати під час запуску контейнерів за допомогою docker run.
5. Ніколи не зберігайте секретні дані безпосередньо в образах
З міркувань безпеки ваших секретних даних не рекомендується зберігати API-ключі або паролі в образах. Адже будь-який користувач, що має доступ до образу, може перевірити цю інформацію та використати її.
Також краще використовувати змінні середовища, а не значення за замовчуванням у Dockerfile. Це допоможе мінімізувати деякі ризики безпеки.
6. Додавайте мітки для впорядкування та відстеження ваших образів
Якщо у вашій команді багато образів, краще використовувати інструкцію LABEL. Це означає, що ви можете додавати цінну інформацію для кожного проєкту. Мітки встановлюються на основі синтаксису зворотного DNS наступним чином:
LABEL com.sample.team=backend
7. Запускайте контейнери, використовуючи користувача, що не є root
Згідно з характеристиками за замовчуванням, контейнери працюють як користувач root. Це може спричинити певні ризики безпеки, оскільки хакери можуть увійти в контейнер і виконати деякі команди на хості.
Цю проблему можна вирішити, додавши інструкцію USER до файлу Dockerfile. Найкраща рекомендація тут — використовувати користувачів, що не є root, для всіх файлів.
USER demo-app
USER 1000
USER demo-app:demo-group
8. Використовуйте `.dockerignore` для прискорення процесу побудови
Образи зазвичай будуються з робочим каталогом, який може містити непотрібні каталоги та файли. Для підвищення продуктивності необхідно виключити шляхи, які не потрібні. Це допоможе пришвидшити процес, коли Docker копіює контекст побудови на початковому етапі процесу побудови.
Використовуйте файл dockerignore у каталозі, щоб виключити непотрібні каталоги/файли.
9. Оптимізуйте розмір образу, коли це можливо
Образи можуть стати надзвичайно великими, і це безпосередньо впливає на час побудови. Щоб оптимізувати розмір образу, рекомендується використовувати лише необхідні пакети та виключити все інше. Також краще використовувати компактний базовий образ, якщо це можливо. Наприклад, Alpine Linux замість Ubuntu.
10. Використовуйте лінтери та сканери вразливостей для безпеки
Файли Dockerfile можуть містити помилки, які можуть призвести до серйозних проблем або несподіваної поведінки. Для перевірки можливих проблем можна використовувати лінтери, такі як Hadolint.
Щоб запустити його, використовуйте таку команду:
$ docker run --rm -i hadolint/hadolint < Dockerfile
Також рекомендується використовувати такі сканери, як Trivy, які допоможуть виявити застарілі пакети. Спробуйте використовувати його перед розгортанням, щоб мінімізувати деякі ризики.
Підсумок основних висновків
Docker — надзвичайно популярна технологія, яка безпосередньо впливає на доставку програмного забезпечення завдяки використанню контейнерів, що ідеально працюють у різних середовищах. Для правильного використання Docker необхідно написати файл Dockerfile, що містить усі необхідні інструкції. Ці інструкції визначаються специфікацією образів OCI і створюють образи, необхідні для середовища виконання контейнерів, сумісного з OCI.