Що таке Docker і чому розробникам його варто вивчати?
Практичний розбір Docker для розробників: контейнери проти VM, основні команди, Dockerfile та як почати його використовувати в реальних проектах.
Docker постійно з'являється в оголошеннях про роботу та посібниках налаштування, і якщо ви ніколи не працювали з контейнерами, це може здаватися стіною, яку потрібно подолати, перш ніж писати реальний код. Це не так складно, коли розберетеся з термінологією.
Що насправді таке контейнер
Контейнер упаковує вашу програму зі всім, що їй потрібно для запуску: код, runtime, системні бібліотеки та файли конфігурації. Це не віртуальна машина. VM віртуалізує цілу операційну систему, включаючи ядро, тому запуск однієї може займати хвилину та споживати кілька гігабайтів RAM. Контейнер використовує ядро хост-машини та ізолює лише процес, тому він запускається менш ніж за секунду і зазвичай використовує десятки мегабайтів замість гігабайтів.
Ця різниця — причина, чому Docker так швидко заволодів локальною розробкою та CI конвеєрами. Ви можете запустити базу даних Postgres, кеш Redis та ваш серверний додаток на одному ноутбуці без прямого встановлення їх на вашу ОС.
Основні компоненти, які потрібно знати
Є чотири терміни, які охоплюють більшість того, з чим ви стикатиметеся щодня:
- Image: шаблон, доступний лише для читання, побудований з Dockerfile. Можна розглядати його як снімок файлової системи плюс метаінформація про те, як його запустити.
- Container: запущений екземпляр образу. Ви можете запускати, зупиняти та видаляти контейнери без впливу на образ, з якого вони були створені.
- Dockerfile: текстовий файл з інструкціями для побудови образу, рядок за рядком.
- Registry: місце, де зберігаються та отримуються образи, найчастіше Docker Hub.
Мінімальний Dockerfile для додатку Node.js виглядає так:
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Побудуйте його за допомогою docker build -t my-app . та запустіть за допомогою docker run -p 3000:3000 my-app. Флаг -p映射 порт на вашій машині на порт всередину контейнера, саме так ви можете дістатися до додатку з браузера.
Команди, які ви будете використовувати постійно
Декілька команд охоплюють більшість повсякденної роботи:
docker ps— перелічити запущені контейнериdocker ps -a— перелічити всі контейнери, включаючи зупиненіdocker images— перелічити образи на вашій машиніdocker logs <container>— перевірити вихід від запущеного або збійного контейнераdocker exec -it <container> sh— відкрити оболонку всередину запущеного контейнераdocker rm/docker rmi— очистити контейнери та образи, які вам більше не потрібні
Ця остання пара важливіша, ніж люди очікують. Docker з задоволенням дозволить дисковому простору зникнути в старих образах та зупинених контейнерах. Періодичне запущення docker system prune звільняє неймовірну кількість місця.
Чому docker-compose змінює робочий процес
Більшість реальних проектів потребують більше одного контейнера: серверного додатку, бази даних, можливо, кешу. Написання команд docker run для кожного стає нудним досить швидко. docker-compose.yml дозволяє визначити весь стек в одному файлі:
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: devpassword
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
Запустіть docker compose up і обидві служби запускаються разом, з'єднані в мережу, тому web може досягти db за назвою служби. Це налаштування, яке ви побачите в README майже кожного репозиторію з відкритим кодом, і розуміння його означає, що ви можете клонувати проект та мати його запущеним за кілька хвилин замість ручного встановлення Postgres, Redis та чого б там ще потребував додаток.
Де люди спотикаються на початку
Volume бентежить майже всіх спочатку. Без volume все, що написано всередину контейнера, зникає при видаленні контейнера, що є проблемою для баз даних. Секція volumes у файлі compose вище映射 іменований том до шляху всередину контейнера, щоб дані вижили перезапуск.
Линший поширена помилка — копіювання node_modules або .git в образ через відсутність файлу .dockerignore. Додайте його як .gitignore:
node_modules
.git
.env
Це прискорює збірки та зменшує образи, що важливо, коли ви надсилаєте образи до реєстру або розгортаєте на Kubernetes.
Куди йти після основ
Коли побудова та запуск контейнерів стане звичайною справою, наступні корисні навички — це багатостадійні збірки для менших виробничих образів, розуміння режимів мережі Docker та читання виводу docker inspect, коли щось неправильно з'єднується. Нічого з цього не важко, це просто незнайомо в перший раз.
Для більшої інформації про контейнеризацію реальних додатків та їх підключення до хмарних конвеєрів розгортання, перегляньте розділи DevOps та Cloud на Korra Studio.
Написано з допомогою штучного інтелекту, перевірено та опубліковано Мішалем Пільчем (CISSP), Korra Studio.
Це одна замітка з бази знань Korra Studio — платформа поєднує кожну тему з 1-на-1 менторингом.
Початок безплатноarrow_forward