Установка Docker

Windows

Скачайте Docker Desktop с

. Включите WSL 2 при установке.

macOS

brew install --cask docker

Linux

sudo apt update
sudo apt install docker.io docker-compose-plugin
sudo usermod -aG docker $USER

Перелогиньтесь для применения групп.

Проверка

docker --version
docker compose version

Базовый docker-compose.yml

Создайте файл docker-compose.yml в корне проекта:

services:
  app:
    build: .
    ports:
      - "3000:3000"
    volumes:
      - .:/app
      - /app/node_modules
    environment:
      - NODE_ENV=development
      - DB_HOST=db
      - DB_PORT=5432
      - DB_NAME=myapp
      - DB_USER=admin
      - DB_PASS=secret
    depends_on:
      - db
      - redis

  db:
    image: postgres:16-alpine
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB=myapp
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=secret
    volumes:
      - pgdata:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  pgdata:

Запуск и управление

docker compose up -d
docker compose logs -f app
docker compose ps
docker compose down
docker compose down -v
docker compose build
docker compose up -d --build

Флаг -d — detached mode (в фоне). down -v удалит и volumes (данные PostgreSQL!).

Бинд-маунт для разработки

volumes:
  - .:/app
  - /app/node_modules

Строка /app/node_modules без пути слева создаёт анонимный volume, предотвращая перезапись зависимостей.

Named volume для данных

volumes:
  - pgdata:/var/lib/postgresql/data

Named volumes сохраняются между перезапусками.

Переменные окружения через .env

Создайте .env в корне проекта:

DB_USER=admin
DB_PASS=secret
DB_NAME=myapp

В docker-compose.yml:

services:
  db:
    image: postgres:16-alpine
    env_file:
      - .env
    environment:
      - POSTGRES_USER=${DB_USER}
      - POSTGRES_PASSWORD=${DB_PASS}
      - POSTGRES_DB=${DB_NAME}

Не коммитьте .env в Git.

Зависимости с healthcheck

services:
  app:
    depends_on:
      db:
        condition: service_healthy
  db:
    image: postgres:16-alpine
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U admin"]
      interval: 5s
      timeout: 5s
      retries: 5

Полезные команды

docker compose exec app bash
docker compose exec db psql -U admin myapp
docker compose restart app
docker image prune -a

Разработка с hot-reload

Для Node.js добавьте в package.json:

"scripts": {
  "dev": "nodemon --watch . --ext js,json server.js"
}

Запускайте npm run dev в контейнере.