Docker для початківців: як запустити веб-сервіс локально

Docker для початківців: як запустити веб-сервіс локально

Docker для початківців виглядає як чергова складна DevOps-технологія, яку «потім розберу». Але реальність простіша: Docker — це спосіб запустити будь-який веб-сервіс однією командою, без конфліктів між версіями Node.js, Python або PostgreSQL на вашій машині. Замість «у мене працює, а в тебе ні» — контейнер, який запускається ідентично на будь-якому комп’ютері.

Нижче — покрокова інструкція: від встановлення Docker до запуску повноцінного веб-додатку з базою даних через docker compose. З прикладами коду, які можна скопіювати і запустити за 10 хвилин.

Зміст

Що таке 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Збирає образ із Dockerfiledocker 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 зберігається на хост-машині незалежно від життєвого циклу контейнера.