Заздалегідь створені образи є зручним рішенням, доки вони не виявляться недостатньо гнучкими для специфічних потреб проєкту. У світі контейнеризації Dockerfile перетворює ваш застосунок на портативний та відтворюваний артефакт. Це дає вам повний контроль над процесом: ви можете виправити, перебудувати та чітко керувати кожним етапом життя вашого програмного забезпечення.
Хоча сучасні стеки, як-от Ghost з MySQL, можуть бути стабільними після розв'язання проблем перегони при запуску, вони часто створюють проблему: після повного скидання системи (docker compose down --volumes) увесь ручний процес налаштування повторюється. Якщо ви використовуєте образ із Docker Hub без власного контролю, він не запам'ятовує ваші унікальні зміни.
Dockerfile дозволяє вам взяти цей контроль у свої руки. Ви починаєте з базового образу, встановлюєте необхідні залежності, вбудовуєте конфігурацію та чітко визначаєте команду запуску контейнера. Результатом є артефакт, який кожного разу чисто і послідовно перебудовується відповідно до ваших вимог.
Підготовка робочого середовища
Перш ніж розпочати роботу з Dockerfile, необхідно виконати кілька передумов та створити структуру проєкту. Переконайтеся, що ви вже завершили епізоди 1–10 і впевнено працюєте з файлами Compose та перевірками стану (health checks).
Створіть робочу директорію для цього навчального матеріалу:
$ mkdir -p ~/noteboard
$ cd ~/noteboard
У цій директорії ви створите три ключові файли: app.py (код застосунку), requirements.txt (список залежностей) та Dockerfile (інструкції збірки).
Створення мінімального Flask-застосунку
Для демонстрації принципів контейнеризації ми створимо простий застосунок на Flask.
Спочатку створіть файл app.py:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "<h1 >Noteboard</h1 ><p>Hello.</p>"
Далі, визначте необхідні залежності у файлі requirements.txt:
flask==3.1.3
Перший Dockerfile: Збірка сервера розробки
Напишіть свій перший Dockerfile. Цей файл містить інструкції для Docker щодо створення образу:
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 5000
CMD ["flask", "run", "--host=0.0.0.0"]
Кожна інструкція в цьому файлі виконує конкретне завдання:
* FROM python:3.12-slim: Вказує, що збірка починається з офіційного образу Python 3.12 slim — це менший за розміром і більш ефективний базовий образ.
* WORKDIR /app: Встановлює робочу директорію всередині контейнера. Усі наступні команди будуть виконуватися саме тут.
* COPY requirements.txt.: Копіює файл вимог із вашого моста до /app.
* RUN pip install ...: Виконує встановлення залежностей під час збірки образу. Цей шар кешується, що прискорює подальші збірки, якщо requirements.txt не змінився.
* COPY app.py.: Копіює вихідний код застосунку у контейнер.
* EXPOSE 5000: Документує, що цей контейнер слухатиме на порту 5000. Важливо: ця інструкція лише сигналізує про порт, для доступу ззовні все одно потрібен -p під час запуску.
* CMD [...]: Визначає команду, яка автоматично виконується при старті контейнера.
Для збірки та запуску застосунку виконайте наступні команди:
$ docker build -t noteboard .
$ docker run -d -p 5000:5000 --name noteboard noteboard
Перевірка роботи застосунку через curl підтвердить успішне розгортання.
Перехід на Gunicorn для production-grade
Вбудований сервер Flask, який використовується у режимі розробки, є однопотоковим і не призначений для обслуговування реального трафіку. Для корпоративного рівня (production-grade) необхідно використовувати WSGI-сервер, такий як Gunicorn.
Додайте gunicorn до файлу requirements.txt:
flask==3.1.3
gunicorn==22.0.0
Оновіть команду запуску (CMD) у вашому Dockerfile, щоб вона використовувала Gunicorn:
```dockerfile
... (попередні інструкції залишаються незмінними)
CMD ["gunicorn", "--bind", "0.0.0.