Docker — це потужний інструмент для створення, розгортання та управління контейнерами, який став стандартом де-факто в індустрії розробки програмного забезпечення. Одним з ключових елементів Docker є Dockerfile — текстовий файл, що містить інструкції для створення образу Docker. Розуміння Dockerfile та вміння його правильно використовувати — це основа для ефективного використання Docker.
Що таке Dockerfile?
Dockerfile — це сценарій, який містить набір команд і інструкцій для створення Docker-образу. Docker-образ, у свою чергу, є незмінним шаблоном, який включає в себе все необхідне для запуску контейнера: операційну систему, бібліотеки, залежності та саме застосування.
Основні інструкції Dockerfile
Для початку розглянемо основні інструкції, які використовуються в Dockerfile:
FROM: Ця інструкція задає базовий образ, на основі якого буде створюватися новий образ. Наприклад, FROM ubuntu:20.04 вказує, що базовим образом буде Ubuntu 20.04.
RUN: Використовується для виконання команд у контейнері. Зазвичай використовується для встановлення пакетів і виконання інших операцій, необхідних для підготовки середовища.
CMD: Визначає команду, яка буде виконана при запуску контейнера. На відміну від RUN, ця команда не виконується при зборці образу, а тільки при запуску контейнера.
ENTRYPOINT: Дозволяє задати команду, яка завжди буде виконуватися при запуску контейнера. Може бути переопределена при запуску контейнера за допомогою параметрів командного рядка.
COPY і ADD: Ці інструкції використовуються для копіювання файлів і директорій з локальної файлової системи в файлову систему образу. COPY виконує просте копіювання, а ADD може додатково розархівувати файли та завантажувати їх за URL.
ENV: Встановлює змінні середовища всередині контейнера.
EXPOSE: Вказує, які порти будуть відкриті в контейнері для зовнішнього доступу.
VOLUME: Створює точку монтування для роботи з постійним сховищем.
WORKDIR: Встановлює робочу директорію для всіх наступних інструкцій.
Приклад Dockerfile
Розглянемо простий приклад Dockerfile для Node.js застосунку:
# Вказуємо базовий образ
FROM node:14
# Встановлюємо робочу директорію
WORKDIR /app
# Копіюємо package.json і package-lock.json
COPY package*.json ./
# Встановлюємо залежності
RUN npm install
# Копіюємо вихідний код застосунку
COPY . .
# Вказуємо порт
EXPOSE 3000
# Визначаємо команду для запуску застосунку
CMD ["npm", "start"]
Детальний розбір Dockerfile:
FROM node:14 — Вказує, що базовим образом буде офіційне Node.js зображення версії 14. Це означає, що в наш образ будуть включені всі необхідні для роботи Node.js залежності.
WORKDIR /app — Встановлює робочу директорію /app, куди будуть копіюватися файли і виконуватися команди.
COPY package.json ./* — Копіює файли package.json і package-lock.json в робочу директорію контейнера. Ці файли містять інформацію про залежності застосунку.
RUN npm install — Виконує установку залежностей, вказаних у package.json.
COPY . . — Копіює всі файли і папки з поточної директорії (де знаходиться Dockerfile) в робочу директорію контейнера.
EXPOSE 3000 — Вказує, що контейнер буде прослуховувати порт 3000.
CMD ["node", "app.js"] — Визначає команду для запуску застосунку. У даному випадку це запуск файлу app.js за допомогою Node.js.
Створіть файл app.js з наступним вмістом, або використовуйте власний:
// app.js
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello, World!');
});
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});
Створіть файл package.json з наступним вмістом:
{
"name": "my-node-app",
"version": "1.0.0",
"description": "A simple Node.js app with Express",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"express": "^4.17.1"
}
}
Використання Dockerfile
Тепер, коли ми розглянули основні інструкції і розглянули приклад Dockerfile, перейдемо до практичного використання. Для створення образу Docker і запуску контейнера необхідно виконати кілька команд у терміналі.
Переконайтеся, що файли app.js, package.json і Dockerfile знаходяться в одній директорії. Потім створіть образ.
Створення образу:
docker build -t my-node-app .
Тут -t my-node-app вказує ім'я образу, а . вказує, що Dockerfile знаходиться в поточній директорії.
Запуск контейнера:
docker run -p 3000:3000 my-node-app
Команда docker run запускає контейнер на основі створеного образу. Параметр -p 3000:3000 вказує, що порт 3000 на хост-машині буде перенаправлений на порт 3000 в контейнері. Ваш сервер повинен успішно запуститися, і ви зможете отримати доступ до нього, відкривши в браузері http://localhost:3000. Де побачите банальне привітання "Hello, World!".
Висновок
Dockerfile — це потужний інструмент для автоматизації та стандартизації процесу створення Docker-образів. Розуміння основних інструкцій і принципів роботи з Dockerfile дозволяє розробникам ефективно управляти середовищами і розгортати застосунки в контейнерах. Важно пам'ятати, що Dockerfile повинен бути оптимізованим і містити тільки необхідні команди для мінімізації розміру образу та підвищення продуктивності контейнерів.