⚖️ Старый 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:13→mysql: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
3. links: vs networks: для связи контейнеров
Из лекции (устарело)
# docker-compose.yml (лекция)
services:
mediawiki:
image: mediawiki
links:
- database # устаревший способ связи
database:
image: mariadb
links: — устаревший механизм. Добавляет запись в /etc/hosts, но не создаёт изолированную сеть. Не поддерживает DNS-разрешение между произвольными контейнерами.
Современный подход
# docker-compose.yml
services:
mediawiki:
image: mediawiki
networks:
- wikinet # подключаем к общей сети
database:
image: mariadb
networks:
- wikinet
networks:
wikinet:
Все сервисы Compose по умолчанию находятся в одной bridge-сети и видят друг друга по имени сервиса. Явная сеть нужна для изоляции групп сервисов.
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