Коротко: приёмы 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 паритет для команды — помогу на консультации или в рамках разработки.


Комментарии