Що таке Dockerfile і як він створює образ?

Автор: Опубліковано

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

Dockerfile, образ і контейнер — три різні речі

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

У Dockerfile ви визначаєте, зокрема, базове середовище, файли для копіювання, залежності для встановлення та типову команду запуску. Завдяки цьому не потрібно вручну готувати кожен сервер за окремою інструкцією. Після зміни коду або залежностей зазвичай будують новий образ.

Контейнер — це не повноцінна віртуальна машина: він використовує ядро операційної системи середовища, у якому працює контейнерний рушій. Образ допомагає уніфікувати середовище застосунку, але не усуває всіх відмінностей між комп’ютерами. Як і раніше, мають значення, наприклад, архітектура процесора, конфігурація мережі та доступ до файлів.

Які інструкції містить Dockerfile?

Файл зазвичай має назву Dockerfile, без розширення. Кожна інструкція описує конкретний крок побудови або налаштування образу. Найчастіше трапляються такі:

Важливо розрізняти RUN і CMD. Команда RUN виконується під час створення образу, а CMD — лише під час запуску контейнера. Залежності зазвичай встановлюють через RUN, а сервер запускають через CMD.

Є також ENTRYPOINT, що визначає основну програму контейнера. Цю інструкцію можна поєднати з CMD, щоб передавати програмі типові аргументи. Для першого простого прикладу достатньо лише CMD.

Простий приклад: сторінка HTML у контейнері

Припустімо, ви хочете локально запустити просту сторінку, не встановлюючи Python на своєму комп’ютері. Вам потрібні працездатний Docker і каталог із двома файлами: index.html та Dockerfile.

У файл index.html додайте:

<!doctype html>
<html lang="uk">
<meta charset="utf-8">
<title>Приклад Docker</title>
<h1>Сторінка працює в контейнері</h1>
</html>

Файл Dockerfile може мати такий вигляд:

FROM python:3.13-slim
WORKDIR /app
COPY index.html .
EXPOSE 8000
CMD ["python", "-m", "http.server", "8000", "--bind", "0.0.0.0"]

Docker використає образ із Python, задасть каталог /app і скопіює до нього сторінку. Під час запуску контейнера він запустить простий сервер HTTP. Адреса 0.0.0.0 означає прослуховування всіх мережевих інтерфейсів контейнера, що дає змогу звернутися до сервера через опублікований порт.

У терміналі, перебуваючи в каталозі з цими файлами, виконайте:

docker build -t moia-storinka .
docker run --rm -p 127.0.0.1:8080:8000 moia-storinka

Перша команда будує образ і надає йому назву moia-storinka. Крапка вказує на поточний каталог як на контекст побудови, тобто набір файлів, доступних процесу побудови. Друга команда запускає контейнер і пов’язує локальний порт 8080 з портом 8000 контейнера.

Відкрийте в браузері http://localhost:8080. Прив’язка порту до 127.0.0.1 обмежує доступ локальним комп’ютером. Сервер можна зупинити сполученням клавіш Ctrl+C, а параметр --rm видалить контейнер після завершення його роботи. Це навчальний приклад, а не конфігурація виробничого сервера.

Що впливає на швидкість і безпеку побудови?

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

Файл .dockerignore виключає зайві файли з контексту побудови. Зазвичай це каталог .git, локальні середовища, журнали та файли із секретами. Це зменшує обсяг переданих даних і ризик випадково додати конфіденційні матеріали.

Не записуйте паролі й токени в Dockerfile і не копіюйте їх до образу. Видалення секрету на пізнішому кроці не гарантує його видалення з попередніх шарів образу. Секрети, потрібні під час побудови, передавайте через механізми роботи із секретами BuildKit, а дані, потрібні запущеному застосунку, — через відповідну конфігурацію середовища виконання.

Для виробничого використання розгляньте запуск застосунку від імені користувача без прав адміністратора. Також контролюйте версію базового образу: з часом тег може почати вказувати на змінений образ, тоді як digest ідентифікує конкретний вміст. Доступні версії та спосіб оновлення перевіряйте в офіційній документації вибраного образу.

Коли потрібен Dockerfile, а коли Compose?

Dockerfile відповідає на запитання: «Як побудувати образ?». Docker Compose призначений для опису й запуску набору сервісів, наприклад застосунку, бази даних і кешу, разом із їхніми мережами, портами та томами. Том — це механізм зберігання даних незалежно від життєвого циклу окремого контейнера.

Ці інструменти можуть працювати разом: Compose може побудувати образ за Dockerfile, а потім запустити його поряд із готовим образом бази даних. Якщо ви використовуєте лише готові образи, власний Dockerfile потрібен не завжди.

Почніть із побудови та запуску одного простого образу. Потім замініть приклад сторінки власним застосунком, явно визначте його залежності та перевірте, які файли справді мають потрапити до образу.

Дивіться також: Що таке API?

Читайте також

Дізнайтеся, як PHP-FPM обробляє запити PHP, чим відрізняється від вебсервера та як налаштувати процеси під трафік і ресурси хостингу.
Дізнайтеся, як BIND обслуговує DNS, чим відрізняються його серверні ролі та коли варто розгортати його самостійно замість керованої послуги.
Дізнайтеся, що означають польський реєстр і номер REGON, чим вони відрізняються від NIP та KRS і як перевірити дані підприємства.