Как ускорить работу Docker на MacBook (MacOS)

Как ускорить работу Docker на MacBook (MacOS)
Photo by Julian Christian Anderson / Unsplash

Эта статья посвящается всем владельцам Macbook и iMac, кто хочет ускорить работу docker volume  на MacOS.

Всем давно известно, что на macos и windows для запуска docker приходится прыгать с бубном вокруг docker-composeHyper-Vdocker-machine. В ubuntu и ему подобных оперативных системах докер работает настолько быстро, что я часто думал запустить в Parallels Ubuntu  для работы.

Проблема

На production среде во всех docker container код приложения зашивается внутрь контейнера, но для dev среды разработки необходимо монтировать свежий код в докер. Это позволяет без пересборки докер контейнеров проверять работу кода.

Но на macos стандартный способ монтирования папок работает крайне медленно, что превращает разработку проектов в ад. Пример docker-compose.yaml с монтирование папки:

services:
  php:
    image: php:fpm
    volumes:
      - ./:/var/www/html

старый docker-compose.yaml

Sebastian Barthel провел исследование по скорости записи в docker volume в Windows 10, CentOS и MacOS и результаты отразил в статье "How to speed up shared file access in Docker for Mac". Если коротко, то в macos запись в docker volume работает в 92 раза медленнее , чем в centos.

Особенно сильно я замечаю это, когда запускаю команду bin/console cache:clear в своем Symfony приложении в Docker, так как сборка нового DI контейнера выполняется 5-10 минут, когда без монтирования папок он выполняется меньше минуты (docker жутко тормозит на macos).

Решение

Опишу вам не единственное решение этой проблемы, но оно наиболее простое для внедрения прямо здесь и сейчас.

Используйте для описания docker volume суффикс :cached.

Для запуска контейнера вместе с volume можно использовать команду:

docker run -v ./:/var/www/html:cached php7.4-fpm-alpine command

В docker-compose.yaml код будет выглядеть так:

services:
  php:
    image: php:fpm
    volumes:
      - ./:/var/www/html:cached

обновленный docker-compose.yaml

К слову, Sebastian Barthel предлагает решать эту проблему через rsync, но это требует доработок контейнера. Я выступаю за подход, когда на дев и прод используются одинаковые контейнеры, то есть production like среда. Это позволяет поймать много ошибок со сборкой уже локально.

Релевантное видео

Если вам интересна тема ускорения Docker на macos, то вам обязательно понравится доклад "PHP в Docker: подводные камни" от Сергей Шамбир. В конце доклада как раз поднимается тема медленной работы докер на макос: