Основи Dockerfile: визначення та створення контейнеризованих додатків

watch 59s
views 2

12:49, 29.05.2026

Зміст статті
arrow

  • Вступ до Dockerfile 
  • Основні інструкції, що використовуються в Dockerfile 
  • Приклад робочого процесу: написання та застосування Dockerfile
  • Кроки для створення вашого Dockerfile 
  • Опції, доступні під час побудови Docker 
  • Запуск та використання створеного образу 
  • Рекомендовані практики щодо Dockerfile 
  • 1. Уникайте використання тегу `latest` для базових образів 
  • 2. Вибирайте базові образи тільки з надійних джерел 
  • 3. Впровадьте HEALTHCHECK для моніторингу стану контейнера 
  • 4. Налаштуйте ENTRYPOINT та CMD належним чином 
  • 5. Ніколи не зберігайте секретні дані безпосередньо в образах 
  • 6. Додавайте мітки для впорядкування та відстеження ваших образів 
  • 7. Запускайте контейнери, використовуючи користувача, що не є root 
  • 8. Використовуйте `.dockerignore` для прискорення процесу побудови 
  • 9. Оптимізуйте розмір образу, коли це можливо 
  • 10. Використовуйте лінтери та сканери вразливостей для безпеки 
  • Підсумок основних висновків

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

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

Вступ до Dockerfile 

Dockerfile містять інструкції у вигляді тексту, необхідні для побудови образу контейнера. Щоб обробити всі інструкції у файлі для складання образу, слід використати таку команду:

docker build

Після використання цієї команди всі інструкції обробляються послідовно. Якщо рядок починається з #, це не команда, а коментар або тлумачення команди. Аргументи в рядках можна розділяти за допомогою зворотної косої риски.

Основні інструкції, що використовуються в Dockerfile 

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

  • FROM зазвичай знаходиться на початку файлу і є основою для побудови.
  • COPY потрібна для додавання папок/файлів до файлової системи. Процес копіювання відбувається між образом та хостом Docker.
  • ADD працює аналогічно до вищезгаданої інструкції, але також підтримує розпакування архівів та URL-адреси файлів. Використання ADD може спростити деякі завдання. Наприклад, архівні файли розпаковуються в контейнері, а не просто копіюються.
  • RUN використовується для виконання команди в образі. Це означає, що створюється новий шар образу з деякими необхідними змінами. Зазвичай ця команда необхідна для налаштування та встановлення додаткових пакетів.
  • ENV – необхідна для налаштування середовища.  

Приклад робочого процесу: написання та застосування Dockerfile

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

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

import { v4 as uuid } from "uuid";
 
console.log("Hello World");
console.log(`Your ID is ${uuid()}`);
Потім додайте пакет до проектів наступним чином:
$ npm install uuid

Наступним кроком буде додавання наступних інструкцій та їх збереження у файлі Dockerfile:

FROM node:16
WORKDIR /app
 
COPY package.json .
COPY package-lock.json .
RUN npm install
 
COPY main.js .
 
ENTRYPOINT ["node"]
CMD ["main.js"]

Спробуємо пояснити деякі деталі коду:

  • node:16 – офіційний образ, який використовується як основа.
  • WORKDIR – у цій частині каталог змінюється на /app.
  • COPY використовується для додавання 2 файлів з каталогу хоста до робочого каталогу всередині контейнера.
  • npm install – використовується для встановлення у файловій системі контейнера з метою завантаження залежностей.
  • COPY main.js – вихідний код копіюється до контейнера.

Кроки для створення вашого Dockerfile 

На цьому етапі ви можете розпочати створення образу з Dockerfile за допомогою наступної команди:

$ docker build -t demo-image:latest .

Після створення образу ви побачите інструкції в терміналі.

Опції, доступні під час побудови Docker 

Використовуючи docker build команду, ви вказуєте шляхи, на які посилаєтеся у файлі. Шляхи поза контекстом не будуть помітні для більшості інструкцій.

Docker автоматично перевіряє інструкції відповідно до робочого каталогу, але можна вказати інший файл за допомогою -f, як показано нижче:

docker build -f dockerfiles/app.dockerfile -t demo-image:latest -t demo-image:v1.0 .

Запуск та використання створеного образу 

Щоб запустити створений образ, скористайтеся наступним:

docker run demo-image:latest node main.js

Рекомендовані практики щодо Dockerfile 

Написання Dockerfile вважається досить простим завданням, але слід врахувати деякі рекомендації для покращення продуктивності, зручності використання та рівня безпеки.

1. Уникайте використання тегу `latest` для базових образів 

В інструкції FROM краще уникати використання «latest», оскільки це може призвести до деяких непередбачених змін. Більшість авторів образів відразу використовують останню версію. Під час перекомпіляції образу це може непомітно спровокувати використання іншої версії, що спричинить певні проблеми.

Тому краще бути більш конкретним і вказати node:16.

2. Вибирайте базові образи тільки з надійних джерел 

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

3. Впровадьте HEALTHCHECK для моніторингу стану контейнера 

Дуже важливо моніторити стан контейнера. Це можна зробити за допомогою оркестраторів, таких як Kubernetes, щоб проблемні контейнери можна було автоматично перезапустити.

HEALTHCHECK слід додати до Dockerfile, щоб команда запускалася всередині та перевіряла, чи все працює належним чином:

HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD curl -f http://localhost || exit 1

Стан контейнерів можна перевірити за допомогою команди ps.

4. Налаштуйте ENTRYPOINT та CMD належним чином 

Інструкції CMD та ENTRYPOINT є дещо схожими. CMD надає аргументи за замовчуванням, а ENTRYPOINT запускає цей процес. Аргументи в CMD можна налаштувати під час запуску контейнерів за допомогою docker run.

5. Ніколи не зберігайте секретні дані безпосередньо в образах 

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

Також краще використовувати змінні середовища, а не значення за замовчуванням у Dockerfile. Це допоможе мінімізувати деякі ризики безпеки.

6. Додавайте мітки для впорядкування та відстеження ваших образів 

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

LABEL com.sample.team=backend

7. Запускайте контейнери, використовуючи користувача, що не є root 

Згідно з характеристиками за замовчуванням, контейнери працюють як користувач root. Це може спричинити певні ризики безпеки, оскільки хакери можуть увійти в контейнер і виконати деякі команди на хості.

Цю проблему можна вирішити, додавши інструкцію USER до файлу Dockerfile. Найкраща рекомендація тут — використовувати користувачів, що не є root, для всіх файлів.

USER demo-app
USER 1000
USER demo-app:demo-group

8. Використовуйте `.dockerignore` для прискорення процесу побудови 

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

Використовуйте файл dockerignore у каталозі, щоб виключити непотрібні каталоги/файли.

9. Оптимізуйте розмір образу, коли це можливо 

Образи можуть стати надзвичайно великими, і це безпосередньо впливає на час побудови. Щоб оптимізувати розмір образу, рекомендується використовувати лише необхідні пакети та виключити все інше. Також краще використовувати компактний базовий образ, якщо це можливо. Наприклад, Alpine Linux замість Ubuntu.

10. Використовуйте лінтери та сканери вразливостей для безпеки 

Файли Dockerfile можуть містити помилки, які можуть призвести до серйозних проблем або несподіваної поведінки. Для перевірки можливих проблем можна використовувати лінтери, такі як Hadolint.

Щоб запустити його, використовуйте таку команду:

$ docker run --rm -i hadolint/hadolint < Dockerfile

Також рекомендується використовувати такі сканери, як Trivy, які допоможуть виявити застарілі пакети. Спробуйте використовувати його перед розгортанням, щоб мінімізувати деякі ризики.

Підсумок основних висновків

Docker — надзвичайно популярна технологія, яка безпосередньо впливає на доставку програмного забезпечення завдяки використанню контейнерів, що ідеально працюють у різних середовищах. Для правильного використання Docker необхідно написати файл Dockerfile, що містить усі необхідні інструкції. Ці інструкції визначаються специфікацією образів OCI і створюють образи, необхідні для середовища виконання контейнерів, сумісного з OCI.

Поділитися

Чи була ця стаття корисною для вас?

Популярні пропозиції VPS

-9.3%

CPU
CPU
6 Xeon Cores
RAM
RAM
16 GB
Space
Space
150 GB SSD
Bandwidth
Bandwidth
Unlimited
wKVM-SSD 16384 Windows

53.99

При оплаті за рік

-10%

CPU
CPU
4 Xeon Cores
RAM
RAM
2 GB
Space
Space
60 GB HDD
Bandwidth
Bandwidth
300 Gb
KVM-HDD HK 2048 Linux

6.28

При оплаті за рік

-20.6%

CPU
CPU
6 Xeon Cores
RAM
RAM
8GB
Space
Space
100GB SSD
Bandwidth
Bandwidth
500GB
KVM-SSD 8192 HK Linux

59

При оплаті за рік

-10%

CPU
CPU
3 Xeon Cores
RAM
RAM
1 GB
Space
Space
40 GB HDD
Bandwidth
Bandwidth
300 Gb
KVM-HDD HK 1024 Linux

4.98

При оплаті за рік

-10%

CPU
CPU
8 Xeon Cores
RAM
RAM
32 GB
Space
Space
200 GB SSD
Bandwidth
Bandwidth
12 TB
KVM-SSD 32768 Metered Linux

150

При оплаті за рік

-7.9%

CPU
CPU
6 Xeon Cores
RAM
RAM
8 GB
Space
Space
200 GB HDD
Bandwidth
Bandwidth
300 Gb
wKVM-HDD HK 8192 Windows

25.99

При оплаті за рік

-10%

CPU
CPU
4 Xeon Cores
RAM
RAM
2 GB
Space
Space
60 GB HDD
Bandwidth
Bandwidth
Unlimited
KVM-HDD 2048 Linux

7.7

При оплаті за рік

-20.5%

CPU
CPU
6 Xeon Cores
RAM
RAM
8 GB
Space
Space
100 GB SSD
Bandwidth
Bandwidth
8 TB
KVM-SSD 8192 Metered Linux

57

При оплаті за рік

-15.3%

CPU
CPU
4 Xeon Cores
RAM
RAM
2 GB
Space
Space
75 GB SSD
Bandwidth
Bandwidth
40 Mbps
DDoS Protected SSD-wKVM 2048 Windows

54

При оплаті за рік

-15.6%

CPU
CPU
2 Xeon Cores
RAM
RAM
512 MB
Space
Space
10 GB SSD
Bandwidth
Bandwidth
1 TB
KVM-SSD 512 Metered Linux

5.33

При оплаті за рік

Інші статті на цю тему

cookie

Чи приймаєте ви файли cookie та політику конфіденційності?

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