Dockerfile -> ContainerЩоб запустити додаток в контейнері, спочатку нам потрібно описати Dockerfile. Dockerfile - це текстовий файл, який містить інструкції для створення Docker Image. Він працює як рецепт, що визначає, які компоненти необхідно встановити та які команди виконати, щоб підготувати додаток до запуску.
🔺 У Dockerfile використовується концепція шарів (лєєрів). Кожен шар додається поверх попереднього і може включати різні інструкції
FROM - вказує базовий образ (наприклад,
ubuntu
), з якого починається створення образу.
RUN - виконує команди, наприклад, встановлення бібліотек і пакетів.
COPY/ADD - копіює файли з хоста в образ, наприклад, додавання вихідного коду програми.
CMD/ENTRYPOINT - визначає команду або сценарій, який повинен виконуватися, коли контейнер запущений.
WORKDIR - встановлює робочий каталог для команд RUN, CMD, ENTRYPOINT, COPY та ADD.
ENV - встановлює змінні середовища, які будуть доступні під час виконання контейнера.
EXPOSE - вказує, який порт буде використовувати контейнер для взаємодії з зовнішнім світом.
VOLUME - створює точку монтування для зовнішніх томів.
Всі командами Dockerfile, можна знайти в офіційній документації Docker -
Dockerfile reference.
🔺 Всі ці шари (лєєри) утворюють так звану RootFS (root file system). RootFS - це сукупність усіх шарів, яка формує файлову систему, необхідну для запуску контейнера. Вона включає все необхідне середовище, залежності і файли додатку.
🔺Концепція леєрів забезпечує дуже важливий механізм -
кешування шарів (layers caching) для оптимізації процесу побудови Docker Image. Коли ви змінюєте Dockerfile і запускаєте команду docker build, Docker перевіряє, чи використовуються ті ж самі інструкції та чи були змінені шари. Якщо шари не змінювалися, Docker використовує кешовані версії цих шарів замість їх повторної побудови. Це оптимізація як і за часом та і по ресурсам.
🔺 І тепер, коли в нас є готовий Image, ми можемо запустити на його основі контейнер. Контейнер - це, простими словами, ізольований запущений процес. Docker забезпечує ізоляцію за допомогою функцій ядра операційної системи, таких як cgroups (control groups) і namespaces. Cgroups обмежують ресурси, які може використовувати контейнер (CPU, пам’ять), а namespaces створюють ізольоване середовище для кожного контейнера, так що вони не можуть взаємодіяти один з одним або з хост-системою.
Route 53 🫥