DevOps · Урок 33

Docker для бэкенда

«У меня работает!» — и у всех остальных сломается. Docker упаковывает приложение со всеми зависимостями в контейнер: одинаково запускается на ноутбуке, сервере и в CI.

Образы и контейнеры

Образ — готовый «слепок» приложения с зависимостями. Контейнер — запущенный изолированный процесс из этого образа. Сам образ собирается из инструкций Dockerfile.

# Dockerfile (для Node.js-сервера)
FROM node:20-alpine          # базовый образ с Node
WORKDIR /app                 # рабочая папка
COPY package*.json ./        # копируем манифест
RUN npm ci                   # ставим зависимости
COPY . .                     # копируем код проекта
EXPOSE 3000                  # сообщаем порт
CMD ["node", "server.js"]    # команда запуска
docker build -t my-server .   # собрать образ
docker run -p 3000:3000 my-server  # запустить контейнер
ℹ️
Порядок в Dockerfile важен: слои кэшируются. Сначала зависимости (меняются редко — кэш работает), только потом код (меняется часто). Так пересборка занимает секунды, а не минуты.

.dockerignore

Как .gitignore, только для сборки: не тащим в образ node_modules и мусор.

node_modules
dist
.git
*.log

docker compose: несколько контейнеров

Сервер + база данных = два контейнера. docker compose запускает их вместе одной командой.

# docker-compose.yml
services:
  app:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: secret
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:
docker compose up -d        # поднять всё в фоне
docker compose logs -f app  # смотреть логи приложения
docker compose down         # остановить и удалить
⚠️
Пароли в compose — только в учебных целях. В реальности секреты берут из переменных окружения (env / ${VAR}) и секретов-хранилищ, но никогда не коммитят в Git.

Зачем это вам

💡
Попрактикуйтесь на своём Express-сервере из урока 21: оберните его в Dockerfile и поднимите базой через compose. Час практики — и термин «контейнеризация» перестанет пугать.