Коротко: приёмы Docker для локалки: ускорение сборки кэшем слоёв, быстрый вход в контейнер, чистка места, отладка сети и удобные алиасы.

Docker для локалки — это не только «поднять контейнеры». Несколько приёмов делают работу быстрее и убирают типовую боль: ускорение сборки кэшем, быстрый вход в контейнер, чистка занятого места, отладка сети и удобные алиасы. Ниже — то, чем пользуюсь каждый день.

Кэш слоёв: порядок инструкций решает

Docker кэширует слои по порядку. Копируйте сначала файлы зависимостей, потом код — тогда composer install/npm ci не пересобирается при каждом изменении исходника:

COPY composer.json composer.lock ./
RUN composer install --no-scripts --no-autoloader
COPY . .
RUN composer dump-autoload --optimize

Быстрый вход в контейнер

docker compose exec php bash       # шелл внутри сервиса php
docker compose exec -u root php sh # от root, если нужно поставить пакет
docker compose logs -f php         # хвост логов в реальном времени
docker compose exec php php bin/console cache:clear  # выполнить команду разово

Чистка места (Docker любит его съедать)

docker system df                   # сколько занято и чем
docker system prune -f             # убрать висящие образы/контейнеры/сети
docker system prune -a --volumes   # агрессивно: ВСЁ неиспользуемое + тома (осторожно!)
docker builder prune -f            # очистить кэш сборок

Совет: --volumes сносит и неиспользуемые тома — не запускайте бездумно, можно потерять данные локальных БД.

Отладка сети между контейнерами

# посмотреть сети и кто в них
docker network ls
docker network inspect <net>

# проверить, видит ли один сервис другой по имени
docker compose exec php ping db
docker compose exec php getent hosts db

Внутри compose-сети сервисы доступны по имени сервиса (db, redis), а не по localhost — частая ошибка новичков.

Пробросы и порты

  • Конфликт порта на хосте — поменяйте левую часть: "58080:80".
  • Посмотреть проброшенные порты: docker compose ps.
  • Доступ из контейнера к сервису на хосте — host.docker.internal (Linux: добавить extra_hosts: ["host.docker.internal:host-gateway"]).

Bind-mount и права (частая боль на Linux)

Файлы, созданные внутри контейнера (под другим uid), на хосте оказываются «чужими». Решения: запускать процессы под uid хоста (user: "1000:1000" в compose) или прокидывать USER_ID аргументом в Dockerfile. Для var/ кэша на dev часто проще выдать права широко.

Полезные алиасы

alias dc='docker compose'
alias dce='docker compose exec'
alias dcl='docker compose logs -f'
alias dcu='docker compose up -d'
alias dcd='docker compose down'
alias dps='docker compose ps'
# теперь: dce php bash

Производительность на macOS/Windows

  • Тяжёлые bind-mount'ы (vendor, node_modules) тормозят — выносите их в именованные тома или используйте :cached/:delegated.
  • Включите файловую систему VirtioFS (Docker Desktop) — заметно быстрее на маках.

Чистый рестарт одного сервиса

docker compose up -d --build php   # пересобрать и поднять только php
docker compose restart php          # просто перезапустить
docker compose down && docker compose up -d  # полный цикл

Грамотно настроенный локальный Docker экономит часы и убирает «у меня работает». Если хотите выстроить единое dev-окружение и dev↔prod паритет для команды — помогу на консультации или в рамках разработки.