2.1 Основні концепції Dockerfile
Dockerfile — це текстовий файл, що містить послідовність команд, які Docker використовує для створення образу. Він слугує «рецептом», що описує, як повинен бути зібраний образ — від базового шару до фінального стану. Розуміння структури та процесу створення Dockerfile важливо для ефективного використання Docker.
Основні концепції Dockerfile:
- Ідемпотентність: команди в Dockerfile повинні бути ідемпотентними — їх повторне виконання дає один і той самий результат.
- Послідовність: команди виконуються послідовно зверху вниз. Порядок має значення, адже кожна команда створює новий шар образу.
- Шарова структура: практично кожна інструкція додає новий шар до образу. Ці шари кешуються, що дозволяє оптимізувати процес зборки.
Структура Dockerfile:
Dockerfile складається з інструкцій, кожна з яких виконує певну функцію. Ось основні з них:
- FROM: задає базовий образ, який буде використаний для створення нового образу.
- MAINTAINER: визначає автора Dockerfile (застаріла, але корисна для інформації).
- RUN: виконує команди в контейнері та створює новий шар.
- COPY: копіює файли і директорії з контексту зборки у файлову систему контейнера.
- ADD: копіює файли і директорії, підтримує витяг архівів і завантаження файлів по URL.
- WORKDIR: задає робочу директорію для наступних команд.
- ENV: встановлює змінні оточення.
- CMD: визначає команду за замовчуванням, яка виконується при запуску контейнера.
- ENTRYPOINT: задає команду, виконувану при запуску контейнера, з можливістю передачі аргументів.
- EXPOSE: вказує порти, які використовує контейнер.
- VOLUME: створює точку монтування для зовнішніх томів.
2.2 Створення Dockerfile
Приклад створення Dockerfile
Давай розберемо простий приклад створення Dockerfile для веб-додатка на Node.js.
Крок 1: Створення базового Dockerfile
Створи файл з ім'ям Dockerfile у кореневій папці свого проекту та додай наступні рядки:
# Використовуємо базовий образ Node.js
FROM node:14
# Встановлюємо робочу директорію
WORKDIR /app
# Копіюємо package.json та package-lock.json
COPY package*.json ./
# Встановлюємо залежності
RUN npm install
# Копіюємо усі файли проєкту
COPY . .
# Вказуємо порт, який буде використовувати додаток
EXPOSE 3000
# Визначаємо команду для запуску додатка
CMD ["node", "app.js"]
Цей Dockerfile виконує наступне:
- FROM node:14: використовує офіційний образ
Node.jsверсії 14 як базовий. - WORKDIR /app: задає робочу директорію для всіх наступних команд.
- COPY package*.json ./: копіює файли
package.jsonіpackage-lock.jsonдо робочої директорії. - RUN npm install: встановлює залежності з файлу
package.json. - COPY . .: копіює всі файли проєкту до робочої директорії контейнера.
- EXPOSE 3000: вказує, що додаток використовуватиме порт 3000.
- CMD ["node", "app.js"]: визначає команду для запуску додатка.
Крок 2: Збірка образу
Після створення Dockerfile збери образ за допомогою команди docker build:
docker build -t my-node-app .
Ця команда створить образ з ім'ям my-node-app, використовуючи Dockerfile з поточної директорії.
Крок 3: Запуск контейнера
Запусти контейнер на основі створеного образу за допомогою команди docker run:
docker run -d -p 3000:3000 my-node-app
Цей приклад запускає контейнер у фоновому режимі, перенаправляючи порт 3000 контейнера на порт 3000 хост-машини. Тепер ти можеш отримати доступ до додатка за адресою http://localhost:3000.
2.3 Додаткові інструкції Dockerfile
1. Встановлення змінних середовища
Ти можеш задати змінні середовища, які будуть доступні у контейнері, використовуючи інструкцію ENV.
ENV NODE_ENV=production
2. Використання декількох команд RUN
Іноді варто об'єднати кілька команд в одну інструкцію RUN, щоб зменшити кількість шарів, зменшити розмір образу і прискорити збірку.
RUN apt-get update && apt-get install -y \
curl \
git \
&& rm -rf /var/lib/apt/lists/*
Корисно! Якщо команда не вміщається на один рядок, можна використовувати символ \, щоб продовжити на наступному рядку. Це буде інтерпретовано як одна команда.
Корисно! Для запису кількох команд в одному рядку можна використовувати &&: command1 && command2 && command3. Це дозволяє послідовно виконати кілька команд.
Оптимізація порядку команд
Для ефективного використання кешу Docker спочатку копіюй файли, які рідко змінюються (наприклад, package.json), і встановлюй залежності, перед тим як додавати інші файли проєкту.
Приклад просунутого Dockerfile
У більш складних проєктах може знадобитися розширений Dockerfile з додатковими налаштуваннями.
# Використовуємо мінімальний базовий образ Node.js
FROM node:14-alpine
# Встановлюємо робочу директорію
WORKDIR /usr/src/app
# Копіюємо package.json і встановлюємо залежності
COPY package*.json ./
RUN npm install --only=production
# Копіюємо вихідний код
COPY . .
# Вказуємо порт для роботи
EXPOSE 8080
# Встановлюємо змінні середовища
ENV NODE_ENV=production
# Запускаємо застосунок
CMD ["node", "server.js"]
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ