Docker для початківців виглядає як чергова складна DevOps-технологія, яку «потім розберу». Але реальність простіша: Docker — це спосіб запустити будь-який веб-сервіс однією командою, без конфліктів між версіями Node.js, Python або PostgreSQL на вашій машині. Замість «у мене працює, а в тебе ні» — контейнер, який запускається ідентично на будь-якому комп’ютері.
Нижче — покрокова інструкція: від встановлення Docker до запуску повноцінного веб-додатку з базою даних через docker compose. З прикладами коду, які можна скопіювати і запустити за 10 хвилин.
Зміст
- Що таке Docker і навіщо він розробнику
- Встановлення Docker: Windows, macOS, Linux
- Перший контейнер: docker run за 2 хвилини
- Dockerfile: як контейнеризувати свій проєкт
- Docker Compose: веб-сервіс + база даних
- Таблиця основних команд Docker
- Чеклист: готовність до production
- FAQ
Що таке Docker і навіщо він розробнику-початківцю
Docker — інструмент контейнеризації. Контейнер — це ізольоване середовище, яке містить ваш код, усі залежності та налаштування. На відміну від віртуальної машини, контейнер не емулює окрему ОС — він використовує ядро хостової системи, тому запускається за секунди і споживає мінімум ресурсів.
Три реальні сценарії, де Docker рятує розробника:
- Локальна розробка без конфліктів. Проєкт A потребує Node.js 18, проєкт B — Node.js 20, проєкт C — Python 3.11 + PostgreSQL 15. Без Docker — конфлікти версій, nvm, pyenv, brew-хаос. З Docker — кожен проєкт у своєму контейнері з потрібними версіями.
- Онбординг нового розробника. Замість 2-сторінкової інструкції «встановіть PostgreSQL, Redis, Elasticsearch, налаштуйте змінні оточення» — одна команда:
docker compose up. Новий розробник починає писати код за 15 хвилин замість 2 годин. - Ідентичність середовищ. Dev, staging, production — один і той самий контейнер. Баг, який відтворюється на staging, відтворюється і локально. Без Docker — «у мене працює» стає мемом команди.
Встановлення Docker: Windows, macOS, Linux
Docker Desktop — офіційний додаток для Windows і macOS, який включає Docker Engine, Docker CLI, Docker Compose і Kubernetes (опціонально). На Linux Docker Engine встановлюється через пакетний менеджер.
Покрокове встановлення
- Windows 10/11: завантажте Docker Desktop із docker.com/products/docker-desktop. Вимоги: WSL 2 увімкнений (Docker запропонує встановити автоматично). Після інсталяції — перезавантаження. Перевірка:
docker --versionу PowerShell або Terminal. - macOS (Apple Silicon / Intel): завантажте Docker Desktop для вашої архітектури. Drag-and-drop у Applications. Запустіть Docker Desktop, дочекайтеся іконки кита в меню-барі. Перевірка:
docker --versionу Terminal. - Ubuntu/Debian:
sudo apt update && sudo apt install docker.io docker-compose-v2. Додайте свого користувача до групи docker:sudo usermod -aG docker $USER, перелогіньтеся. Перевірка:docker run hello-world.
Після встановлення виконайте docker run hello-world. Якщо побачили «Hello from Docker!» — все готово. Якщо ні — перевірте, чи запущений Docker daemon (іконка Docker Desktop має бути зеленою).
Перший контейнер: docker run за 2 хвилини
Запустімо Nginx — веб-сервер — одною командою. Це покаже основну механіку Docker: pull образу, створення контейнера, маппінг портів.
docker run -d -p 8080:80 --name my-nginx nginx:latest
Що відбувається: Docker завантажує образ nginx:latest із Docker Hub (якщо ще не завантажений), створює контейнер із іменем my-nginx, прокидає порт 8080 вашої машини на порт 80 контейнера, запускає у фоновому режимі (-d). Відкрийте http://localhost:8080 — побачите сторінку «Welcome to nginx!».
Щоб зупинити: docker stop my-nginx. Щоб видалити: docker rm my-nginx. Щоб подивитися логи: docker logs my-nginx.
Dockerfile: як контейнеризувати свій проєкт
Docker для початківців стає по-справжньому корисним, коли ви контейнеризуєте власний додаток. Dockerfile — текстовий файл із інструкціями, як зібрати образ вашого проєкту.
Приклад Dockerfile для Node.js додатку
# Базовий образ
FROM node:20-alpine
# Робоча директорія в контейнері
WORKDIR /app
# Копіюємо package.json і встановлюємо залежності
COPY package*.json ./
RUN npm ci --only=production
# Копіюємо решту коду
COPY . .
# Порт, на якому працює додаток
EXPOSE 3000
# Команда запуску
CMD ["node", "server.js"]
Розберемо рядок за рядком. FROM node:20-alpine — базовий образ із Node.js 20 на Alpine Linux (мінімальний розмір, ~50 MB замість ~300 MB для повного debian-based). WORKDIR /app — усі наступні команди виконуються в /app. COPY package*.json перед COPY . . — хитрість для кешування: якщо package.json не змінився, npm ci не перезапускається при ребілді.
Збираємо образ: docker build -t my-app:1.0 . (крапка — поточна директорія). Запускаємо: docker run -d -p 3000:3000 my-app:1.0.
Приклад Dockerfile для Python/Flask
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
Принцип той самий: спочатку залежності (requirements.txt), потім код. --no-cache-dir зменшує розмір образу, прибираючи кеш pip. Для production-додатків замініть CMD ["python", "app.py"] на CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app"] — запуск через WSGI-сервер.
Docker Compose: веб-сервіс + база даних одною командою
Реальний додаток рідко працює сам — йому потрібна база даних, Redis для кешу, можливо Elasticsearch. Docker Compose дозволяє описати всі сервіси в одному файлі docker-compose.yml і запустити їх однією командою.
Приклад: Node.js + PostgreSQL + Redis
version: "3.9"
services:
app:
build: .
ports:
- "3000:3000"
environment:
DATABASE_URL: postgres://user:password@db:5432/mydb
REDIS_URL: redis://cache:6379
depends_on:
- db
- cache
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- pgdata:/var/lib/postgresql/data
ports:
- "5432:5432"
cache:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
pgdata:
Запуск: docker compose up -d. Ця одна команда збирає ваш додаток (build: .), запускає PostgreSQL 16 і Redis 7, зв’язує їх через внутрішню мережу Docker (сервіс db доступний за hostname db), зберігає дані PostgreSQL у volume pgdata (дані переживають перезапуск контейнера).
Зупинка: docker compose down. Зупинка з видаленням даних: docker compose down -v (видаляє volumes). Перебілд після зміни коду: docker compose up -d --build.
Для моніторингу webhook-подій від вашого додатку в контейнері використовуйте логування webhook — це спростить дебаг інтеграцій із платіжними системами та зовнішніми API.
Таблиця основних команд Docker
Мінімальний набір команд, який покриває 90% щоденної роботи з Docker.
| Команда | Що робить | Приклад |
|---|---|---|
| docker run | Створює і запускає контейнер | docker run -d -p 8080:80 nginx |
| docker build | Збирає образ із Dockerfile | docker build -t my-app:1.0 . |
| docker ps | Список запущених контейнерів | docker ps -a (усі, включно зі зупиненими) |
| docker logs | Логи контейнера | docker logs -f my-app (follow) |
| docker exec | Виконує команду в контейнері | docker exec -it my-app sh |
| Команда | Що робить | Приклад |
|---|---|---|
| docker stop | Зупиняє контейнер | docker stop my-app |
| docker rm | Видаляє контейнер | docker rm my-app |
| docker images | Список локальних образів | docker images |
| docker compose up | Запускає всі сервіси | docker compose up -d –build |
| docker compose down | Зупиняє і видаляє сервіси | docker compose down -v |
Чеклист: від локальної розробки до production-ready
Коли ваш Docker-проєкт працює локально — перевірте ці пункти перед деплоєм.
- Dockerfile використовує alpine-based або slim-based образ (мінімальний розмір).
- Залежності встановлюються окремим шаром (COPY package.json перед COPY . .) для кешування.
- У .dockerignore додані node_modules, .git, .env, logs — не потрапляють в образ.
- Контейнер запускається від non-root користувача (USER node або USER appuser).
- Змінні оточення (DB passwords, API keys) передаються через environment або .env файл, не хардкодяться в Dockerfile.
- Volumes налаштовані для персистентних даних (бази даних, uploads).
- Health check додано: HEALTHCHECK CMD curl -f http://localhost:3000/health || exit 1.
- Образ протестований командою
docker compose upна чистій машині (не тільки на вашому ноутбуці).
Для деплою контейнеризованого додатку на production потрібен хостинг із підтримкою Docker. Якщо ваш проєкт на WordPress — подивіться як обрати хостинг із Docker-сумісністю. Для захисту production-контейнерів від атак — налаштуйте WAF і rate limiting. А CDN для роздачі статики — через Cloudflare.
FAQ
Чим Docker відрізняється від віртуальної машини?
Docker-контейнер ділить ядро ОС із хостом і запускається за секунди, споживаючи 50–200 MB RAM. Віртуальна машина емулює повну ОС, запускається за хвилини і споживає 1–4 GB RAM. Для локальної розробки Docker — на порядок ефективніший. VM потрібні для ізоляції на рівні ОС (безпека, різні ОС).
Чи потрібен Docker для фронтенд-розробки?
Для чистого фронтенду (React/Vue без backend) — опціонально. Docker стає необхідним, коли фронтенд залежить від backend-сервісів: API, база даних, auth-сервіс. Docker Compose дозволяє запустити весь стек одною командою замість «спочатку запусти API, потім базу, потім Redis».
Docker Desktop платний чи безкоштовний?
Docker Desktop безкоштовний для персонального використання, освіти та невеликих компаній (до 250 працівників і до $10M annual revenue). Для більших компаній — платна підписка: Pro ($5/міс), Team ($7/user/міс), Business ($24/user/міс). Docker Engine на Linux — повністю безкоштовний і open-source.
Як зменшити розмір Docker-образу?
Три кроки: використовуйте alpine або slim базові образи (node:20-alpine замість node:20), додайте .dockerignore (виключає node_modules, .git, тести), застосуйте multi-stage builds (перший stage — збірка, другий — тільки runtime з готовими файлами). Типовий Node.js-образ зменшується з 1 GB до 100–150 MB.
Де зберігаються дані бази даних у Docker?
За замовчуванням — всередині контейнера. При видаленні контейнера (docker rm) дані зникають. Рішення: Docker Volumes (volumes: - pgdata:/var/lib/postgresql/data у docker-compose.yml). Volume зберігається на хост-машині незалежно від життєвого циклу контейнера.