JavaRush /Курси /Модуль 2: Fullstack /Dockerfile: створення та структура файлу

Dockerfile: створення та структура файлу

Модуль 2: Fullstack
Рівень 13 , Лекція 1
Відкрита

2.1 Основні концепції Dockerfile

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

Основні концепції Dockerfile:

  1. Ідемпотентність: команди в Dockerfile повинні бути ідемпотентними — їх повторне виконання дає один і той самий результат.
  2. Послідовність: команди виконуються послідовно зверху вниз. Порядок має значення, адже кожна команда створює новий шар образу.
  3. Шарова структура: практично кожна інструкція додає новий шар до образу. Ці шари кешуються, що дозволяє оптимізувати процес зборки.

Структура Dockerfile:

Dockerfile складається з інструкцій, кожна з яких виконує певну функцію. Ось основні з них:

  1. FROM: задає базовий образ, який буде використаний для створення нового образу.
  2. MAINTAINER: визначає автора Dockerfile (застаріла, але корисна для інформації).
  3. RUN: виконує команди в контейнері та створює новий шар.
  4. COPY: копіює файли і директорії з контексту зборки у файлову систему контейнера.
  5. ADD: копіює файли і директорії, підтримує витяг архівів і завантаження файлів по URL.
  6. WORKDIR: задає робочу директорію для наступних команд.
  7. ENV: встановлює змінні оточення.
  8. CMD: визначає команду за замовчуванням, яка виконується при запуску контейнера.
  9. ENTRYPOINT: задає команду, виконувану при запуску контейнера, з можливістю передачі аргументів.
  10. EXPOSE: вказує порти, які використовує контейнер.
  11. VOLUME: створює точку монтування для зовнішніх томів.

2.2 Створення Dockerfile

Приклад створення Dockerfile

Давай розберемо простий приклад створення Dockerfile для веб-додатка на Node.js.

Крок 1: Створення базового Dockerfile

Створи файл з ім'ям 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 виконує наступне:

  1. FROM node:14: використовує офіційний образ Node.js версії 14 як базовий.
  2. WORKDIR /app: задає робочу директорію для всіх наступних команд.
  3. COPY package*.json ./: копіює файли package.json і package-lock.json до робочої директорії.
  4. RUN npm install: встановлює залежності з файлу package.json.
  5. COPY . .: копіює всі файли проєкту до робочої директорії контейнера.
  6. EXPOSE 3000: вказує, що додаток використовуватиме порт 3000.
  7. CMD ["node", "app.js"]: визначає команду для запуску додатка.

Крок 2: Збірка образу

Після створення Dockerfile збери образ за допомогою команди docker build:

Terminal

docker build -t my-node-app .

Ця команда створить образ з ім'ям my-node-app, використовуючи Dockerfile з поточної директорії.

Крок 3: Запуск контейнера

Запусти контейнер на основі створеного образу за допомогою команди docker run:

Terminal

docker run -d -p 3000:3000 my-node-app

Цей приклад запускає контейнер у фоновому режимі, перенаправляючи порт 3000 контейнера на порт 3000 хост-машини. Тепер ти можеш отримати доступ до додатка за адресою http://localhost:3000.

2.3 Додаткові інструкції Dockerfile

1. Встановлення змінних середовища

Ти можеш задати змінні середовища, які будуть доступні у контейнері, використовуючи інструкцію ENV.

dockerfile

ENV NODE_ENV=production

2. Використання декількох команд RUN

Іноді варто об'єднати кілька команд в одну інструкцію RUN, щоб зменшити кількість шарів, зменшити розмір образу і прискорити збірку.

dockerfile

RUN apt-get update && apt-get install -y \
  curl \
  git \
  && rm -rf /var/lib/apt/lists/*

Корисно! Якщо команда не вміщається на один рядок, можна використовувати символ \, щоб продовжити на наступному рядку. Це буде інтерпретовано як одна команда.

Корисно! Для запису кількох команд в одному рядку можна використовувати &&: command1 && command2 && command3. Це дозволяє послідовно виконати кілька команд.

Оптимізація порядку команд

Для ефективного використання кешу Docker спочатку копіюй файли, які рідко змінюються (наприклад, package.json), і встановлюй залежності, перед тим як додавати інші файли проєкту.

Приклад просунутого Dockerfile

У більш складних проєктах може знадобитися розширений 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"]
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ