⚖️ Старый vs Новый: Docker Compose v1 → v2

Паттерны из лекции (2021–2022) и их современные эквиваленты (2024+)

⚡ Главные устаревшие паттерны

  • docker-compose up (с дефисом) → docker compose up (v2, встроен в Docker)
  • version: "3.8" в compose-файле → убрать совсем (ключ устарел, игнорируется)
  • links:networks: (links — устаревший механизм связи)
  • Старые образы: mysql:5.7, postgres:13mysql:8.0, postgres:16

Контекст: почему в лекции старые паттерны

Лекция написана в период активного перехода с Docker Compose v1 (отдельный Python-инструмент docker-compose) на Docker Compose v2 (плагин Go, встроен в Docker CLI). В примерах из лекции используются:

  • Команда docker-compose (с дефисом) — v1
  • Ключ version: "3" / "3.8" в YAML — был обязателен в v1
  • Директива links: — устаревший способ связи контейнеров
  • Старые версии образов БД

Всё это работало тогда и частично работает сейчас, но в 2024+ году нужно использовать актуальный стиль.

1. Команда: docker-compose vs docker compose

Из лекции (v1, устарело)

# терминал — docker-compose v1

docker-compose up
docker-compose up -d
docker-compose down
docker-compose build
docker-compose logs -f
docker-compose ps
docker-compose exec web bash
docker-compose restart web
Docker Compose v1 (docker-compose) официально устарел с марта 2023 года. В новых версиях Docker Desktop он не установлен.

Современный подход (v2)

# терминал — docker compose v2

docker compose up
docker compose up -d
docker compose down
docker compose build
docker compose logs -f
docker compose ps
docker compose exec web bash
docker compose restart web
Docker Compose v2 — плагин на Go, встроен в Docker CLI. Работает как docker compose (пробел вместо дефиса). Доступен в Docker Desktop и Docker Engine 20.10+.

2. Ключ version: — устарел

Из лекции (устарело)

# docker-compose.yml (лекция)

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
# docker-compose.yml (лекция)

version: '3'

services:
  mediawiki:
    image: mediawiki
    ...
# docker-compose.yml (лекция)

version: '3.3'

services:
  db:
    image: mysql:5.7
    ...

Современный подход

# docker-compose.yml

# Ключ version: убираем полностью
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
Начиная с Compose Specification (2021), ключ version: устарел и игнорируется. Docker Compose v2 поддерживает все возможности без него. Если оставить — появится предупреждение:
WARN[0000] ... "version" is obsolete

4. Версии образов БД

Из лекции (устарело) Современный аналог Примечание
mysql:5.7 mysql:8.0 или mysql:8.4 MySQL 5.7 — EOL октябрь 2023
postgres:13 postgres:16 или postgres:17 PostgreSQL 13 — EOL ноябрь 2025
python:3.9-slim python:3.12-slim Python 3.9 — EOL октябрь 2025
node:18-slim node:20-slim или node:22-slim Node 18 — EOL апрель 2025

5. depends_on: простой vs с condition

Из лекции (неполный подход)

# docker-compose.yml (лекция)

services:
  wordpress:
    depends_on:
      - db         # просто ждёт START контейнера db
Контейнер db может быть «запущен», но MySQL ещё инициализируется. WordPress попробует подключиться и получит ошибку.

Современный подход

# docker-compose.yml

services:
  db:
    image: mysql:8.0
    healthcheck:
      test: ["CMD", "mysqladmin",
             "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

  wordpress:
    depends_on:
      db:
        condition: service_healthy  # ждать готовности
condition: service_healthy требует, чтобы healthcheck БД прошёл перед стартом WordPress. Надёжно.

Итого: полный современный compose-файл

Так выглядит переработанный пример из лекции (nginx + MySQL) в современном стиле:

# docker-compose.yml  (современный стиль, 2024+)
# БЕЗ ключа version:, docker compose v2, актуальные образы

services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro
    networks:
      - appnet
    depends_on:
      db:
        condition: service_healthy

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: mydb
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - appnet
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 30s
      timeout: 5s
      retries: 5

volumes:
  db_data:

networks:
  appnet:
# терминал — запуск в современном стиле
docker compose up -d
docker compose ps
docker compose logs -f db
docker compose down